tomcat集羣共享session

本文轉載自csdn博客用戶fengwind1

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/>以支持集羣

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章