репликация и кластеризация сеансов в tomcat?
Я настроил HttpServer2.2
для достижения load balancing
и Clustering
для моего приложения java.
Но Load Balancing
прекрасно работает и Clustering(session replication)
не работает .
Мой worker.properties
в HttpServer
будет,
workers.java_home=C:/Program Files/Java/jdk1.6.0_25
#worker.list=worker1,worker2
worker.list=balancer
worker.worker1.port=8009
worker.worker1.host=localhost
worker.worker1.type=ajp13
worker.worker1.lbfactor=1
worker.worker2.port=8019
worker.worker2.host=192.168.100.84
worker.worker2.type=ajp13
worker.worker2.lbfactor=1
worker.balancer.type=lb
worker.balancer.balance_workers=worker1,worker2
worker.balancer.method=B
# Specifies whether requests with SESSION ID's
# should be routed back to the same #Tomcat worker.
worker.balancer.sticky_session =True
И httpd.conf
будет,
<IfModule jk_module>
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel info
JkMount /CustomerChat_V1.02.00 balancer
JkMount /CustomerChat_V1.02.00/* balance
</IfModule>
В моем server.xml
для Tomcat one
,
<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.8"
port="45564"
frequency="500"
dropTime="3000" />
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="4200"
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=".*.gif;.*.js;.*.jpg;.*.htm;.*.html;.*.txt;" />
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="D:/cluster/temp/war-temp/"
deployDir="D:/cluster/temp/war-deploy/"
watchDir="D:/cluster/temp/war-listen/"
watchEnabled="false" />
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
В моем server.xml
для Tomcat two
,
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="192.168.0.1"
port="4100"
autoBind="100"
selectorTimeout="5000"
maxThreads="6" />
Но все еще есть проблема.
Когда я выключу Tomcat one
, новый запрос будет автоматически отправлен в tomcat two
. Но Tomcat two
не знает о текущем состоянии пользователя и его сохраненном сеансовом объекте приложения.
Надеюсь, что наши члены стека помогут мне в этом.
Хорошие ответы, безусловно, оценили.
1 ответ:
Некоторые замечания / предложения
Конфигурация, о которой Вы упомянули, являетсяисключительно балансировкой нагрузки . Я предполагаю, что вы используете Tomcat за HttpServer (с разъемом AJP в Tomcat).
- HttpServer будет толькопересылать запрос на сервер Tomcat. Он сам по себе не поддерживает сеанс пользователя.
- сессииподдерживаются в Tomcat и, следовательно, вы должнынастроить Tomcat для кластеризации сессий.
- Для Tomcat Кластеризация, обратитесь к документации tomcat version specific. Вот ссылка дляTomcat 6.0 session clustering .
- Как только серверы Tomcat будут кластеризованы соответствующим образом, сеанс будет реплицирован, и каждый сервер будет распознавать сеанс пользователей другого сервера.
Редактировать:
В вашей конфигурации вы упоминаете
worker.balancer.sticky_session =True
Это заставит HttpServer отправлять все запросы в tomcat, для которого был создан сеанс. первый раз (сеанс привязан к этому серверу, отсюда и название sticky session ). Это разрушает вашу цель кластеризации сеансов. Пожалуйста, установите значение false.