tomcat7集群(session复制)

  • Post author:
  • Post category:其他


tomcat集群的主要方法有三种:

1、采用粘性会话,即某个ip只会访问集群中的某一台机器,这样就可以简单的解决session共享的问题;

2、采用会话共享,目前网上较多的案例是使用memcahed作为共享容器,需要开发以memcahed作为容器的会话管理器,然后配置到tomcat中。

3、采用session复制技术,tomcat本身已支持该功能。

三种方案各有优缺点。第一种存在部分单点问题,如果某台机器崩溃,在此机器的会话将丢失,其他的不受影响;第二种需要额外安装共享容器,如果一台tomcat崩溃,会话仍然可用,但如果会话容器崩溃的话,所有会话都会丢失。对于memcahed,可采用memcached集群方案;第三种方案是tomcat官方介绍的方案,个人感觉只有这个方案真正做到了集群,任何一台tomcat崩溃都不会产生影响,因为是完全备份,这个方案会消耗更多内存和带宽,tomcat官方推荐在集群比较小时采用此方案。

本文介绍第三种方案,参考http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html

在配置文件server.xml

的<Engine>或者<Host>添加如下代码


<Cluster className=”org.apache.catalina.ha.tcp.SimpleTcpCluster”/>


这行配置的默认配置如下:


<Cluster className=”org.apache.catalina.ha.tcp.SimpleTcpCluster”

channelSendOptions=”8″>

<Manager className=”org.apache.catalina.ha.session.DeltaManager”

expireSessionsOnShutdown=”false”

notifyListenersOnReplication=”true”/>

<Channel className=”org.apache.catalina.tribes.group.GroupChannel”>

<Membership className=”org.apache.catalina.tribes.membership.McastService”

address=”228.0.0.4″

port=”45564″

frequency=”500″

dropTime=”3000″/>

<Receiver className=”org.apache.catalina.tribes.transport.nio.NioReceiver”

address=”auto”

port=”4000″

autoBind=”100″

selectorTimeout=”5000″

maxThreads=”6″/>

<Sender className=”org.apache.catalina.tribes.transport.ReplicationTransmitter”>

<Transport className=”org.apache.catalina.tribes.transport.nio.PooledParallelSender”/>

</Sender>

<Interceptor className=”org.apache.catalina.tribes.group.interceptors.TcpFailureDetector”/>

<Interceptor className=”org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor”/>

</Channel>

<Valve className=”org.apache.catalina.ha.tcp.ReplicationValve”

filter=””/>

<Valve className=”org.apache.catalina.ha.session.JvmRouteBinderValve”/>

<Deployer className=”org.apache.catalina.ha.deploy.FarmWarDeployer”

tempDir=”/tmp/war-temp/”

deployDir=”/tmp/war-deploy/”

watchDir=”/tmp/war-listen/”

watchEnabled=”false”/>

<ClusterListener className=”org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener”>

<ClusterListener className=”org.apache.catalina.ha.session.ClusterSessionListener”>

</Cluster>


tomcat集群用的是组播技术,主要需要注意的配置是

Membership和

Receiver。

Membership是组播组,

Receiver是接收方。










228.0.0.4是组播地址,这是一个保留地址,关于组播地址,可以查看相关文档。

port是端口(

可以把


Membership当作服务端,Receiver当作客户端,这样就比较好理解

)。同一个集群下的机器要加入相同的组播组,所以同一个集群下的tomcat的

Membership是一样的。

Receiver是接收组播信息的配置,如果两个tomcat在同一个机器,

Receiver的port要不相同。如果在不同的机器

Receiver的

address最好改成ip,如果使用

auto,他的值很可能是127.0.0.1,这样会导致接收不到消息。














另外,要将


Membership和


Receiver的端口加入到防火墙中,不然也会无法访问















最后项目的web.xml中需加入<distributable/>以支持集群















版权声明:本文为fengwind1原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。