Top > MyPage
 

tomcatのsession replicationをさわってみた

セッションレプリケーション

ロードバランシングで別々のトムキャットに接続を割り振っていて、そのトムキャットのどれかがダウンしてしまった場合、別のサーバに接続が割り振られるわけだが、そのときにセッションの情報がなければ利用者が作業を継続することが出来ない。

そこで、複数のトムキャットインスタンス間でセッション情報をやり取りする仕組みが必要になる。

今回、参考にしたページ

Tomcatのセットアップ

今回は、ひとつのPCでTomcatを複数起動して試してみた。

使用したTomcatのバージョンは5.5.26である。これを書いている時点で、Tomcat5.5系の最新は5.5.27である。

Tomcatを入手する

最新版は、こちらのApache Tomcatで5.5のダウンロードページに進んで取得することが出来る。

Tomcat 5.5ダウンロードページ

バイナリ配布版のCoreのtar.gzのものを使用した。

server.xml編集

今回は、同一のPCで二つのTomcatを動作させて、SimpleTcpClusterを用いてレプリケーションしたので、競合しないように書き換えた部分があるので、書き換えた部分が多い方を例にとる。

まずは、両方書き換えた部分。

server.xml内を検索してEngineタグを探してほしい。

    <!-- Define the top level container in our container hierarchy -->
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="node1">

デフォルトでは、nameアトリビュートとdefaultHostアトリビュートしかないので、jvmRouteを追加する。この例では、node1という値を設定している。もうひとつのTomcatではnode2という値を設定した。

jvmRouteの値は、同一クラスタになるTomcat間でユニークになるようにすること。

このEngineの要素のHostの要素にClusterというのがある。デフォルトではコメントアウトされているので、アンコメントすること。

        <Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
                 managerClassName="org.apache.catalina.cluster.session.DeltaManager"
                 expireSessionsOnShutdown="false"
                 useDirtyFlag="true"
                 notifyListenersOnReplication="true">

            <Membership 
                className="org.apache.catalina.cluster.mcast.McastService"
                mcastAddr="228.0.0.4"
                mcastPort="45564"
                mcastFrequency="500"
                mcastDropTime="3000"/>

            <Receiver 
                className="org.apache.catalina.cluster.tcp.ReplicationListener"
                tcpListenAddress="auto"
                tcpListenPort="4001"
                tcpSelectorTimeout="100"
                tcpThreadCount="6"/>

            <Sender
                className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
                replicationMode="pooled"
                ackTimeout="15000"
                waitForAck="true"/>

            <Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"
                   filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>
                   
            <Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"
                      tempDir="/tmp/war-temp/"
                      deployDir="/tmp/war-deploy/"
                      watchDir="/tmp/war-listen/"
                      watchEnabled="false"/>
                      
            <ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListener"/>
        </Cluster>

細かく設定をするのでなければ、ここはアンコメントするだけでよい。ただし、今回は同一PCで動かすので、ReceiverのtcpListenPortは重ならないようにした。(もうひとつの方を4002にした)

クラスタ化の設定は以上である。あとは、ポートが重ならないように以下の部分を変更した。

<Server port="8005" shutdown="SHUTDOWN">



    <!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
    <Connector port="8080" maxHttpHeaderSize="8192"



    <!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="8009" 
               enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />

重ならなければいいので、今回は、片方をデフォルトのままにして、片方のポートは+20000した。

ウェブアプリケーション側の設定

次に、レプリケーションを有効にしたいアプリケーションのweb.xmlに設定を書き足す。これを忘れると、セッション共有されないので注意すること。

<distributable/>

このタグをweb.xmlに書き足すと、それがレプリケーションの対象になる。

Tomcatの実行

  • node1を起動

    普通に起動する。

  • node2を起動

    node1が起動するのを待ってから、node2を起動する。

    node1側のコンソールに以下のように出力があった。

    2009/05/16 9:56:52 org.apache.catalina.cluster.tcp.SimpleTcpCluster memberAdded
    情報: Replication member added:org.apache.catalina.cluster.mcast.McastMember
          [tcp://192.168.0.45:4002,catalina,192.168.0.45,4002, alive=0]
    

    後から起動したTomcatがレプリケーションのメンバになったことがわかる。

  • localhost:8080の方のアプリにアクセスしてログインする

    ここで、portを28080にかえても、セッションレプリケーションされているので、作業を継続することが出来る。8080に戻しても同様である。

  • 8080側にログインしている状態で、そちら側のトムキャットをシャットダウンする

    そうすると、8080のトムキャット以外のコンソールに次のようなメッセージが表示される。

    情報: Received member disappeared:org.apache.catalina.cluster.mcast.McastMember
          [tcp://192.168.0.45:4002,catalina,192.168.0.45,4002, alive=17207891]
    

    ごらんのようにシャットダウンしたサーバについて「姿を消した」とでている。

  • ポートを28080にかえてみる。

    かえても、そのまま、すんなりと作業を継続することが出来る。

  • 8080の方を再び起動する。

    動作中のほうのTomcatのコンソールに、次のように8080のサーバの情報が出てくる。

    情報: Replication member added:org.apache.catalina.cluster.mcast.McastMember
          [tcp://192.168.0.45:4002,catalina,192.168.0.45,4002, alive=0]
    

    ここで、ポートを8080にかえると、問題なく作業を継続することが出来る。