Tomcatセッションレプリケーションメモ

ローリングアップグレードの手段としてセッションレプリケーションを試してみます。レプリケーションができていればWARの更新時にワーカーを順番に再起動してもサービスは無停止でアップグレードできるはずです。

  • Apache 2.2.25
  • Tomcat 6.0.35

ローカルに2台のTomcatを立ち上げ、1台のApacheから割り振る方法をやってみます。

Apacheの設定

  • httpd.conf
    ProxyPass /scone/ balancer://workergroup/
    <Proxy balancer://workergroup>
            BalancerMember ajp://localhost:8009/scone/ ping=500ms retry=10
            BalancerMember ajp://localhost:18009/scone/ ping=500ms retry=10
            ProxySet lbmethod=bybusyness
    </Proxy>

Tomcatの設定

  • 2台のTomcatのアプリケーションのContextにdistributableを追加します。
    <Context path="/scone" reloadable="false" distributable="true">
  • server.xmlのHost要素に以下を追加しました。
    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="6">
      <Manager className="org.apache.catalina.ha.session.DeltaManager"
            expireSessionsOnShutdown="false"
            notifyListenersOnReplication="true"
            mapSendOptions="6"/>
       <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="localhost"
                         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=""/>
       <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
       <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>

Managerで設定したDeltaManagerはAll-to-Allのレプリケーションになるそうです。他にBackupManagerという1台に複製を送信するマネージャーがあるそうです。

今回はレプリケーションするTomcat2台ともローカルホストなので、Receiverで使うポートが2台で競合しないようにします。

    <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                    address="localhost"
                    port="5001"
                    selectorTimeout="100"
                    maxThreads="6"/>

テスト

Apache、Tomcat2台を立ち上げ、ブラウザで接続してみます。ワーカーを1台止めても、即座に切り替わる様子が実験できました。再び落としたワーカーを立ち上げ、別の方を止めても大丈夫。これはすごい!これならジオンはあと10年は戦える。



[ 編集 | 凍結 | 差分 | 添付 | 複製 | 名前変更 | リロード ]   [ 新規 | 一覧 | 単語検索 | 最終更新 | ヘルプ ]
Last-modified: 2013-09-04 (水) 00:59:19 (3886d)