社員ブログ
HOME  社員ブログ

アーカイブ

‘Tomcat’ カテゴリ

Tomcatクラスタ マルチキャストと静的メンバ

2012年12月8日 13時39分15秒

こんにちは、コブラです。

Apache-Tomcat連携、クラスタリングの設定については今回割愛するとして、

Tomcat6.0以降で強化されたそのクラスタリング機能を使ってTomcatクラスタを実現してみました。

でも、マルチキャスト通信ができない環境では使えない・・・

そこで、静的メンバで設定する方法をご紹介!

Server.xmlを編集します!

<br />
&lt;Cluster className=&quot;org.apache.catalina.ha.tcp.SimpleTcpCluster&quot;<br />
	channelSendOptions=&quot;8&quot;<br />
	channelStartOptions=&quot;3&quot;&gt;<br />
	&lt;!-- 全てのノード(サーバ)でセッション情報を共有 --&gt;<br />
	&lt;Manager className=&quot;org.apache.catalina.ha.session.DeltaManager&quot;<br />
		expireSessionsOnShutdown=&quot;false&quot;<br />
		notifyListenersOnReplication=&quot;true&quot;/&gt;<br />
	&lt;Channel className=&quot;org.apache.catalina.tribes.group.GroupChannel&quot;&gt;<br />
		&lt;!-- マルチキャスト通信の場合に使用 --&gt;<br />
		&lt;!--<br />
		&lt;Membership className=&quot;org.apache.catalina.tribes.membership.McastService&quot;<br />
			address=&quot;228.0.0.4&quot;<br />
			port=&quot;45564&quot;<br />
			frequency=&quot;500&quot;<br />
			dropTime=&quot;3000&quot;/&gt;<br />
		--&gt;<br />
		&lt;Receiver className=&quot;org.apache.catalina.tribes.transport.nio.NioReceiver&quot;<br />
			address=&quot;192.168.0.1&quot;<br />
			port=&quot;8080&quot;<br />
			selectorTimeout=&quot;5000&quot;<br />
			maxThreads=&quot;6&quot;/&gt;<br />
		&lt;Sender className=&quot;org.apache.catalina.tribes.transport.ReplicationTransmitter&quot;&gt;<br />
			&lt;Transport className=&quot;org.apache.catalina.tribes.transport.nio.PooledParallelSender&quot;/&gt;<br />
		&lt;/Sender&gt;<br />
		&lt;Interceptor className=&quot;org.apache.catalina.tribes.group.interceptors.TcpPingInterceptor&quot; staticOnly=&quot;true&quot;/&gt;<br />
		&lt;Interceptor className=&quot;org.apache.catalina.tribes.group.interceptors.TcpFailureDetector&quot;/&gt;<br />
		&lt;!-- 静的メンバーの場合に使用 --&gt;<br />
		&lt;Interceptor className=&quot;org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor&quot;&gt;<br />
			&lt;!-- サーバ1台目 --&gt;<br />
			&lt;Member className=&quot;org.apache.catalina.tribes.membership.StaticMember&quot;<br />
				port=&quot;8080&quot;<br />
				host=&quot;192.168.0.1&quot;<br />
				uniqueId=&quot;{192,168,0,1,0,0,0,0,0,0,0,0,0,0,0,0}&quot;/&gt;<br />
			&lt;!-- サーバ2台目 --&gt;<br />
			&lt;Member className=&quot;org.apache.catalina.tribes.membership.StaticMember&quot;<br />
				port=&quot;8080&quot;<br />
				host=&quot;192.168.0.2&quot;<br />
				uniqueId=&quot;{192,168,0,2,0,0,0,0,0,0,0,0,0,0,0,0}&quot;/&gt;<br />
		&lt;/Interceptor&gt;<br />
	&lt;/Channel&gt;<br />
	&lt;!-- セッション共有しないリクエスト --&gt;<br />
	&lt;Valve className=&quot;org.apache.catalina.ha.tcp.ReplicationValve&quot;<br />
		filter=&quot;.*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;&quot;/&gt;<br />
	&lt;Deployer className=&quot;org.apache.catalina.ha.deploy.FarmWarDeployer&quot;<br />
		tempDir=&quot;/tmp/war-temp/&quot;<br />
		deployDir=&quot;/tmp/war-deploy/&quot;<br />
		watchDir=&quot;/tmp/war-listen/&quot;<br />
		watchEnabled=&quot;false&quot;/&gt;<br />
	&lt;ClusterListener className=&quot;org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener&quot;/&gt;<br />
	&lt;ClusterListener className=&quot;org.apache.catalina.ha.session.ClusterSessionListener&quot;/&gt;<br />
&lt;/Cluster&gt;<br />

注意すべき点はこちら!

・ReceiverタグとMemberタグのポートは同一のものにする

・セッション共有したいサーバのServer.xmlすべてに記述する

 ※ただし、ReceiverタグのIPアドレスはそれぞれのサーバのIPアドレスにする

・uniqueIdは16バイトで、一意になればいいのでIPアドレスが無難

これでOKです。

もし、Tomcatログにこんなログが出なかったら

web.xmlの<distributable />タグなど、クラスタ自体の設定を見直してみてください。

WARNING: Manager [/examples], requesting session state from org.apache.catalina.tribes.membership.MemberImpl
     [tcp://192.168.0.1:8080,192.168.0.1,8080, alive=0,id={・・・

かなりざっくりですが、意外とハマるところだと思います。

いい勉強になりました!


Apache, Tomcat, 社員:cobra