このページでは以下の環境での動作を説明しています。
- Debian Linux Etch
- Tomcat5.5
- J2SDK 5.0 Update10
クラスタリングとは複数のマシンを連携させることで、処理速度、稼働時間を向上させる技術です。クラスタリング構成がされたシステムは外部から見た場合、一台のマシンと同様に動作します。Tomcatにおいてクラスタリングを行うことで、複数のTomcat間でセッション内の情報を同期するようになります。
Tomcatをそれぞれ複数のマシンで動作させる場合、設定は簡易です。/etc/tomcat5.5/server.xmlの<Cluster></Cluster>のコメントアウトを外すだけ設定が完了します。もし、一台のマシンで複数のTomcatを動かしてクラスタリングを試してみたいという場合は、ポート番号が当たってしまうため、ずらす必要性があります。具体的には<Cluster>→<Receiver>のtcpListenPortおよび、<Server>のport。<Connector>の各種ポート番号の変更が必要でしょう。</p>
設定を終えてTomcatをそれぞれ起動すると、マルチキャストで通信しあってお互いを見つけ出し、自動的にクラスタリングを構成します。
異なるTomcat間でセッションに格納されたオブジェクトを共有できると言うことは、それらのオブジェクトが複製可能であることを意味します。そのため、セッションに格納するオブジェクトはSerializableインターフェイスをインプリメントしておく必要があります。つまりセッションの同期化とはオブジェクトの直列化を利用してセッション内のオブジェクトを送受信し、コピーしあうことと言えます。クラスタリング下のTomcatではSession#setAttributeでセッションに格納したオブジェクトをSession#getAttributeで取り出したとしても、そのオブジェクトの同一性は保証されません。
request.getSession().setAttribute("shareData", data);
data2 = request.getSession().getAttribute("shareData");
if (data == data2) { // ここがtrueになるとは限らない
System.out.println("same object");
}
またSessionオブジェクト自体の同一性も保証されません。
Tomcatのクラスタリングではセッション内の情報は、常に監視されていているわけではありません。セッションが同期するタイミングが存在します。セッション同期のタイミングはserver.xmlでの設定によって変更されます。<Cluster>要素の属性値であるuseDirtyFlagがそれです。
useDirtyFlagが"true"の場合、SessionオブジェクトのgetAttributeメソッドおよびremoveAttributeが呼ばれたときに同期化が行われます。"false"の場合、リクエストの最後にセッションの同期化処理が行われます。