У меня есть кластерная среда с Apache 2.2.6 и mod_proxy, указывающая на Tomcat 7.0.26 через AJP13 с Sticky Sessions.Отказоустойчивость в кластерной среде не работает с JSF 2, Richfaces 4, Tomcat 7
Конфигурация 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
В моем файле server.xml TOMCAT, я правильно настроил кластер внутри тега <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 веб-приложение, он размножается сессий и отлично работает на сбое с классическим тест шаг отказоустойчивого случае:
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.
Таким образом, в тот момент у меня есть ясно, что нет неправильной настройки ни на апач, ни в Томкате. Затем я иду с 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 Managers для обоих узлов объекты моего домена, которые реплицируются (все они реализуют Serializable
).
По какой-то причине мой JSF com.sun.faces.renderkit.ServerSideStateHelper.LogicalViewMap
не реплицирует все объекты. Фактически, узел Backup всегда имеет один объект меньше основного узла в этом атрибуте сеанса.
В точке 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, и я получаю ту же ошибку. Я не могу обновиться до 2.2.3, не изменяя многие вещи в MyApp (это в производстве, и это долгое время проект разработки, поэтому я должен попробовать все, прежде чем рассматривать реорганизацию всего проекта).
Я пытался поставить и это в моем web.xml
и это еще хуже, так как он размножается меньше объектов в LogicalViewMap:
<context-param>
<param-name>com.sun.faces.serializeServerState</param-name>
<param-value>true</param-value>
</context-param>
Мои лица-config.xml не имеет ничего особенного.
Я также попытался обновить JSF до версии 2.2.3, но в этом случае проект вообще не работал, поскольку я использую Richfaces 4.0.0-final, и мне нужно будет реорганизовать еще один код.
В это время я думаю, что JSF 2 несовместим с Tomcat Clustering. Кто-нибудь настраивал проект с Tomcat Clustering и JSF 2?
Любая помощь будет оценена по достоинству.
Вы видите ошибки в файлах журнала Catalina? –
Нет, никаких ошибок. На самом деле, когда я запускаю Tomcat, я вижу эту запись для MyApp и больше записей о сессиях 19-sep-2013 18:49:51 org.apache.catalina.ha.session.DeltaManager waitForSendAllSessions INFO: Gestor [/ MyApp]; состояние сеанса отправлено в 19/09/13 18:49 получено в 106 ms.' – idiazt