如何? 叢集化/Session 複製-doc(cluster-howto.html)__html

來源:互聯網
上載者:User

來源文件連結: http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html 

翻譯日期: 2014年3月19日

翻譯人員: 鐵錨

感受: Tomcat 的這個叢集有很多問題, 所以如果需要做分布式叢集,最好使用無狀態的應用程式,外加緩衝系統。假如改造舊系統,那麼也許可以參考一下。

翻譯如下:

Apache Tomcat 6.0 如何? 叢集化/Session 複製

重要提示

也可以查閱 cluster配置參考文檔.

內容列表
快速設定 Cluster 基礎 概述 叢集資訊 崩潰後綁定會話到容錯移轉節點 配置樣本 叢集架構 運行機制 FAQ
快速設定

只要在 <Engine> 節點 或者 <Host> 節點內部加上下面的代碼即可支援叢集化:

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

上面的配置將開啟 all-to-all session 複製,並通過 DeltaManager 來複製 session 增量. 採用 all-to-all 方式意味著 session 會被複製到此叢集中其他的所有節點. 對於很小的叢集,這種方式很適用, 但我們不推薦在較大的叢集中使用(有很多 tomcat 節點的情況,譯者注: 例如,幾十個節點及以上...). 另外,使用 delta 增量管理器時,即使 某些節點沒有部署應用程式,也會複製 session 到所有節點上. 
要在較大的叢集上進行session複製,您需要使用 BackupManager. 此 manager 只複製 session 資料到一個備份節點, 並且只複製到部署了對應應用程式的那些節點. BackupManager的缺點: 經過測試,效能不如 delta manager. 
下面是一些重要的預設值: 
1. 預設的 Multicast (組播)地址是: 228.0.0.4 
2. 預設的 Multicast (組播)連接埠是: 45564 (連接埠號碼和地址組合以後就決定了 cluster 關係,被認為是同一個叢集). 
3. 預設廣播的IP java.net.InetAddress.getLocalHost().getHostAddress() (確保你不是廣播到 127.0.0.1, 這是一個常見的錯誤) 
4. 預設的監聽複製訊息的 TCP 通訊埠是在 4000-4100 範圍內第一個可用的server socket。 
5. 配置了兩個監聽器: ClusterSessionListener 和 JvmRouteSessionIDBinderListener 
6. 配置了兩個攔截器: TcpFailureDetector 和 MessageDispatch15Interceptor 
下面是預設 cluster 配置資訊的完整列表(效果和上面只配置一行是一樣的): 

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

本文稍後將詳細介紹此節的資訊.

Cluster 基礎

要在 Tomcat 6.0 容器中執行 session 複製, 需要完成下列步驟: 所有存放到 session attributes 中的對象必須實現 java.io.Serializable 介面 將 server.xml 中的 Cluster 元素取消注釋(或者加上此元素) If you have defined custom cluster valves, make sure you have the ReplicationValve defined as well under the Cluster element in server.xml 如果多個 Tomcat 執行個體是運行在同一台機器上, 確保 tcpListenPort 屬性對每個執行個體都是唯一的, 在大多數情況下 Tomcat 會自己解決這個問題(如果沒指定的話),通過 自動檢測 4000-4100 範圍內的可用連接埠號碼. 確保在項目的 web.xml 檔案中 web-app 根節點內加上 <distributable/> 元素 如果使用 mod_jk, 請確保在 Engine 節點上設定了 jvmRoute 屬性 < Engine name="Catalina" jvmRoute="node01"> ,並且 jvmRoute 屬性值與 workers.properties 中的 worker name 對應 確保所有的節點有相同的時間,並都採用 NTP 服務來同步! 確保 loadbalancer 負載平衡器配置了 sticky session 模式.

負載平衡可以通過多種方式實現, 可以參考 Load Balancing 文檔.

注意: 請記住在Java中 session 狀態是通過一個 cookie 來跟蹤的, 所以用戶端看到的 URL 必須是一致的(host,port), 否則就會建立一個新的 session.

注意: 當前要支援 Clustering 需要 JDK 版本號碼 1.5 或更高.

Cluster 模組使用的是 Tomcat JULI 日誌架構, 因此你可以通過常規的 logging.properties 檔案來配置. 要列印日誌跟蹤資訊, 可以通過 key: org.apache.catalina.tribes.MESSAGES 來啟用日誌功能.

概述

要在Tomcat中啟用 session 複製, 下面的3種不同的途徑都可以達成同樣的目的: 使用 session 持久化, 並儲存session到一個共用的檔案系統中 (PersistenceManager + FileStore) 使用 session 持久化, 並儲存session到一個共用資料庫中 (PersistenceManager + JDBCStore) 使用 記憶體複製(in-memory-replication), 通過 Tomcat 6 附帶的 SimpleTcpCluster (lib/catalina-tribes.jar + lib/catalina-ha.jar)

在這個版本的 session 複製中, Tomcat 可以通過 DeltaManager來進行 all-to-all 方式的session複製, 也可以通過 BackupManager 將session備份複製到單個節點. all-to-all 複製演算法只在叢集很小時具有高效率. 對較大的叢集, 可以使用 主備會話複製(primary-secondary session replication), 只需要簡單地配置 BackupManager 即可將會話資訊複製到備份節點. 
那麼現在你可以使用domain worker 屬性 (要求 mod_jk > 1.2.8) 通過DeltaManager來構建叢集分區的可伸縮叢集解決方案 (為此需要佈建網域名攔截器[domain interceptor]). 為了在一個 all-to-all 環境中降低複製所消耗的網路流量, 可以將叢集切分為更小的組. 通過為不同 group 使用不同的組播地址(multicast addresses)這可以很容易地實現. 一個很簡單的叢集配置如下所示:

           DNS 輪詢               |         Load Balancer          /           \      Cluster1      Cluster2      /     \        /     \  Tomcat1 Tomcat2  Tomcat3 Tomcat4

需要鄭重指出的是, 會話複製(session replication) 只是叢集化的起步. 另一個用於實現叢集的流行概念是farming, 例如, 你只需要部署 app 到一台伺服器上, 則叢集會自動將此部署分發到整個叢集中.這是所有可以和 FarmWarDeployer 一起使用的功能(參見server.xml 中的叢集樣本 )

下一節將深入講解會話複製(session replication )的工作原理,以及如何配置它.

叢集資訊

叢集關係是通過廣播心跳包來建立的. 因此,如果想要細分叢集,可以通過改變組播IP地址或 <Membership>元素中的連接埠號碼來實現.

心跳包括Tomcat節點的IP地址以及Tomcat監聽複製通訊的TCP連接埠號碼. 所有資料交換使用的都是在TCP協議.

參數 ReplicationValve 用來決定何時請求完成,何時對複製進行初始化, 如果 session 改變了(通過調用 session 的 setAttribute 或 removeAttribute 方法),才會複製那部分資料.

最重要的注意事項之一就是同步和非同步複製的效能對比. 在同步複製模式下請求不會立刻返回,需要等待覆制的session被發送到叢集中的其他所有節點,並處理完成後才會返回. Synchronous(同步) vs. asynchronous(非同步) 通過 channelSendOptions 標誌進行配置,類型為整數型. SimpleTcpCluster/DeltaManager 的預設值都是 8, 也就是非同步(asynchronous). 更多資訊請參考 send flag(overview) 或者 send flag(javadoc). 在非同步複製期間, 在資料被複製之前,用戶端請求就已經返還了. 非同步複製擁有更短的回應時間, 而同步複製則保證 session 資訊在請求返回之前被複製.

崩潰後綁定會話到容錯移轉節點

如果你使用了 mod_jk 卻沒有使用 sticky sessions 或由於某些原因 sticky session 沒有生效, 或者只是簡單的容錯移轉, 則 session id 需要被修改,因為其中包含了原來 tomcat 的 worker id (在Engine 元素中通過jvmRoute 定義). 要解決這個問題, 將要使用到 JvmRouteBinderValve.

The JvmRouteBinderValve 重寫 session id 以確保在容錯移轉後,下一個請求仍然是粘連的 (並不會因為 worker 的不可用就被回退到其他的隨機節點). 該 valve(閥門) 將會重寫 cookie中的 JSESSIONID 值,當然,使用的是同樣的名字(name). 假如沒有正確地設定 valve, 將使 mod_jk 模組在失敗後很難保持會話的粘連。

如果沒有配置閥門(valves),會添加預設的 JvmRouteBinderValve, 同時會添加名為 JvmRouteSessionIDBinderListener 的叢集訊息接聽程式(listener),以用來在容錯移轉發生時執行重寫 session id 到叢集中的其他節點。 記住,如果你在 server.xml 中添加自訂的閥門和監聽器, 則預設設定就不再生效,請確保添加了所有和預設設定相容替換的閥門和監聽器。

提示: 
通過屬性 sessionIdAttribute 可以更改包括舊 session id 的請求屬性名稱。 預設屬性名為org.apache.catalina.cluster.session.JvmRouteOrignalSessionID。

技巧: 
您也可以在刪除一個節點之前通過 JMX 啟用 mod_jk 的轉移模式 到所有備份節點! 備份節點上在所有的 JvmRouteBinderValve 備份節點上設定 enable為 true, 禁用mod_jk 的 worker, 然後刪除節點並重啟!然後再次啟用mod_jk Worker 和禁用JvmRouteBinderValves。這個用法意味著只有請求會話被遷移。

配置樣本
        <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;.*\.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>    

我們一項項地來解讀!!

        <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"                 channelSendOptions="6">    

Cluster是主要的元素,所有叢集相關的詳細配置都包含在元素內部. SimpleTcpCluster類或調用 SimpleTcpCluster.send 方法發送的每個訊息, 都會附加上 channelSendOptions 這麼一個標誌. 關於發送標誌的詳細描述資訊可以參考 Tomcat 官方 javadoc . DeltaManager 調用 SimpleTcpCluster.send 方法來發送訊息, 而 backup manager 則自己直接通過channel來發送. 
想要瞭解更多資訊, 請訪問 叢集配置參考文檔

<

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.