
我有 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
我看不出您提供的配置有問題。給你一些建議。
您可以透過進入管理員來確認會話複製到叢集中的每個節點(http://node01:80/manager/html)並在另一個節點的管理員中查看每個會話。
我懷疑您沒有複製,因為節點丟失不應該終止會話。
檢查連接埠的防火牆規則:5000 和多播位址:228.0.0.4
我們遇到的大部分問題都與防火牆配置有關!