Tomcatのクラスタリングとセッション共有

冗長構成にした際のセッション共有設定(クラスタリング)がややこしいことで定評のあるTomcat

レシーバのポート周りの設定がちょっと怪しかったので、調べなおした結果をここにメモ。もっと詳しい話は、Doc置き場に書きました(ApacheとTomcatでクラスタリング)。

環境

概要

Linuxでの設定は、server.xmlに対して以下3つのポイントをおさえておけば良い。

マルチキャストアドレス

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使うねん、などで地雷になりやすい。そのため、ここには使うNICIPアドレスを直接記載するのが良い。

なおレシーバのポートは4000/tcpが初期値になっているが、bindできない場合はautoBind機能により1ずつ増やしていって4099/tcpまで自動で試してくれるため、このポート番号は初期値のまま放っておいても問題になることはまずない。