一、准备
下载Jboss 5.1.0, 配置JBOSS_HOME, JAVA_HOME环境变量,并把$JBOSS_HOME/bin添加到PATH环境变量中。本文要在两台服务器——IP分别为10.123.76.103和10.123.76.104——上部署两台Jboss应用服务器。 此外在第三台服务器上安装Apache 2.2服务器,并配置环境变量APACHE_HOME
二、配置
1) 复制依赖包和建立相关目录
cp jboss-5.1.0.GA/server/all/lib/hibernate-jbosscache2.jar $JBOSS_HOME/server/default/lib/ cp jboss-5.1.0.GA/server/all/lib/jbosscache-core.jar $JBOSS_HOME/server/default/lib/ cp jboss-5.1.0.GA/server/all/lib/jbosscache-pojo.jar $JBOSS_HOME/server/default/lib/ cp jboss-5.1.0.GA/server/all/lib/jgroups.jar $JBOSS_HOME/server/default/lib/ cp jboss-5.1.0.GA/server/all/lib/avalon-framework.jar $JBOSS_HOME/server/default/lib/ cp jboss-5.1.0.GA/server/all/lib/jacorb.jar $JBOSS_HOME/server/default/lib/ cp -rf jboss-5.1.0.GA/server/all/deploy/cluster $JBOSS_HOME/server/default/deploy/ mkdir $JBOSS_HOME/server/default/deploy-hasingleton cp jboss-5.1.0.GA/server/all/deploy/quartz-ra.rar $JBOSS_HOME/server/default/deploy/ cp jboss-5.1.0.GA/server/all/deploy/mail-ra.rar $JBOSS_HOME/server/default/deploy/
2) 打开$JBOSS_HOME/server/default/deploy/messaging/messaging-service.xml文件,将
<attribute name="ServerPeerID">${jboss.messaging.ServerPeerID:0}</attribute>
改为
<attribute name="ServerPeerID">${jboss.messaging.ServerPeerID:1}</attribute>
另一台服务器配置改为:
<attribute name="ServerPeerID">${jboss.messaging.ServerPeerID:2}</attribute>
更多服务器也如此设置。需要注意的就是不同服务器节点的这个ServerPeerID数值不能重复.
注:如果messaging文件夹不存在,则先从$JBOSS_HOME/all中拷贝相关的文件
cp -rf jboss-5.1.0.GA/server/all/deploy/messaging $JBOSS_HOME/server/default/deploy/ cp jboss-5.1.0.GA/server/all/deploy/jms-ra.rar $JBOSS_HOME/server/default/deploy/
3) 打开 ${JBOSS_HOME}/server/default/deployers/jbossweb.deployer/META-INF/war-deployers-jboss-beans.xml文件,去掉<property name="useJk">false<property>附近的注释,并改为
<!-- 是否使用mod_jk 连接器 --> <property name="useJK">true</property> <!-- 是否使用粘性session, true表示粘性--> <property name="useSessionPassivation">true</property> <property name="passivationMaxIdleTime">-1</property> <property name="passivationMinIdleTime">-1</property>
注:在这个配置文件中可以修改session的复制模式.详细请参考jboss官方文档
4) 打开需要做集群的Java Web应用的web.xml 文件,在</web-app>之前添加 <distributable/>标记
如果需要对所有的Java Web应用做集群,那么可以在$JBOSS_HOME/server/default/deployers/jbossweb.deployer/web.xml里添加<distributable/>标记
5) 打开$JBOSS_HOME/server/default/deploy/jbossweb.sar/server.xml , 将
<Engine name="jboss.web" defaultHost="localhost">
改为
<Engine name="jboss.web" defaultHost="localhost" jvmRoute="node1">
另一台机器配置改为
<Engine name="jboss.web" defaultHost="localhost" jvmRoute="node2">
此外, 给<Connector protocol ="AJP/1.3">..</Connector>添加属性connectionTimeout="60000"
更多服务器也同样配置。 需要注意,jvmRoute的值不能重复
ps: 如果你在本地部署两台Jboss服务器,你需要修改配置文件 $JBOSS_HOME/server/default/conf/bindingservice.beans/META-INF/bindings-jboss-beans.xml , 让监听的端口错开。
如果希望集群通过指定的IP进行通讯,打开$JBOSS_HOME\server\all\deploy\cluster\jgroups-channelfactory.sar\META-INF\jgroups-channelfactory-stacks.xml, 修改为
<TCPPING timeout="3000" initial_hosts="${192.168.1.104[7810],192.168.1.106[7810]}" port_range="1" num_initial_members="3"/>
其中104是本机Node的ip地址,106是另一个机器Node的ip地址
另一台机器改成:
<TCPPING timeout="3000" initial_hosts="${192.168.1.106[7810],192.168.1.104[7810]}" port_range="1" num_initial_members="3"/>更多的服务器也如是配置
6) 为Apache配置mod_jk连接器
打开$APACHE_HOME/conf/httpd.conf, 添加如下配置:
# mod_jk LoadModule jk_module modules/mod_jk.so # # Configure mod_jk # # JkWorkersFile conf/workers.properties JkMountFile conf/uriworkermap.properties JkLogFile logs/mod_jk.log JkLogLevel warn # JkMount /* loadbalancer
在$APACHE_HOME/conf目录下建立workers.properties文件,内容为:
# 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 and your AJP 1.3 port worker.node1.port=6009 worker.node1.host=10.123.76.103 worker.node1.type=ajp13 worker.node1.lbfactor=1 worker.node1.socket_timeout=60 worker.node1.connection_pool_timeout=60 worker.node1.ping_mode=A worker.node1.ping_timeout=20000 worker.node1.connect_timeout=20000 # Define Node2 # modify the host as your host IP or DNS name and your AJP 1.3 port worker.node2.port=7009 worker.node2.host=10.123.76.104 worker.node2.type=ajp13 worker.node2.lbfactor=1 worker.node2.socket_timeout=60 worker.node2.connection_pool_timeout=60 worker.node2.ping_mode=A worker.node2.ping_timeout=20000 worker.node2.connect_timeout=20000 # Load-balancing behaviour worker.loadbalancer.type=lb worker.loadbalancer.balance_workers=node1,node2 worker.loadbalancer.sticky_session=true worker.loadbalancer.sticky_session_force=false # Status worker for managing load balancer worker.status.type=status
注意: jboss服务器的IP和连接端口必须与jbo中的声明一致.
在$APACHE_HOME/conf 目录下创建uriworkermap.properties,内容为:
# 可以将一些静态资源(比如gif,jpg,css文件等) 放在apache的发布目录下,这样当客户端需要获取这些资源时,无需到jboss服务器拿,从而提高响应速度,减轻jboss应用服务器的压力 !/*.gif=loadbalancer !/*.jpg=loadbalancer !/*.png=loadbalancer !/*.css=loadbalancer !/*.js=loadbalancer !/*.htm=loadbalancer !/*.html=loadbalancer !/*.ico=loadbalancer /*=loadbalancer
三、测试
编写一个jsp页面,该jsp页面会在session中记录每个浏览器访问该页面的次数。通过访问两台jboss应用服务器来检查session有没有被复制, 并尝试通过apache前端服务器进行访问
后记
如果sticky_session的值为true,就表示会话具有“粘性”。“粘性”意味着当用户通过浏览器A与jboss 1开始了一个会话后,以后用户从浏览器A中发出的请求只要处于同一个会话中,负载平衡器就会始终让 Tomcat 1 来处理请求。直观地理解,可以认为一个会话始终与集群系统中的一个Jboss服务器"粘"在一起。当sticky_session的值为 true 时,集群系统不会进行会话复制。如果希望集群系统能进行会话复制,从而使得一个浏览器能与多个 Tomcat 服务器展开同一个会话,则应该把 sticky_session设为false(同时把 ${JBOSS_HOME}\server\default\deployers\jbossweb.deployer\META-INF\war-deployers-jboss-beans.xml中的useSessionPassivation属性设置为false )。sticky_session的默认值为true。
当sticky_session设为false时,sticky_session_force对集群系统没有什么影响,通常可以把它设为默认值 false。当 sticky_session 设为 true 时,则建议把sticky_session_force也设为true。
另外,粘性session的配置实际上比较消耗资源,不过某些要求稳定性十分高的系统,就必须这么做,而且远远要比以上的纠错措施严格得多,银行系统尤为明显!通常客户使用银行客户端的时候总是抱怨处理太慢了,确实是牺牲了速度、资源,维持了稳定、可靠、安全。
假定sticky_session设为true,当浏览器已经与集群系统中的Jboss 1服务器“粘”在一起,展开了会话后,如果这个Jboss 1服务器由于异常而终止,此时会出现什么情况呢?如果sticky_session_force为true,那么服务器端会向客户端返回状态代码为500的错误。如果 sticky_session_force 为 false,那么负载平衡器会把请求转发给集群系统中的其他Jboss 2服务器,假如在Jboss 2服务器中不存在同一个会话的信息,则当Web组件试图访问会话中的有关数据时可能会导致异常。
参考资料:http://suhuanzheng7784877.iteye.com/blog/968913