且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

JBoss企业级应用服务平台群集指南(七)第一部分

更新时间:2021-08-08 21:52:04

1.5 HTTP服务

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调用,遵循会话粘贴”, 引起我们关注的是它能做到什么程度。

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.socopyAPACHE_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
 
下一步创建一个名字为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在哪里放置它的日志文件,使用哪个日志级别等等。

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
 
基本上上诉文件配置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。
 

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>
 
    当然集群中的任何一个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].
本文转自xudayu 51CTO博客,原文链接:http://blog.51cto.com/xudayu/67630,如需转载请自行联系原作者