Tomcatのクラスタリングとセッション共有
冗長構成にした際のセッション共有設定(クラスタリング)がややこしいことで定評のあるTomcat。
レシーバのポート周りの設定がちょっと怪しかったので、調べなおした結果をここにメモ。もっと詳しい話は、Doc置き場に書きました(ApacheとTomcatでクラスタリング)。
概要
Linuxでの設定は、server.xmlに対して以下3つのポイントをおさえておけば良い。
- クラスタごとに、マルチキャストアドレスとポート番号を決める(デフォルト値は使わない)
- マルチキャスト通信をどのNICから投げるか、ルーティング設定をおこなう
- レシーバに用いるNICのIPアドレスを、"auto"にせずに直接記述する
マルチキャストアドレス
Tomcatのクラスタリングの仕組みは、マルチキャストを利用して実現されている。クラスタに参加する全サーバが同じマルチキャストアドレスを設定することで、各サーバは自分がどこにメンバ参加すればいいかが判断できるわけだ(もう少し正確に言うと、Tomcatでは、「マルチキャストアドレスとポート番号」のセットでグループ分けされる。そのためアドレスだけカブっても動くはず)。
このマルチキャストアドレスは、デフォルトのサンプル設定<Membership>では、
address="228.0.0.4" port="45564"
になっているけど、当然のことながらデフォルト設定では近隣でTomcatを使っている人と干渉するかもしれない。このIPアドレスとポート番号は変更しよう。私の場合は、「address="228.0.0.104", port="50001"」とか少しずらしてみた。
マルチキャスト通信のルーティング設定
NICを複数持っているサーバなどでは、どのNICからマルチキャストを投げるかを設定してやらないといけない。マルチキャストをeth0から投げるならば、以下のようになる。
# route add -host 228.0.0.104 dev eth0
これはサーバ再起動すると消えてしまうため、上手く動くことを確認したら /etc/sysconfig/network-scripts/route-eth0 に書くのがベター。
228.0.0.104/32 dev eth0
レシーバのIPアドレス
マルチキャストでメンバ参加したクラスタ間で、実際にセッション共有をおこなうのが<Receiver>である。レシーバの設定で、アドレスを書くところがデフォルトでは
address="auto"
になっているのだが、ここをautoのままにしていると"localhost"で名前解決できねぇとか、複数NIC持つ場合どのNIC使うねん、などで地雷になりやすい。そのため、ここには使うNICのIPアドレスを直接記載するのが良い。
なおレシーバのポートは4000/tcpが初期値になっているが、bindできない場合はautoBind機能により1ずつ増やしていって4099/tcpまで自動で試してくれるため、このポート番号は初期値のまま放っておいても問題になることはまずない。