1.5 HTTP服务
HTTP会话复制被用来复制状态在你的web客户端和集群的及其他节点. 因此, 当节点中的一个崩溃的时, 集群中的其他节点将可以恢复。要实现这个目的,必须执行两个步骤:
u
会话状态复制
u
请求负载均衡
状态复制由JBoss直接控制。当你使用all配置启动JBoss的时候,默认激活会话状态复制。只需要部署你的web应用程序,会话状态就已经在集群里所有的JBoss实例间进行复制。
但是, 负载平衡是不同的过程, 单凭JBoss自己不能控制,要实现它需要额外的软件支持。
作为一种非常普遍的情况, 我们将示范如何安装Apache和mod_jk. 这个功能也可以通过专门的硬件开关或者路由器(例如思科的LoadDirector)或者一些其他的专业软件执行。
注意:
一个负载平衡器跟踪HTTP请求,依靠会话关联的请求, 发送请求到合适的节点.
这就是所谓的负载平衡的“会话粘贴”: 一旦一个会话在一个节点上被创建,将来每一个请求也将由这个节点处理。使用一个支持“会话粘贴”的负载平衡允许(你规定适当的)不用复制会话,没有会话状态复制的花销:每个查询将总是被同一个节点处理。但是一旦这个节点崩溃, 在这个节点主机上的所有的客户会话状态都将丢失(例如,购物车),大概大部分客户需要登陆进另一个就节点,重新启动一个新的会话。在某些情况, 不复制HTTP会话是可以接受的,因为所有的临界状态被保存到数据库中。在其他的情况, 丢失客户会话状态是无法接受的,在这种情况下,会话状态复制是不得不花销的.
一个负载平衡器跟踪HTTP请求,依靠会话关联的请求, 发送请求到合适的节点.
这就是所谓的负载平衡的“会话粘贴”: 一旦一个会话在一个节点上被创建,将来每一个请求也将由这个节点处理。使用一个支持“会话粘贴”的负载平衡允许(你规定适当的)不用复制会话,没有会话状态复制的花销:每个查询将总是被同一个节点处理。但是一旦这个节点崩溃, 在这个节点主机上的所有的客户会话状态都将丢失(例如,购物车),大概大部分客户需要登陆进另一个就节点,重新启动一个新的会话。在某些情况, 不复制HTTP会话是可以接受的,因为所有的临界状态被保存到数据库中。在其他的情况, 丢失客户会话状态是无法接受的,在这种情况下,会话状态复制是不得不花销的.
众所周知,Apache是一个可以通过模块扩展功能的web服务器。其中的一个模块, mod_jk (最新的是mod_jk2) 是为允许Apache分发请求到Servlet容器而特定设计的。此外, 它也支持在多个Servlet容器里负载平衡HTTP调用,遵循”会话粘贴”, 引起我们关注的是它能做到什么程度。
1.5.1 下载软件
首先
,
确保你已经安装了
Apache.
你可以在
Apache
网站直接下载它,网址是
[url]http://httpd.apache.org/[/url]
.
它的安装是非常直白的,不需要细节配置。
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
二进制版本可以从
[url]http://www.apache.org/dist/jakarta/tomcat-connectors/jk/binaries/[/url]
下载
.
重新命名下载的文件为
mod_jk.so
并
copy
到
APACHE_HOME/modules/
文件夹下
.
1.5.2 配置Apache装载mod_jk
修改
APACHE_HOME/conf/httpd.conf
文件,在文件末尾添加一行:
# Include mod_jk's specific configuration file
Include conf/mod-jk.conf
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>
# 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
# 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
在哪里放置它的日志文件,使用哪个日志级别等等。
1.5.3 在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
# 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, 每一个请求将在node1和node2之间进行负载。但是当一个用户在一个服务节点上创建一个会话的时候,比较好的方式是将用户随后的请求都派发到这个服务节点上处理。这被称作"会话粘贴", 客户总是使用第一个会话创建的节点服务所有随后的请求。否则,用户的会话数据必须在不同的两个节点间进行同步(会话复制, 见5.5, “配置 HTTP会话状态复制”)。激活”会话粘贴”,你需要设置worker.loadbalancer.sticky_session的值为1。
注意:
用一个单独的节点建立non-loadbalanced的正确操作是必须在mod_jk之前引入worker.list=node1。
用一个单独的节点建立non-loadbalanced的正确操作是必须在mod_jk之前引入worker.list=node1。
1.5.4 配置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 >
... ...
</ 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页面 [url]http://wiki.jboss.org/wiki/Wiki.jsp?page=UsingMod_jk1.2WithJBoss[/url].
更多JBoss Tomcat使用mod_jk1.2的最新信息,请查阅JBoss wiki页面 [url]http://wiki.jboss.org/wiki/Wiki.jsp?page=UsingMod_jk1.2WithJBoss[/url].
本文转自xudayu 51CTO博客,原文链接:http://blog.51cto.com/xudayu/67630,如需转载请自行联系原作者