Tomcat --集羣原理

參考以下兩篇文章
http://zyycaesar.iteye.com/blog/296606
http://blog.csdn.net/liu251890347/article/details/38237911css

tomcat集羣原理
對於web集羣而言,最大的難點就是集羣中多個節點之間數據保持一致,(Session)就是這些數據中比較重要的。目前實現各個節點之間數據一致有兩種方式:
1.將全部的session數據放到一臺服務器或數據庫中,集羣中全部的節點經過訪問這臺session服務器來獲取數據。
2.集羣中全部的節點之間進行session數據的同步複製,任何一個節點都保存了全部的session數據。
兩種方式優缺點
方式一:簡單、易於實現,可是存放session的服務器發生故障的話會致使整個系統不能正常工做。
方式二:可靠性比較高,任何一個節點的故障都不會對整個系統形成影響,所以,技術上實現起來更加複雜。前端

以下介紹tomcat集羣配置
1.在tomcat的server.xml中配置web

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

若是採用簡易配置,則許多配置細節都會被省略掉,功能同樣實現了。
以下詳細介紹下完整的配置信息,該部份內容是我參考別人理解,閱者請本身對照的官網查看理解。
1.<Cluster,tomcat集羣中各個節點經過創建tcp連接來實現session複製,複製有同步與異步兩種模式。
同步模式:客戶端的響應必須在session拷貝到其它節點完成後進行。
異步模式:無需等待session拷貝完就能夠響應。
很明顯,異步模式效率比較高,同步模式可靠性高。模式是由<Cluster中的channelSendOptions參數決定的,默認是8(異步模式),4是同步模式。
2.<Manager,它是用來在節點中拷貝session,默認使用DeltaManager,DeltaManager採用的是all-to-all的工做方式,即集羣中的當前節點會把session數據向其它全部的節點拷貝(不管其它節點是否部署了當前應用)。
3.<Channel負責對tomcat集羣的io層進行配置。
4.<Membership用於發現集羣中其它節點。這裏的address用的是組播地址,使用同一個組播地址和端口的多個節點同屬於一個子集羣,所以經過自定義組播地址和端口就能夠實現一個大的集羣(該集羣包含多個子集羣)。
5.<Receiver,用於各個節點接收其它節點發送的數據。
6.<Sender,用於各個節點向其它節點發送數據,具體的是經過<Transport節點實現。PooledParallelSender是從tcp鏈接池中獲取鏈接,能夠並行發送,即集羣中多個子節點能夠同時向其它全部節點發送數據而互不影響。
7.<Interceptor,起到一個閥門的做用,在數據到達目的節點前進行檢測或其它操做,例如:TcpFailureDetector用於檢測數據在傳輸過程當中是否發生了tcp錯誤。
8.<Valve,用於在節點向客戶端響應前進行檢測或進行某些操做,ReplicationValve用於檢測當前的響應是否涉及session數據的更新,若是是,則啓動session拷貝操做,filter用於過濾請求,如對客戶端的圖片、css、js的請求就不會涉及到session。所以,這裏不須要檢測,默認狀況下不進行過濾,檢測全部的響應。JvmRouteBinderValve會在前端的apache mod_jk發生錯誤時,保證同一客戶端的請求發送到集羣的同一節點。
9.<Deployer,用於集羣的farm功能,監控應用中文件的更新,以保證集羣中全部全部節點應用的一致性,例如:若是某個用戶上傳文件到集羣中某個節點的應用程序目錄下,Deployer會檢測到這一操做並將這個文件拷貝到集羣中其它節點相同應用對應的目錄下,並保持全部的應用一致。
10.<ClusterListener,用於監聽集羣中節點發出和收到的數據。

參考這篇文章 http://zhidao.baidu.com/link?url=nyTOhjMIBK1QhBpnHkTEKZlQvLimDd_HbEoufEMYnrH4uK6cjvEI3_sIoMRi8pLrjIDxClu-cHS9wToS1lRyfB_ZEUp5PlGJIDvRDT2Dfqapache

mod_jk插件的負載均衡器根據在worker.properties中配置lbfactor(負載均衡因素),負責爲集羣系統中的tomcat服務器分配工做負荷,以實現負載均衡,每一個tomcat之間用集羣管理器(SimpleTcpCluster)進行通訊,以實現session同步。tomcat

相關文章
相關標籤/搜索