一個配置文件:
代碼如下:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="6">
<Manager className="org.apache.catalina.ha.session.BackupManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"
mapSendOptions="6"/>
<!--
<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="5000"
selectorTimeout="100"
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"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt"/>
<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.ClusterSessionListener"/>
</Cluster>
說明如下:
1、Cluster
代碼如下:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="6">
1)Tomcat集群主元素,在這個元素裡面可以配置集群的所有詳細信息
2)className主要的集群類,當前只提供了org.apache.catalina.ha.tcp.SimpleTcpCluste作為實現類
3)channelSendOptionssession發送方式,默認值是8,這個標識確定通過SimpleTcpCluste如何發送消息
4) Channel.SEND_OPTIONS_SYNCHRONIZED_ACK = 0x0004
Channel.SEND_OPTIONS_ASYNCHRONOUS = 0x0008
Channel.SEND_OPTIONS_USE_ACK = 0x0002
如果使用(ASYNCHRONOUS)加(USE_ACK)方式來發送消息,那麼值應該是10(8+2)或者0x000B
如果使用(SYNCHRONIZED_ACK)加(USE_ACK)方式來發送消息,那麼值應該是6(4+2)或者0x0006
2、Manager
代碼如下:
<Manager className="org.apache.catalina.ha.session.BackupManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"
mapSendOptions="6"/>
<!--
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
-->
1)管理tomcat之間的session復制
2)className當前有兩個實現類:org.apache.catalina.ha.session.DeltaManager和org.apache.catalina.ha.session.BackupManager
3)DeltaManager復制並發送Session數據到集群下所有的節點,這個實現類被證明非常可靠、運行得非常好。不過有個局限性就是集群的節點類型要相同,而且要部署相同的應用程序
4)expireSessionsOnShutdown當一個web程序被結束時,tomcat分發銷毀命令到每個Session,並通知所有session listener執行。當集群下某個節點被停止時,如果想銷毀所有節點下的的Session,設置為true,默認為false
5)notifyListenersOnReplication如果設置為true,當session屬性被復制和移動的時候,session listener被通知
3、Channel
代碼如下:
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
Channel是Apache Tribes的主組件,channel管理一組子組件,並和它們一起組成了tomcat實例間的通訊框架。在tomcat集群中,DeltaManager通過SimpleTcpCluster調用channel來實現信息傳遞,而BackupManager自己調用channel以及子組件這些組件來實現信息傳遞。ReplicatedContext也會調用channel傳遞context屬性。
4、Membership
代碼如下:
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
MemberShip組件自動檢索發現集群裡的新節點或已經停止工作的節點,並發出相應的通知。默認使用組播(Multicast)實現。
5、Receiver
代碼如下:
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="5000"
selectorTimeout="100"
maxThreads="6"/>
負責監聽接收其他節點傳送過來的數據。默認使用non-blocking TCP Server sockets。
6、Sender
代碼如下:
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
管理從一個節點發送到另外一個節點的出站連接和數據信息,允許信息並行發送。默認使用TCP Client Sockets。
7、Interceptor
代碼如下:
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
Channel通過Interceptor堆棧進行消息傳遞,在這裡可以自定義消息的發送和接收方式,甚至MemberShip的處理方式。
8、Value
代碼如下:
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt"/>
1)Value在調用Http Request 鏈中起著攔截器的作用,用來決定什麼情況下數據需要被復制。
org.apache.catalina.ha.tcp.ReplicationValve,ReplicationValue在Http Request結尾判斷當前數據是否需要被復制。
2)Filter內容為url或者文件結尾,當訪問鏈接配置filter時,不論實際session有沒有改變,集群會認為session沒有任何變化,從而不會復制和發送改變的session屬性。
9、Deployer
代碼如下:
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
使集群支持farmed deployment
10、ClusterListener
代碼如下:
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
Clusterlistener用來追蹤信息發送和接收。
ClusterSessionListener用來監聽集群組件接收信息,當使用DeltaManager的時候,信息被集群接收,並通過ClusterSessionListener傳遞給Session Manager。