search
LoginSignup
16
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

Tomcat7でセッションクラスタリング

ここではSimpleTcpClusterを使用した設定を書きます。

server.xmlの

server.xml
      <!--For clustering, please take a look at documentation at:
          /docs/cluster-howto.html  (simple how to)
          /docs/config/cluster.html (reference documentation) -->
      <!--
      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
      -->

のところを以下の様に書き直します。

server.xml
       <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
                 channelSendOptions="8">

          <Manager className="org.apache.catalina.ha.session.DeltaManager"
                   expireSessionsOnShutdown="false"
                   notifyListenersOnReplication="true"/>

          <Channel className="org.apache.catalina.tribes.group.GroupChannel">
            <Membership className="org.apache.catalina.tribes.membership.McastService"
                        address="228.0.0.4"
                        port="45566"
                        frequency="500"
                        dropTime="3000"/>
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="auto"
                      port="4004"
                      autoBind="100"
                      selectorTimeout="5000"
                      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"/>
          </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.JvmRouteSessionIDBinderListener"/>
          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
        </Cluster>

<MemberShip>のところはクラスタリングを構築するTomcat間では設定を揃えます。同一サブネット内に意図せず設定が同一なTomcatがいるとクラスターを構築してしまい、意図しない挙動をすることがあるので、マルチキャストのアドレスが他システムと被らないようにする必要があります。

<Receiver>のところはセッションの通知パケットを受け取るポートの設定です。同一筐体にTomcatを複数立てているような場合は、port="4004"の設定をずらしておく必要があります。

クラスタリングが構築されたり、離脱した事によるフェールオーバーが発生すると、catalina.outにログが出力されますので、クラスタリングできていることはまずログで確認します。その上で注意すべきことは、クラスタリングを組んでいる同士で同時にコンテキストのリスタートをかけると、ペアリングができずにセッションクラスタリングが解除される場合があるということで、リスタートはタイミングをずらしておこなうよう配慮する必要があります。

セッションに格納するオブジェクトはオブジェクトのが変更される度に明示的にjavax.servlet.http.HttpSesion#setAttributeする必要があります。また、セッションに格納するオブジェクトはjava.io.Serializableである必要があるため、FindBugs等の静的解析やユニットテストでオブジェクトがシリアライズできることを担保する必要があります。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
16
Help us understand the problem. What are the problem?