技术方案 1 :采用 Nginx Session Sticky 的方式实现。需要安装 nginx 扩展模块nginx_upstream_jvm_route.
技术方案 2 :采用 jboss replicaton (jboss session 复制方式 ) ,需要进行 JBoss 相应配置文件的配置 .
最终我们选择的是采用session复制的方式,虽然需要牺牲一些服务器的性能,保证我们的服务能够高可行性( High Availability)。即使其中一台Jboss服务器宕机了,用户访问的时候也不会造成session的丢失,但如果jboss集群中服务器的数量太多,就会造成session复制的成本过高,就不适合采用这种方式了。
1.安装Jboss4.2.2
unzip jboss4.2.2.GA.zip
cp –a jboss4.2.2.GA /usr/local/
#JBOSS默认只能本机访问,修改server.xml使它支持所有网络访问
vi $jboss/server/default/deploy/jboss-web.deployer\server.xml ($jboss表示你jboss的目录,下同)
修改
<Connector port="8080" address="${jboss.bind.address}"
为
<Connector port="8080" address="0.0.0.0" >
修改(不用AJP协议的话不用修改)
<Connector port="8009" address="${jboss.bind.address}" protocol="AJP/1.3"
为
<Connector port="8009" address="0.0.0.0" protocol="AJP/1.3"
#启动测试jboss
/$boss/bin/run.sh
#打开IE测试
2.配置Jboss Session复制的配置
1)修改$JBOSSE/server/default/deploy/jboss-web.deployer/server.xml文件,将Engine 修改如下:
<Engine name="jboss.web" defaultHost="localhost">
给它增加一个jvmRoute属性:
<Engine name="jboss.web" defaultHost="localhost" jvmRoute="node1">
2)修改 $JBOSS_HOME/server/default/deploy/ jboss-web.deployer /META-INF/jbossservice.xml 找到<attribute name="UseJK">该为:
<attribute name="UseJK">true</attribute>
3)在$jboss\server\default\deploy\jboss-web-cluster.sar\META-INF\jboss-service.xml
下面要做的是基于request的cluster,也就让各个节点之间互相复制session状态。有两种复制模式,同步与异步。使用同步的方式,jboss会把session复制的操作和对request的响应放到一个应用事务(application transaction),session复制完成后才去处理request。异步复制则发送session复制的消息后马上处理request,session复制则会稍有延迟。但是在多框架的web页面中,这样的集群方式会有问题。由于frame在同一时间发出多个request,会造成一些混乱,这也是采用基于用户的集群方式的原因之一。
<attribute name="CacheMode">REPL_ASYNC</attribute>
REPL_ASYNC(异步)或者REPL_SYNC(同步)。
<attribute name="ClusterName"> 这个属性是设置你的集群的名字
在下面还有个<attribute name="ClusterConfig"> 这个属性是设置每个节点在进行session复制的时候是如何通信的,有TCP和UDP两种。如果使用udp方式,那么应该将udp的lookback属性指定为true。采用UDP方式问题比较多,所以采用TCP方式,应该指定bind_addr的值为本机ip,并且在TCPPING标签的initial_hosts属性中列出所有节点,格式是”机器名[端口号]”,将<TCP>到</TCP>标签内的全部down_thread和up_thread的false都改为true。还需要注释掉<!--<config><udp>...</udp></config>-->。
<config> ( 在config之前有个注释符号<!--把他去掉,在config最后也有个 -->也去掉)
<TCP bind_addr="192.168.200.17" start_port="7810" loopback="true"/>
<TCPPING initial_hosts="192.168.200.17[7810],192.168.200.18[7810]" port_range="3" timeout="3500"
num_initial_members="3" up_thread="true" down_thread="true"/>
<MERGE2 min_interval="5000" max_interval="10000"/>
<FD shun="true" timeout="2500" max_tries="5" up_thread="true" down_thread="true" />
<VERIFY_SUSPECT timeout="1500" down_thread="true" up_thread="true" />
<pbcast.NAKACK down_thread="true" up_thread="true" gc_lag="100"
retransmit_timeout="3000"/>
<pbcast.STABLE desired_avg_gossip="20000" down_thread="true" up_thread="true" />
<pbcast.GMS join_timeout="5000" join_retry_timeout="2000" shun="false"
print_local_addr="true" down_thread="true" up_thread="true"/>
<pbcast.STATE_TRANSFER up_thread="true" down_thread="true"/>
</config>
4)在项目工程中WEB-INF中web.xml文件,添加内容如下
在<web-app>紧跟着下面添加 <distributable/>
5)在WEB-INF中添加jboss-web.xml文件,内容如下
<jboss-web>
<context-root>/</context-root>
<replication-config>
<replication-trigger>SET_AND_NON_PRIMITIVE_GET</replication-trigger>
<replication-granularity>SESSION</replication-granularity>
<replication-field-batch-mode>true</replication-field-batch-mode>
</replication-config>
</jboss-web>
6)配置default目录,让该目录支持集群
将如下文件从%JBoss_Home%\server\all\lib里面拷到%JBoss_Home%\server\default\lib目录下:
jbossha.jar(加载org.jboss.ha.framework.server.ClusterPartition)
jgroups.jar(JBoss集群底层通信协议)
jboss-cache-jdk50.jar(加载org.jboss.cache.aop.TreeCacheAop)
将如下文件从%JBoss_Home%\server\all\deploy里面拷到%JBoss_Home%\server\default\deploy目录下:
deploy.last
jboss-web-cluster.sar
cluster-service.xml
以上为服务器上的配置
----------------------------------
另一台服务器配置要点:
1)增加node2节点:
deploy\jboss-web.deployer目录下的server.xml
<Engine name="jboss.web" defaultHost = "localhost">
改为
<Engine name="jboss.web" defaultHost= "localhost" jvmRoute="node2">。
2)配置Jboss 集群TCP协议发送数据包
在deploy\jboss-web-cluster.sar\META-INF目录下的jboss-service.xml
<TCP bind_addr = "thishost" start_port = "7810" loopback= "true"…>
改为
<TCP bind_addr = "192.168.200.18" start_port= "7810" loopback="true"…>;
<TCPPING initial_hosts= "thishost[7810], otherhost[7810]" port_range="3"…>
改为
<TCPPING initial_hosts= "192.168.200.18[7810], 192.168.200.17[7810]" port_range="3"…>。
其他配置跟另一台机器保持一致。