Tomcat 6 會話複製不適用於 HAProxy

Tomcat 6 會話複製不適用於 HAProxy

我有 HAProxy 負載平衡器和兩台 Tomcat 後端伺服器。 HAProxy 配置了基於 cookie 的持久性,Tomcat 根據文件配置了 SimpleTcpCluster。兩台 Tomcat 後端伺服器之間的多播已啟用。但是會話複製不起作用。每次當我關閉保存會話的伺服器時,使用者都會登出。在 catalina.out 中,我看到伺服器正在相互通信,例如當我關閉一個後端時:

2014 年5 月8 日上午11:00:25 org.apache.catalina.tribes.group.interceptors.TcpFailureDetector PerformBasicship INFO:可疑成員,確認死亡。 /{ 10, 2, 1, 69}:5000,{10, 2, 1, 69},5000, 活著=931801,id={-18 123 59 -88 -95 20 78 -34 -83 31 -43 59 -88 -95 20 78 -34 -83 31 -43 73 -64 -71 42 -62 },有效負載={},指令={},域={},]]

另外,當我啟動後端時:

警告:管理器[webservice#],正在從org.apache.catalina.tribes.membership.MemberImpl[tcp://{10, 2, 1, 69}:5000,{10, 2, 1, 69} 請求會話狀態, 5000、alive=672675、id={-18 123 59 -88 -95 20 78 -34 -83 31 -43 73 -64 -71 42 -62 }、有效負載={}、指令={}、域={} ,]。如果 60 秒內未收到會話狀態,此操作將會逾時。 2014 年5 月8 日上午10:54:21 org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor 報告資訊:ThroughputInterceptor 報告Tx 訊息:1 則訊息已發送:0.00 MB(總計)已發送:0.00 MB(應用程式)時間:0.01秒Tx 速度:0.04 MB/秒(總計) Tx速度:0.04 MB/秒(應用程式) 錯誤訊息:0 Rx 訊息:0 個訊息Rx 速度:0.00 MB/秒(自第1 條訊息起) 已接收:0.00 MB]

2014 年 5 月 8 日上午 10:54:21 org.apache.catalina.ha.session.DeltaManager waitForSendAllSessions 資訊:管理器 [webservice#];會話狀態於 2014 年 5 月 8 日上午 10:54 發送,在 111 毫秒內收到。

因此,叢集和多播正在發揮作用。

這是 HAProxy 後端設定:

backend BE-tomcat_http
mode            http
cookie SERVERID insert indirect nocache
balance         leastconn
timeout connect     30000
timeout server      30000
retries         3
option          httpchk OPTIONS /
option          redispatch
option          http-server-close
option          http-pretend-keepalive
server          node01 10.2.1.69:80 cookie node01 check inter 1000
server          node02 10.2.1.90:80 cookie node02 check inter 1000

這是Tomcat server.xml

    <Engine name="Catalina" defaultHost="localhost" jvmRoute="node01">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>


  <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
                  <Manager className="org.apache.catalina.ha.session.DeltaManager"
                           expireSessionsOnShutdown="false"
                           notifyListenersOnReplication="true"
                           mapSendOptions="8"/>
                  <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="500"
                            minThreads="2"
                            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;"/>
                   <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
                   <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
    <!--           <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                             tempDir="/tmp/war-temp/"
                             deployDir="/tmp/war-deploy/"
                             watchDir="/tmp/war-listen/"
                             watchEnabled="false"/> -->
     </Cluster>

我發現 cookie 持久性有效,因為當使用者登入時,只要會話有效,他們就會一直使用一台後端伺服器。然而,當我關閉保存會話的伺服器時,用戶被踢出,儘管我在日誌檔案中看到其他伺服器注意到了這一點。

web.xml 也有可分發的元素集。

有任何想法嗎?

謝謝

答案1

我看不出您提供的配置有問題。給你一些建議。

  1. 您可以透過進入管理員來確認會話複製到叢集中的每個節點(http://node01:80/manager/html)並在另一個節點的管理員中查看每個會話。

    我懷疑您沒有複製,因為節點丟失不應該終止會話。

  2. 檢查連接埠的防火牆規則:5000 和多播位址:228.0.0.4

    我們遇到的大部分問題都與防火牆配置有關!

相關內容