!!!技術的雑談-複数のTomcat間でSessionの途切れないClusterを作る !!環境 *使用OS:CentOS 3.5 *httpd:Apache 2.0.46(多分2.0.xだったら大丈夫) *JDK 1.5.0_10 *Apache tomcat 5.5.17 *mod_jk(tomcat-connector) 1.2.20 *[[複数のTomcatを立ち上げてmod_jk経由でロードバランスさせる|技術的雑談-複数のTomcatを立ち上げてmod_jk経由でロードバランスさせる]]が完了していること。 !!目的 *Tomcat5.5の複数のインスタンス間でWeb ApplicationのObjectを共有し、フェイルセーフなClusterを作る。 今回の完成版の構成図は以下のようになります。 ┌――――┐ httpリクエスト→ │ Apache ├―――┐ 処理を依頼 ┌――――┐ | |mod_jk|―――――→| Tomcat1| httpレスポンス← | | |←―――――| | | | | 結果を返す └――――┘ | | | ↑ | | | SessionなどのObjectのミラーリング | | | ↓ | | | 処理を依頼 ┌――――┐ | | |―――――→| Tomcat2| | | |←―――――| | | | | 結果を返す └――――┘ └――――┴―――┘ ※ 2つのTomcatは同一OSインスタンス上で稼動 !!手順 !Tomcatが使用するリソース [[複数のTomcatを立ち上げてmod_jk経由でロードバランスさせる|技術的雑談-複数のTomcatを立ち上げてmod_jk経由でロードバランスさせる]]でのリソースに加え、以下のリソースを必要とします。 ::IPマルチキャスト用のIPアドレス1つ、Port1つ :::Clusterへのメンバー追加、削除、状態変更通知、ハートビート(生存確認)などに使われているっぽいです。 :::(すいません、ちゃんとは調べていませんが、多分server.xmlの同じエレメントに「mcastFrequency="500"」とか「mcastDropTime="3000"」とかあるので、そうかなぁ…と。) :::Defaultのserver.xml(コメントアウトされている)では「228.0.0.4」「45564」が使われています。 ::TCP Socket 4001番 :::実際のTomcat Objectの複製の為に使われるようです。 ここでの「マルチキャスト用IPアドレス・ポート」はClusterを組むTomcatのserver.xmlで全部同じにするのが正しいようです。 (IPアドレスにみんなで同じものを設定するなんて…理解しがたいですがこういうものらしいです。) 一方、Port 4001番の方は同一OSインスタンス上に複数のTomcatがいる場合、ずらしておかないとダメなようです。 (多分、マルチキャストで送っている情報の中に「私が変更を受け付けているのは4001番ポートだよ〜」みたいな情報が載っているんでしょうね。) !準備 Clusterの接続確認・生存確認にIPマルチキャストを使っているので、TomcatどうしがRouterの向こうにいる場合、そのRouterはIPマルチキャスト対応のRouterでなくてはならないようです。 多分、よくわからないうちや技術検証中はHub(RouterではなくSwitch)経由で接続する方が良いのではないかと思われます。 また、ここでは特に試していませんが、マルチキャスト用のNICと複製用のNICは別にできるっぽいです。 !Install Tomcatを2台以上と、それをちゃんと振り分けられるようにmod_jk、Apache httpdをセットアップしておいてください。 Apache httpd + mod_jk + Tomcat5.5の環境が構築できていればその他にソフトウェアを追加インストールする必要はありません。 !設定 まずは、全Tomcatのserver.xmlを編集します。 Defaultのserver.xmlを使用している場合、後半部分はClusterの設定がコメントアウトされた状態で記載されています。 今回、私がCluster用に書き加えたのは以下のものです。 これを「タグ」の直前に追記します。 また、Clusterに参加する全Tomcatのserver.xmlに同じように追記します。 ''ただし、同一OSインスタンス上に複数のTomcatが稼動している場合のみ、内の「tcpListenPort」の値を、ずらしてください。の「mcastAddr」や「mcastPort」は変える必要が'' '''ありません。''' ''むしろ変えちゃいけないっぽい。'' :: :::Web Application内でTapestryを使っている場合はこれをfalseに変えないと不具合がおこるらしいです。(未確認) :: :::同じClusterグループに属しているサーバを見つけ出す為に使われるっぽいですね。(未確認) :::NICが複数刺さっているサーバの場合、228.0.0.4宛てのパケットが送られるNICをroute addコマンドで教えてあげないとならないかもしれません。(OSのDefault routerがWAN側に向いていたりすると、セキュリティー的な問題でマルチキャストパケットを内内接続の別のLANに向けた方がいいと思います。パフォーマンスが求められる場合などもサービスのNICとCluster用のNICは分けたほうが良いと思います。) :: :::Objectの複製について「syncronous」「asyncronouse」「pool」が選べるようです。またwaitForAckは完了まで待つか待たないかを設定できるようです。(未確認) :: :::Clusterノード間で複製しないものを指定できるようです。普通はこのままで良いでしょう。 :: :::…よくわかりません。とりあえず書いておきました。 :: :::…よくわかりません。多分Cluster内でSession Objectを複製する為のものでしょう。 :: :::別のClusterノードから転送されてきたObjectやファイルを格納しておくキャッシュの設定だと思われます。 :::OS側の都合で/tmpなどが使用不可の場合は別の場所にしましょう。 :: :::…よくわかりません。とりあえず書いておきました。 未調査の項目が多くてすいません…。もしかしたら余計な事もやってるかもしれません。 (一応この後の検証方法で問題が出なかったので…。) 次に、'''ClusterしたいWeb Applicationのweb.xmlにというマークを追加します。''' web.xmlはWeb ApplicationのDirectory直下の「WEB-INF」Directory内にあります。 追記する位置は'''「の後、の前」'''です。 (場所が間違っているとweb.xmlがDTD違反だと言われ、Web Applicationが立ち上がりません。) !起動・終了 前記の設定を終えたら両Tomcat、httpdを再起動する。 エラーが出なければひとまずOK。 !確認 *まず、立ち上がったTomcatの$TOMCAT_HOME/log/catalina.outをチェックし、以下の文言があることを確認する。 Creating ClusterManager for context XXXX using class org.apache.catalina.cluster.session.DeltaManager ※簡単には「DeltaManager」でgrepして、引っかかればOK? *[[先程|技術的雑談-複数のTomcatを立ち上げてmod_jk経由でロードバランスさせる]]のSession ID表示jspを実行する。何度かreloadしてSession IDが固定されている事を確認する。 また、jkstatusでも特定のworkerに処理が固定化されていることを確認。 *jkstatusで上記のworkerをDisableにする。 worker nameの右の「E|R」のEをクリックし、次の画面でDisableを選択する。 *もう一度jspページをreloadする。 Session IDのjvmRoute部分以外が変わらなければ成功。 ちなみにこの状態で先程のworkerをActiveに戻してもSessionは自然とは元のworkerにはFail backしない。 (担当しているworkerを直接落とせば別ですが。) !!関連項目 *[[LinuxでのJDKのInstall|技術的雑談-LinuxでのJDKのInstall]] *[[Tomcat5.5をLinuxにInstallする|技術的雑談-Tomcat5.5をLinuxにInstallする]] *[[mod_jkを使ってTomcatとhttpdを連携する|技術的雑談-mod_jkを使ってTomcatとhttpdを連携する]] *[[複数のTomcatを立ち上げてmod_jk経由でロードバランスさせる|技術的雑談-複数のTomcatを立ち上げてmod_jk経由でロードバランスさせる]] *[べたつきません|http://t-katochin.air-nifty.com/nongreasy/2005/08/post_aa27.html]:大変参考にさせていただきましたm(__)m !!履歴 2007/01/18 -- 初版 [[技術的雑談]]へ戻る !!突っ込み {{comment}} [[技術的雑談]]へ戻る {{trackback}} [[技術的雑談]]へ戻る