Apache 2.2.6 と mod_proxy が AJP13 を介して Sticky Sessions を介して Tomcat 7.0.26 を指しているクラスター化された環境があります。
httpd.conf 構成は次のようになります。
<Proxy balancer://mycluster2>
BalancerMember ajp://192.168.0.1:8009 route=tomcat1
BalancerMember ajp://192.168.0.2:8009 route=tomcat2
ProxySet lbmethod=byrequests
</Proxy>
ProxyPass /MyApp balancer://myCluster2/MyApp stickysession=JSESSIONID
ProxyPassReverse /MyApp https://apache_server/MyApp
私の tomcat server.xml ファイルでは、<Host>
タグ内でクラスターを適切に構成しました (tomcat1 ファイルのみを投稿しました。tomcat2 は同じで、IP のみを変更します)。
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="4"/>
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
...
<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="192.168.0.1" 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" />
<Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor" />
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter="" />
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve" />
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener" />
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener" />
</Cluster>
この構成は、任意の jsp webapp で魅力的に機能し、セッションを複製し、従来のフェールオーバー ステップ テスト ケースを使用したフェールオーバーで完全に機能します。
1.- Tomcat1 starts.
2.- Tomcat2 starts.
3.- A request is processed by the balancer: https://apache_server/MyApp and sent to Tomcat1.
4.- Some operations are performed (i. e. refresh page with a counter as session attribute).
5.- Tomcat1 is killed.
6.- User refresh page and the session counter follows counting in Tomcat2.
したがって、その時点で、Apache にも Tomcat にも設定ミスがないことは明らかです。次に、MyApp を使用します。まず、<distributable/>
タグがついていweb.xml
ます。
次に、それを Tomcat1 と Tomcat2 に正常にデプロイすると、Tomcat がアプリケーションのノード間で情報をマルチキャストおよび共有していることがわかります。
INFO: Gestor [/MyApp], requiriendo estado de sesión desde org.apache.catalina.tribes.membership.MemberImpl[tcp://{192, 168, 0, 1}:4000,{192, 168, 0, 1},4000, alive=5113068, securePort=-1, UDP Port=-1, id={-31 113 14 29 99 -58 77 -75 -111 66 -103 86 102 -108 120 61 }, payload={}, command={}, domain={}, ]. Esta operación se agotará si no se recibe estado de sesión dentro de 60 segundos.
19-sep-2013 18:49:51 org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor report
INFO: ThroughputInterceptor Report[
Tx Msg:1 messages
Sent:0,00 MB (total)
Sent:0,00 MB (application)
Time:0,00 seconds
Tx Speed:0,12 MB/sec (total)
TxSpeed:0,12 MB/sec (application)
Error Msg:0
Rx Msg:1 messages
Rx Speed:0,00 MB/sec (since 1st msg)
Received:0,00 MB]
19-sep-2013 18:49:51 org.apache.catalina.ha.session.DeltaManager waitForSendAllSessions
INFO: Gestor [/MyApp]; estado de sesión enviado a las 19/09/13 18:49 recibido en 106 ms.
前述のナビゲーションを再現しようとすると、両方のノードの Tomcat マネージャーで、ドメイン オブジェクトがレプリケートされていることがわかります (すべて実装されていますSerializable
)。
何らかの理由で、私の JSFcom.sun.faces.renderkit.ServerSideStateHelper.LogicalViewMap
はすべてのオブジェクトを複製しません。実際、バックアップ ノードには、そのセッション属性のプライマリ ノードよりも常に 1 つ少ないオブジェクトがあります。
ポイント 6 で、Tomcat1 を強制終了してページを更新した後、セッションは回復されず、ユーザーはログアウト画面に送られ、セッションが無効になります。
MyApp は、以前は非クラスター環境で動作していました。STATE-SAVING
MyAppの構成は次のweb.xml
とおりです。
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>server</param-value>
</context-param>
JSF 2.1.4 から 2.1.21 にアップグレードしようとしても、同じエラーが発生します。MyApp で多くのことを変更せずに 2.2.3 にアップグレードすることはできません (これは本番環境にあり、長期にわたる開発プロジェクトであるため、プロジェクト全体のリファクタリングを検討する前にすべてを試す必要があります)。
これも入れようとしましたweb.xml
が、LogicalViewMap で複製されるオブジェクトが少ないため、さらに悪いことです。
<context-param>
<param-name>com.sun.faces.serializeServerState</param-name>
<param-value>true</param-value>
</context-param>
私の faces-config.xml には特別なものはありません。
また、JSF を 2.2.3 にアップグレードしようとしましたが、この場合、Richfaces 4.0.0-final を使用しているため、プロジェクトはまったく機能せず、さらにコードをリファクタリングする必要があります。
現時点では、JSF 2 は Tomcat Clustering と互換性がないと考えています。Tomcat Clustering と JSF 2 でプロジェクトを構成した人はいますか?
どんな助けでも大歓迎です。