Tomcat集羣和Session複製應用介紹



一個配置文件: 

複製代碼代碼如下:

  <Service name="Catalina">
    <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"  redirectPort="8444" />
    <!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8444" />
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="s183_cn">
 
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
      </Realm>
 
      <Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">
        <Context docBase="/usr/local/source/CN" path="" reloadable="true" />
        <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="224.0.0.0" port="45564" frequency="500" dropTime="3000" />
                        <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="192.168.1.183" port="4004" 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=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt" />
                <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>
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="cn_valve_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
      </Host>
    </Engine>
  </Service>


說明如下: 

1、Service

複製代碼代碼如下:

<Service name="Catalina"> 


1)這裏是一個服務,一個tomcat的容器中,可以包含多個service服務

2) Catalina 這個名字你可以隨便取,但是要唯一

2、Connector 

複製代碼代碼如下:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"  redirectPort="8444" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8444" />


1)一個service 含有多個一個Connector 。 
2)port 代表服務的訪問端口, protocol 代表通過什麼協議訪問服務;第一行很明顯是http服務。第二行是ajp的訪問服務。這種訪問方式可以在內網獲取比較高的併發和穩定性

 

3、Engine 

複製代碼代碼如下:

<Engine name="Catalina" defaultHost="localhost" jvmRoute="s183_cn">


1)jvmRoute 標示這個這個服務的ID。這個是集羣裏面的一個標示 

 

4、Host

複製代碼代碼如下:

<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">


1)一個Engine可以包含多個Host。 

2)name="localhost" 可以幫到一個域名,用於通過不同的域名來訪問不同的服務
3)appBase="webapps" 這個參數用來指示訪問的服務的資源位置(本地資源) 
4) unpackWARs="true" autoDeploy="true" 這個可以顧名思義

 

5、Context

複製代碼代碼如下:
<Context docBase="/usr/local/source/CN" path="" reloadable="true" />


1)Host的上下文
2) docBase="/usr/local/source/CN"  制定資源的位置,這個可以覆蓋app Base的作用。
3)path=""訪問服務的虛擬目錄,我這裏只的是跟目錄。
4)reloadable="true"  顧名思義會自動reload當內容改變的時候 

 

6、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 

 


7、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被通知 

 

 

8、Channel 

複製代碼代碼如下:
<Channel className="org.apache.catalina.tribes.group.GroupChannel"> 


Channel是Apache Tribes的主組件,channel管理一組子組件,並和它們一起組成了tomcat實例間的通訊框架。在tomcat集羣中,DeltaManager通過SimpleTcpCluster調用channel來實現信息傳遞,而BackupManager自己調用channel以及子組件這些組件來實現信息傳遞。ReplicatedContext也會調用channel傳遞context屬性。 

 

 

9、Membership 

複製代碼代碼如下:
<Membership className="org.apache.catalina.tribes.membership.McastService"  address="224.0.0.0" port="45564" frequency="500" dropTime="3000" />


1)MemberShip組件自動檢索發現集羣裏的新節點或已經停止工作的節點,併發出相應的通知。默認使用組播(Multicast)實現。 

2)address="224.0.0.0" 這個廣播地址,你可以隨便配置。不過224.0.0.0 是個比較特殊的廣播地址。在window下面這個廣播地址是默認存在的。如果你再linux平臺下的話,你得自己增加這條路由。 如果你不會的話請參照我的其他文章,裏面有說如何配置路由的


10、Receiver 

複製代碼代碼如下:
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="192.168.1.183" port="4004" autoBind="100" selectorTimeout="5000" maxThreads="6" /> 



1)負責監聽接收其他節點傳送過來的數據。默認使用non-blocking TCP Server sockets。 

2) address="192.168.1.183", 這裏配置你自己機器的ip。 系統默認是address="auto"。這裏老是會使用127.0.0.1 這個ip。所以你還是手工配置好了,不要auto

 


11、Sender 

複製代碼代碼如下:
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> 
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> 
</Sender> 



管理從一個節點發送到另外一個節點的出站連接和數據信息,允許信息並行發送。默認使用TCP Client Sockets。 


12、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的處理方式。 


13、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屬性。 

 


14、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 

這個配置我是放在Host的節點下的。有人會放在Cluster下。

 


15、ClusterListener 

複製代碼代碼如下:

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


Clusterlistener用來追蹤信息發送和接收。 
ClusterSessionListener用來監聽集羣組件接收信息,當使用DeltaManager的時候,信息被集羣接收,並通過ClusterSessionListener傳遞給Session Manager。 


16、valve

複製代碼代碼如下:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="cn_valve_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />


 


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