本次實驗使用的tomcat版本為apache-tomcat-7.0.73。
一、拷貝兩份tomcat文件,注意端口號的修改。
二、修改每個tomcat下server.xml配置文件的<Engine></Engine>中加入如下配置(此配置也是tomcat配置集群的默認配置):
<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="/temp/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是配置在同一台機器上的,那么<Receiver/>節點中用於監聽傳遞消息的TCP端口號即屬性port不能配置相同,配置范圍是4000-4100。
三、在項目的web.xml文件中配置<distributable/>,然后就可以運行測試了。
四、集群配置屬性詳解
- <Cluster/>是tomcat集群配置節點
-
- className:tomcat集群之間實現信息傳遞所使用的類。
- channelSendOptions:值可以設置為2、4、8、10,數字代表含義如下:
2:Channel.SEND_OPTIONS_USE_ACK(確認發送)
4:Channel.SEND_OPTIONS_SYNCHRONIZED_ACK(同步發送)
8:Channel.SEND_OPTIONS_ASYNCHRONOUS(異步發送)
在異步模式下,可以通過加上確認發送(Acknowledge)來提高可靠性,此時可將channelSendOptions設為10。
- <Manager/>配置為如何管理集群的Session信息,tomcat提供了兩種管理器:
BackupManager:集群下產生的所有Session都將放到一個備份節點,集群下的所有節點都可以訪問此備份節點,每個節點部署的應用可以不一樣。
DeltaManager:集群下某個節點創建、改動的Session,都將復制到其他節點,每個節點部署的應用要一樣。這個管理器是tomcat默認的集群配置,適用於一般的小型集群。
-
- className:集群管理器
- expireSessionsOnShutdown:設置為true時,一個節點關閉,將導致集群下的所有Session失效
- notifyListenersOnReplication:集群下節點間的Session復制、刪除操作,是否通知session listeners
- maxInactiveInterval:集群下Session的有效時間(單位:s),集群內不活動的Session,將被Tomcat回收。默認值為1800(30min)
- <Channel/>是tomcat集群之間進行通訊的工具,主要包括五個組件:Membership、Receiver、Sender、Transport、Interceptor。
- <Membership/>維護集群的可用節點列表。它可以檢查到新增的節點,也可以檢查到沒有心跳的節點
- className:指定Membership維護類
- address:廣播地址
- port:廣播端口
- frequency:發送心跳(向廣播地址發送UDP數據包)的時間間隔(單位:ms)。默認值為500
- dropTime:Membership在dropTime(單位:ms)內未收到某一節點的心跳,則將該節點從可用節點列表刪除。默認值為3000
- <Receiver/>配置消息接收器,負責接收消息,接收器分為兩種:BioReceiver(阻塞式)、NioReceiver(非阻塞式)
- className:指定Receiver使用的類
- address:接收消息的地址
- port:接收消息的端口
- autoBind:端口的變化區間,如果port為4000,autoBind為100,接收器將在4000-4099間取一個端口,進行監聽
- selectorTimeout:NioReceiver內輪詢的超時時間
- maxThreads:線程池的最大線程數
- <Sender/>配置消息發送器,負責發送消息
- <Transport/>分為兩種:bio.PooledMultiSender(阻塞式)、nio.PooledParallelSender(非阻塞式)
- <Interceptor/>配置Cluster的攔截器
- TcpFailureDetector:網絡、系統比較繁忙時,Membership可能無法及時更新可用節點列表,此時TcpFailureDetector可以攔截到某個節點關閉的信息,並嘗試通過TCP連接到此節點,以確保此節點真正關閉,從而更新集群可以用節點列表。
- MessageDispatch15Interceptor:查看Cluster組件發送消息的方式是否設置為Channel.SEND_OPTIONS_ASYNCHRONOUS(Cluster標簽下的channelSendOptions為8時)。設置為Channel.SEND_OPTIONS_ASYNCHRONOUS時,MessageDispatch15Interceptor先將等待發送的消息進行排隊,然后將排好隊的消息轉給Sender。
- <Membership/>維護集群的可用節點列表。它可以檢查到新增的節點,也可以檢查到沒有心跳的節點
- <Valve/>可以理解為Tomcat的攔截器
- ReplicationValve:在處理請求前后打日志;過濾不涉及Session變化的請求
- JvmRouteBinderValve:Apache的mod_jk發生錯誤時,保證同一客戶端的請求發送到集群的同一個節點
- <Deployer/>同步集群下所有節點的一致性
- <ClusterListener/>監聽器,監聽Cluster組件接收的消息,使用DeltaManager時,Cluster接收的信息通過ClusterSessionListener傳遞給DeltaManager