
HAProxy ロードバランサーと 2 つの Tomcat バックエンド サーバーがあります。HAProxy は Cookie ベースの永続性で設定され、Tomcat はドキュメントに従って SimpleTcpCluster で設定されています。両方の Tomcat バックエンド サーバー間のマルチキャストは有効になっています。ただし、セッション レプリケーションは機能しません。セッションを保持しているサーバーをシャットダウンするたびに、ユーザーはログアウトされます。catalina.out では、たとえば 1 つのバックエンドを停止すると、サーバーが相互に通信していることがわかります。
2014 年 5 月 8 日 11:00:25 AM org.apache.catalina.tribes.group.interceptors.TcpFailureDetector performBasicCheck INFO: 疑わしいメンバー、死亡が確認されました。[org.apache.catalina.tribes.membership.MemberImpl[tcp://{10, 2, 1, 69}:5000,{10, 2, 1, 69},5000, alive=931801,id={-18 123 59 -88 -95 20 78 -34 -83 31 -43 73 -64 -71 42 -62 }, payload={}, command={}, domain={}, ]]
また、バックエンドを起動すると:
警告: マネージャー [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 }, payload={}, command={}, domain={}, ] にセッション状態を要求しています。60 秒以内にセッション状態が受信されない場合、この操作はタイムアウトになります。 2014 年 5 月 8 日 10:54:21 AM org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor レポート INFO: 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 INFO: Manager [webservice#]; セッション状態は 5/8/14 午前 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>
ユーザーがログインすると、セッションが有効である限り、ユーザーは 1 つのバックエンド サーバーに固定されるため、Cookie の永続性が機能していることがわかります。ただし、セッションを保持しているサーバーをシャットダウンすると、他のサーバーがそれを認識したというログ ファイルがあるにもかかわらず、ユーザーは追い出されます。
また、web.xml には配布可能な要素が設定されています。
何か案は?
ありがとう
答え1
提供された構成に問題は見当たりません。いくつか提案があります。
マネージャー(http://node01:80/manager/html) をクリックし、他のノードのマネージャーで各セッションを表示します。
ノード損失によってセッションが終了しないはずなので、レプリケーションが行われていないと思われます。
ポート: 5000、マルチキャスト アドレス: 228.0.0.4 のファイアウォール ルールを確認してください。
ファイアウォールの設定でほとんどの問題が発生しました。