« dotProject2.1-rc1→rc2 | Main | Tomcatでフェイルオーバー(FileStore) »

2007.05.31

Tomcatでフェイルオーバー

 複数のTomcatでクラスタを構築してセッション情報の共有を行う場合、

  • ファイル共有
  • データベース
  • メモリコピー

    の3種類の方法があるとのことです(The Apache Tomcat 5.5 Servlet/JSP Container Clustering/Session Replication HOW-TO)。

     ちなみに、Tomcat5.5のドキュメントでは

    1.Using session persistence, and saving the session to a shared file system (PersistenceManager + FileStore)
    2.Using session persistence, and saving the session to a shared database (PersistenceManager + JDBCStore)
    3.Using in-memory-replication, using the SimpleTcpCluster that ships with Tomcat 5 (server/lib/catalina-cluster.jar)

    となっていますが、Tomcat5.0のドキュメントでは

    1.Using session persistence, and saving the session to a shared file system (PersistenceManager)
    2.Using session persistence, and saving the session to a shared database (JDBCManager)
    3.Using in-memory-replication, using the SimpleTcpCluster that ships with Tomcat 5 (server/lib/catalina-cluster.jar)

    となっています(Tomcat6.0はTomcat5.5と同じ)。ん~?? FileStoreやJDBCStoreに関しては、Tomcat4の頃から存在するようですが、JDBCManagerはそもそも存在していないような??

  •  で、とりあえずPersistenceManager+FileStore/JDBCStoreの組み合わせの環境構築を行ってみました。

    【PersistenceManager】
     PersistenceManagerは、元々は長時間使用されていないメモリ上のセッションオブジェクトをファイル等に対して永続化するためのもののようです(主な目的はメモリの消費量を抑えるため)。で、PersistenceManagerの機能のうち、「セッション情報のバックアップ」の機能を用いることで、(若干制限はあるものの)フェイルオーバーを実現することが可能となるようです。

     Contextに対する設定となりますが、conf/context.xmlに内容を記述すると、すべてのアプリケーションに適用されることとなります(Tomcat5.5の場合のContextの設定の詳細はこちら。なお、5.0と5.5とでいろいろと変更されたようです)。

    <Manager className="org.apache.catalina.session.PersistentManager"
     saveOnRestart="true"
     maxIdleSwap="-1"
     maxIdleBackup="1"
     processExpiresFrequency="6"
     >
      <Store (中略)
       >
      </Store>
    </Manager>

     Managerに対してStoreを登録すると、一定の間隔でStore処理が行われるようになります。「一定の間隔」の計算の仕方は(Tomcat5.5.23のソースをみたところ)以下のような感じになるようです。パラメータの詳細に関しては、JavaDoc PersistentManagerおよびそれらの親クラスのField Summaryがある程度は参考になるかと。

  • org.apache.catalina.core.ContainerBase#backgroundProcessorDelay 秒間隔でManagerBase#backgroundProcess() が呼び出されます。
  • backgroundProcess()メソッドがprocessExpiresFrequency回呼び出されると、セッションの保管(および破棄)処理が実行されます。
  • 結果として、backgroundProcessorDelay×processExpiresFrequency 秒間隔でセッションの保管(および破棄)処理が行われることとなります。backgroundProcessorDelayの初期値は10(秒)で(StandardEngineのコンストラクタ中で10がセットされています)、processExpiresFrequencyの初期値は6(回)なので、初期状態では60秒(1分)間隔で処理されることとなります。

     なので、セッション情報をファイル(あるいはDB)に保管するためには若干のタイムラグが必要となるため、その間に別のTomcatに処理が割り振られてしまうとセッション情報の維持に失敗してしまうので、Apache側のStickySessionは必須になるかと。
     また、saveOnRestartがfalseになっていると、Tomcat停止時にそのTomcatにつながっているセッション情報が削除されてしまい、結果としてフェイルオーバーに失敗することになるので、この部分は通常はtrueで使用することになるかと思います。

    #FileStore/JDBCStoreに関しては次回。

    【6/2編集】
    saveOnRestartの値をfalseからtrueに変更。

  • |

    « dotProject2.1-rc1→rc2 | Main | Tomcatでフェイルオーバー(FileStore) »

    Java」カテゴリの記事

    Subversion・Trac・etc.」カテゴリの記事

    Comments

    Post a comment



    (Not displayed with comment.)


    Comments are moderated, and will not appear on this weblog until the author has approved them.



    TrackBack


    Listed below are links to weblogs that reference Tomcatでフェイルオーバー:

    » Tomcatでフェールオーバー(FileStore) [気の向くままに・・・]
     FileStoreを用いると、セッション情報をファイルに保存するようになります [Read More]

    Tracked on 2007.06.01 16:00

    » Tomcatでフェイルオーバー(比較) [気の向くままに・・・]
     (細かい設定はさておき)Tomcatでサポートされている3種類のセッション情報 [Read More]

    Tracked on 2007.06.04 12:15

    « dotProject2.1-rc1→rc2 | Main | Tomcatでフェイルオーバー(FileStore) »