ローカルマシンのTomcat 7でクラスタリング/レプリケーションを設定して、環境/コードベースで使用するために評価します。
異なるポートで実行されている兄弟ディレクトリに2つの同一のTomcatサーバーがあります。他の2つのポートでリッスンし、VirtualHostsとして2つのTomcatインスタンスに接続するhttpdがあります。構成されたポートで両方の環境にアクセスして対話できます。すべてが期待どおりに機能しています。
Tomcatサーバーでは、server.xmlで次のようにクラスタリングが有効になっています。
<Cluster className="org.Apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="8">
<Manager className="org.Apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<Channel className="org.Apache.catalina.tribes.group.GroupChannel">
<Membership className="org.Apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.Apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="4001"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>
<Sender className="org.Apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.Apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.Apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.Apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>
<Valve className="org.Apache.catalina.ha.tcp.ReplicationValve"
filter=""/>
<Valve className="org.Apache.catalina.ha.session.JvmRouteBinderValve"/>
<Deployer className="org.Apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<ClusterListener className="org.Apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.Apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
そして、私はweb.xmlの最初に配布可能なタグを追加しました:
<web-app xmlns="http://Java.Sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee
http://Java.Sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<distributable />
(lots more...)
</web-app>
サーバーが起動すると、ログに記録します
Sep 16, 2013 1:44:23 PM org.Apache.catalina.ha.tcp.SimpleTcpCluster startInternal
INFO: Cluster is about to start
Sep 16, 2013 1:44:23 PM org.Apache.catalina.tribes.transport.ReceiverBase getBind
FINE: Starting replication listener on address:10.0.0.100
Sep 16, 2013 1:44:23 PM org.Apache.catalina.tribes.transport.ReceiverBase bind
INFO: Receiver Server Socket bound to:/10.0.0.100:4001
Sep 16, 2013 1:44:23 PM org.Apache.catalina.tribes.membership.McastServiceImpl setupSocket
INFO: Setting cluster mcast soTimeout to 500
Sep 16, 2013 1:44:23 PM org.Apache.catalina.tribes.membership.McastServiceImpl waitForMembers
INFO: Sleeping for 1000 milliseconds to establish cluster membership, start level:4
Sep 16, 2013 1:44:24 PM org.Apache.catalina.tribes.membership.McastServiceImpl waitForMembers
INFO: Done sleeping, membership established, start level:4
Sep 16, 2013 1:44:24 PM org.Apache.catalina.tribes.membership.McastServiceImpl waitForMembers
INFO: Sleeping for 1000 milliseconds to establish cluster membership, start level:8
Sep 16, 2013 1:44:25 PM org.Apache.catalina.tribes.membership.McastServiceImpl waitForMembers
INFO: Done sleeping, membership established, start level:8
2番目のサーバーが起動すると、最初のサーバーがログに記録します。
Sep 16, 2013 2:17:30 PM org.Apache.catalina.tribes.group.interceptors.TcpFailureDetector messageReceived
FINE: Received a failure detector packet:ClusterData[src=org.Apache.catalina.tribes.membership.MemberImpl[tcp://{10, 0, 0, 100}:4000,{10, 0, 0, 100},4000, alive=112208, securePort=-1, UDP Port=-1, id={118 6 107 -67 88 98 72 95 -73 41 4 -108 58 -5 -127 -41 }, payload={}, command={}, domain={}, ]; id={25 110 120 -2 -25 6 78 -97 -84 -34 2 -11 49 -62 -8 -56 }; sent=2013-09-16 14:17:30.139]
Sep 16, 2013 2:17:30 PM org.Apache.catalina.tribes.transport.nio.NioReplicationTask remoteEof
FINE: Channel closed on the remote end, disconnecting
Sep 16, 2013 2:17:30 PM org.Apache.catalina.tribes.membership.McastServiceImpl memberDataReceived
FINE: Mcast add member org.Apache.catalina.tribes.membership.MemberImpl[tcp://{10, 0, 0, 100}:4001,{10, 0, 0, 100},4001, alive=1010, securePort=-1, UDP Port=-1, id={82 -45 -109 -56 -110 -5 78 -10 -103 61 -40 -59 -36 -79 104 120 }, payload={}, command={}, domain={}, ]
Sep 16, 2013 2:17:30 PM org.Apache.catalina.ha.tcp.SimpleTcpCluster memberAdded
INFO: Replication member added:org.Apache.catalina.tribes.membership.MemberImpl[tcp://{10, 0, 0, 100}:4001,{10, 0, 0, 100},4001, alive=1011, securePort=-1, UDP Port=-1, id={82 -45 -109 -56 -110 -5 78 -10 -103 61 -40 -59 -36 -79 104 120 }, payload={}, command={}, domain={}, ]
一方がシャットダウンすると、もう一方がログに記録します
Sep 16, 2013 2:28:05 PM org.Apache.catalina.tribes.membership.McastServiceImpl memberDataReceived
FINE: Member has shutdown:org.Apache.catalina.tribes.membership.MemberImpl[tcp://{10, 0, 0, 100}:4001,{10, 0, 0, 100},4001, alive=422279, securePort=-1, UDP Port=-1, id={54 43 17 -9 13 -11 72 -63 -107 -78 -8 65 -21 -77 115 88 }, payload={}, command={66 65 66 89 45 65 76 69 88 ...(9)}, domain={}, ]
Sep 16, 2013 2:28:05 PM org.Apache.catalina.tribes.group.interceptors.TcpFailureDetector memberDisappeared
INFO: Verification complete. Member disappeared[org.Apache.catalina.tribes.membership.MemberImpl[tcp://{10, 0, 0, 100}:4001,{10, 0, 0, 100},4001, alive=422279, securePort=-1, UDP Port=-1, id={54 43 17 -9 13 -11 72 -63 -107 -78 -8 65 -21 -77 115 88 }, payload={}, command={66 65 66 89 45 65 76 69 88 ...(9)}, domain={}, ]]
Sep 16, 2013 2:28:05 PM org.Apache.catalina.ha.tcp.SimpleTcpCluster memberDisappeared
INFO: Received member disappeared:org.Apache.catalina.tribes.membership.MemberImpl[tcp://{10, 0, 0, 100}:4001,{10, 0, 0, 100},4001, alive=422279, securePort=-1, UDP Port=-1, id={54 43 17 -9 13 -11 72 -63 -107 -78 -8 65 -21 -77 115 88 }, payload={}, command={66 65 66 89 45 65 76 69 88 ...(9)}, domain={}, ]
彼らがお互いに気づいていることを知っています。
最後に、jconsoleでCluster/Operations MBeanを使用してプロパティ "foo"を "bar"に設定しようとすると、jconsoleが "method successful called"を報告し、サーバーログが
Sep 16, 2013 2:30:18 PM org.Apache.catalina.ha.tcp.SimpleTcpCluster setProperty
WARNING: Dynamic setProperty(foo,value) has been disabled, please use explicit properties for the element you are trying to identify
私はそのエラーについてあまり心配していません。主に、setPropertyがログステートメントを作成することを示すために含まれています。
私の知る限り、私のアプリではセッション情報が複製されていません。
Tomcatマネージャーは、監視しているサーバーで開始されたセッションのみを一覧表示し、クラスター内の他のセッションは一覧表示しません。
アプリがHttpSession.setAttributeを呼び出すときはいつでも、その属性が他のクラスターノードにレプリケートされる必要があるという印象を受けており、そのいくつかのレコードがログに記録されることを期待しています。私のアプリには次の行が含まれています:
public static void saveBillingInfo(IPageContext pageContext, BillingInfo billingInfo)
{
pageContext.getSession().setAttribute("billingInfo", billingInfo);
//etc...
}
billingInfoは、請求情報に関する情報のHashMapの1つのフィールドのみを含むSerializableクラスです。
この行または他の行が処理されるときにログステートメントは書き込まれません。また、セッション情報が実際に共有されているという証拠はありません。
任意の提案やさらなる質問は大歓迎です。
この同じ問題がありました。どこにも記載されていませんが、私にとってそれを解決したのは、<Manager>タグをserver.xmlからグローバルcontext.xmlに移動することでした(<Server> ... <Cluster> ...グループから外して、 <Context>グループ)。これを実行するとすぐに、すべてが「魔法のように」機能し始めました。これは、Tomcat 7にのみ適用されます... Tomcat 6は、上記で説明した設定(およびドキュメントの説明)で完全に機能しました。
<Context>
<Manager className="org.Apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true" />
</Context>
これで、server.xmlのクラスターグループから<Manager>タグを削除するだけで完了です。
server.xmlに次の行を追加するだけです。
<Cluster className="org.Apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="6"/>
そして、あなたのcontext.xmlで:
<Manager className="org.Apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true" />
それは私のために働きました、私はTomcat 7とTomcat 8を使っています
Tomcatのドキュメントによると、次の2つのいずれかを実行する必要があります(両方ではありません)。
クラスタリングを有効にし、server.xmlで指定されたデフォルトの<distributable/>
を使用するには、web.xml <Manager>
で指定するか...
Context.xml内のアプリケーションレベルで<Manager>
を追加します
特定のデプロイ済みアプリケーションに対してクラスタリングを有効にする場合は、以下の例を使用できます
server.xml
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Channel className="org.Apache.catalina.tribes.group.GroupChannel">
<Membership className="org.Apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.Apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="4000"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>
<Sender className="org.Apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.Apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.Apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.Apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>
<Valve className="org.Apache.catalina.ha.tcp.ReplicationValve"
filter=""/>
<Valve className="org.Apache.catalina.ha.session.JvmRouteBinderValve"/>
<Deployer className="org.Apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<ClusterListener className="org.Apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.Apache.catalina.ha.session.ClusterSessionListener"/>
<Manager className="org.Apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<Resource auth="Container" driverClassName="Oracle.jdbc.OracleDriver" factory="com.atomikos.Tomcat.EnhancedTomcatAtomikosBeanFactory" minPoolSize="4" maxPoolSize="50" name="jdbc/myoracle/myconect" password="sdfhsfghsgfsfg" type="com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean" uniqueResourceName="uniresource" url="jdbc:Oracle:thin:@10.10.10.10.:1521:abc" user="user"/>
</Context>
私たちの解決策は、<distributable/>
タグをWEB-INF/web.xml
ファイルの下に<web-app>
要素。これがOPではなく私たちにとってうまくいった理由がわかりません。
ちなみに、ジェイソンのソリューションは私たちにも役立ちました。