Tomcat 6 セッションレプリケーションは HAProxy では動作しません

Tomcat 6 セッションレプリケーションは HAProxy では動作しません

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

提供された構成に問題は見当たりません。いくつか提案があります。

  1. マネージャー(http://node01:80/manager/html) をクリックし、他のノードのマネージャーで各セッションを表示します。

    ノード損失によってセッションが終了しないはずなので、レプリケーションが行われていないと思われます。

  2. ポート: 5000、マルチキャスト アドレス: 228.0.0.4 のファイアウォール ルールを確認してください。

    ファイアウォールの設定でほとんどの問題が発生しました。

関連情報