博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JBoss企业级应用服务平台群集指南(七)第一部分
阅读量:7168 次
发布时间:2019-06-29

本文共 6021 字,大约阅读时间需要 20 分钟。

服务

HTTP
会话复制被用来复制状态在你的web客户端和集群的及其他节点因此当节点中的一个崩溃的时集群中的其他节点将可以恢复。要实现这个目的,必须执行两个步骤:
 
u  
会话状态复制
u  
请求负载均衡
 
状态复制由JBoss直接控制。当你使用all配置启动JBoss的时候,默认激活会话状态复制。只需要部署你的web应用程序,会话状态就已经在集群里所有的JBoss实例间进行复制。
 
但是, 负载平衡是不同的过程, 单凭JBoss自己不能控制,要实现它需要额外的软件支持。
作为一种非常普遍的情况我们将示范如何安装Apachemod_jk. 这个功能也可以通过专门的硬件开关或者路由器(例如思科的LoadDirector)或者一些其他的专业软件执行。
注意: 

    
一个负载平衡器跟踪HTTP请求,依靠会话关联的请求, 发送请求到合适的节点. 
    这就是所谓的负载平衡的“会话粘贴”: 一旦一个会话在一个节点上被创建,将来每一个请求也将由这个节点处理。使用一个支持“会话粘贴”的负载平衡允许(你规定适当的)不用复制会话,没有会话状态复制的花销:每个查询将总是被同一个节点处理。但是一旦这个节点崩溃, 在这个节点主机上的所有的客户会话状态都将丢失(例如,购物车),大概大部分客户需要登陆进另一个就节点,重新启动一个新的会话。在某些情况, 不复制HTTP会话是可以接受的,因为所有的临界状态被保存到数据库中。在其他的情况, 丢失客户会话状态是无法接受的,在这种情况下,会话状态复制是不得不花销的
.
 
众所周知,Apache是一个可以通过模块扩展功能的web服务器。其中的一个模块, mod_jk (最新的是mod_jk2) 是为允许Apache分发请求到Servlet容器而特定设计的。此外它也支持在多个Servlet容器里负载平衡HTTP调用,遵循会话粘贴”, 引起我们关注的是它能做到什么程度。

    
首先
确保你已经安装了
Apache. 
你可以在
Apache
网站直接下载它,网址是
它的安装是非常直白的,不需要细节配置。
Apache
存在几个版本
我们推荐您使用
2.0.x
版本
我们认为在下一个章节之前
,
您已经在
APACHE_HOME
文件夹安装了
Apache 
。下一步
下载
mod_jk
模块的二进制版本
存在好几个
mod_jk
版本
我们强烈的建议你使用
mod_jk 1.2.x
版本
同时使用
mod_jk 
和 
mod_jk2
两者是不被赞成的
在社区中并没有支持进一步的开发。
mod_jk 1.2.x 
二进制版本可以从
 
下载
重新命名下载的文件为
mod_jk.so
copy
APACHE_HOME/modules/ 
文件夹下
.

Apache装载mod_jk

    
修改  APACHE_HOME/conf/httpd.conf 
文件,在文件末尾添加一行:
# Include mod_jk's specific configuration file 

Include conf/mod-jk.conf
 
下一步
创建一个名字为 APACHE_HOME/conf/mod-jk.conf
的文件,加入一下内容 :
# Load mod_jk module 

# Specify the filename of the mod_jk lib 

LoadModule jk_module modules/mod_jk.so 


# Where to find workers.properties 

JkWorkersFile conf/workers.properties 


# Where to put jk logs 

JkLogFile logs/mod_jk.log 


# Set the jk log level [debug/error/info] JkLogLevel info 


# Select the log format 

JkLogStampFormat    "[%a %b %d %H:%M:%S %Y]" 


# JkOptions indicates to send SSK KEY SIZE 

JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories 


# JkRequestLogFormat 

JkRequestLogFormat "%w %V %T" 


# Mount your applications 

JkMount /application/* loadbalancer 


# You can use external file for mount points. 

# It will be checked for updates each 60 seconds. 

# The format of the file is: /url=worker 

# /examples/*=loadbalancer 

JkMountFile conf/uriworkermap.properties 


# Add shared memory. 

# This directive is present with 1.2.10 and 

# later versions of mod_jk, and is needed for 

# for load balancing to work properly 

JkShmFile logs/jk.shm 


# Add jkstatus for managing runtime data 

<Location /jkstatus/> JkMount status Order deny,allow Deny from all 

Allow from 127.0.0.1 

</Location>
 
请注意两处非常重要的设置:
  LoadModule指令必须引用你在前面章节下载的mod_jk库。你必须正确的指定在”modules”前缀的路径下的mod_jk模块的名字。
 
  JkMount指令告诉Apache那些URL应该转发给mod_jk模块(轮流的派发给Servlet容器). 在上面的配置文件中所有的基于/application/*路径的请求都会派发给mod_jk模块进行负载平衡。
这样你可以配置Apache服务器静态目录(或者PHP目录),为Java应用程序直接使用负载平衡。如果你只是把mod_jk模块作为一个负载平衡器,那么你可以将所有的URL请求(例如,/*)派发给mod_jk模块。
除了JkMount 指令外,你也可以用JkMountFile指令制定装配一个包含多个URL映射转发的Tomcat的配置文件。你仅仅需要在APACHE_HOME/conf文件夹下创建一个名字为uriworkermap.properties 的文件。文件的格式为 /url=worker_name. 准备复制下面的示例到你创建的文件里:
# Simple worker configuration file 


# Mount the Servlet context to the ajp13 worker 

/jmx-console=loadbalancer 

/jmx-console/*=loadbalancer 

/web-console=loadbalancer 

/web-console/*=loadbalancer
 
上面的示例配置 mod_jk
将派发 /jmx-console 
/web-console 
的请求给 Tomcat
你很可能在 mod_jk.conf
文件中不去改变其他设置。他们过去习惯于告诉 mod_jk
在哪里放置它的日志文件,使用哪个日志级别等等。

mod_jk中配置工作节点

下一步
你需要在 conf/workers.properties 
文件中配置 mod_jk 
工作节点。这个文件用来指明不同 Servlet
容器的位置和怎么在它们中间进行负载平衡。这个配置文件包含了每个目标 servlet
容器项和一个全局项。针对两个节点的设置 ,
参考如下:
# Define list of workers that will be used 

# for mapping requests worker.list=loadbalancer,status 


# Define Node1 

# modify the host as your host IP or DNS name. worker.node1.port=8009 worker.node1.host=node1.mydomain.com worker.node1.type=ajp13 

worker.node1.lbfactor=1 

worker.node1.cachesize=10 


# Define Node2 

# modify the host as your host IP or DNS name. worker.node2.port=8009 

worker.node2.host= node2.mydomain.com worker.node2.type=ajp13 worker.node2.lbfactor=1 worker.node2.cachesize=10 


# Load-balancing behaviour worker.loadbalancer.type=lb worker.loadbalancer.balance_workers=node1,node2 worker.loadbalancer.sticky_session=1 

#worker.list=loadbalancer 


# Status worker for managing load balancer worker.status.type=status
 
基本上上诉文件配置mod_jk 有利的完成在端口8009上监听node1  node2两个servlet容器(JBoss Tomcat)之间用用“会话粘贴”策略轮流(round-robin,循环法)负载平衡。
    
works.properties文件中每一个节点规定使用worker.XXX命名规范,这里的XXX可是任意名字,用来命名你挑选的目标Servlet容器。对于每一工作节点你必须提供Servlet容器中运行的AJP13连接器的主机名称(或者IP地址)和端口号。
    lbfactor 
属性是具体的工作节负载平衡的因素。它被用于决定节点之间负载平衡的优先级(或者轻重。较高的数值,使得该节点将接受更多的HTTP请求。这个配置可以分配请求到不同负载平衡能力的服务器上。
    cachesize 
属性定义关联的Servlet容器的线程池的大小(例如,大量的并发请求被派发到Servlet容器)。确保这个数值没有超过Servlet容器在AJP3连接器配置中的线程数。可以参考在Apache1.3.X中的cachesize属性注释,地址[url]http://jakarta.apache.org/tomcat/connectors-doc/config/workers.html[/url]
Configure JBoss
conf/workers.properties 
文件的最后部分定义负载平衡工作者。唯一要做的是你必须改变 worker.loadbalancer.balanced_workers属性的列表:它必须线性的列出在这个文件中之前定义的所有工作节点:负载平衡将从这些工作者上发生。
    sticky_session 
属性指定集群针对HTTP会话的处理行为。如果你指定 worker.loadbalancer.sticky_session=0, 每一个请求将在node1node2之间进行负载。但是当一个用户在一个服务节点上创建一个会话的时候,比较好的方式是将用户随后的请求都派发到这个服务节点上处理。这被称作"会话粘贴", 客户总是使用第一个会话创建的节点服务所有随后的请求。否则,用户的会话数据必须在不同的两个节点间进行同步(会话复制5.5, “配置 HTTP会话状态复制”)。激活”会话粘贴”,你需要设置worker.loadbalancer.sticky_session的值为1
注意: 

    
用一个单独的节点建立non-loadbalanced的正确操作是必须在mod_jk之前引入worker.list=node1。
 

JBoss

    
最后我们必须在所有的集群节点上配置JBoss Tomcat 实例,因此他们可以指望请求由mod_jk负载平衡转交。
    
每个JBoss集群节点,我们必须根据workers.properties文件中的workers命名规则来命名节点。 例如node1上的JBoss实例,编辑JBOSS_HOME/server/all/deploy/jbossweb-tomcat50.sar/server.xml文件 (如果必要的话用你自己的服务器名字替换掉 /all).。查找<Engine>元素并增加一个jvmRoute属性:
<
Engine 
name
="jboss.web" 
defaultHost
="localhost" 
jvmRoute
="node1"
> 

... ... 

</
Engine
>
 
    当然集群中的任何一个JBoss Tomcat实例,我们需要告诉它增加jvmRoute值到他们的会话cookies中,以便mod_jk可以路由随后的请求。编辑JBOSS_HOME/server/all/deploy/jbossweb-tomcat50.sar/META-INF/jboss-service.xml 文件(用你自己的服务器名字替换掉 /all). 查找名字为UseJK<attribute>元素,并将它的值设为true
<
attribute 
name
="UseJK"
>true
</
attribute
>
 
到这里为止,你已经成功的在你的集群里使用Apache+mod_jk的负载平衡设置,平衡了Servlet容器里的“会话粘贴”(客户永远使用同一servlet容器)
注意: 

    
更多JBoss Tomcat使用mod_jk1.2的最新信息,请查阅JBoss wiki页面 .
本文转自xudayu 51CTO博客,原文链接:http://blog.51cto.com/xudayu/67630,如需转载请自行联系原作者
你可能感兴趣的文章