
У меня есть балансировщик нагрузки HAProxy и два внутренних сервера Tomcat. HAProxy настроен на сохранение на основе cookie, Tomcat настроен на SimpleTcpCluster согласно документации. Многоадресная передача между обоими внутренними серверами Tomcat включена. Однако репликация сеанса не работает. Каждый раз, когда я выключаю сервер, на котором находится сеанс, пользователи выходят из системы. В catalina.out я вижу, что серверы взаимодействуют друг с другом, например, когда я отключаю один внутренний сервер:
8 мая 2014 г. 11:00:25 AM org.apache.catalina.tribes.group.interceptors.TcpFailureDetector performBasicCheck ИНФОРМАЦИЯ: Подозреваемый участник, подтверждена его смерть.[org.apache.catalina.tribes.membership.MemberImpl[tcp://{10, 2, 1, 69}:5000,{10, 2, 1, 69},5000, alive=931801,id={-18 123 59 -88 -95 20 78 -34 -83 31 -43 73 -64 -71 42 -62 }, payload={}, command={}, domain={}, ]]
Кроме того, когда я берусь за бэкэнд:
ВНИМАНИЕ: Менеджер [webservice#], запрашивает состояние сеанса из org.apache.catalina.tribes.membership.MemberImpl[tcp://{10, 2, 1, 69}:5000,{10, 2, 1, 69},5000, alive=672675,id={-18 123 59 -88 -95 20 78 -34 -83 31 -43 73 -64 -71 42 -62 }, payload={}, command={}, domain={}, ]. Эта операция будет завершена по тайм-ауту, если состояние сеанса не будет получено в течение 60 секунд. 8 мая 2014 г. 10:54:21 AM org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor report INFO: ThroughputInterceptor Report Tx Msg:1 сообщений Отправлено:0,00 МБ (всего) Отправлено:0,00 МБ (приложение) Время:0,01 секунды Скорость передачи:0,04 МБ/сек (всего) Скорость передачи:0,04 МБ/сек (приложение) Сообщение об ошибке:0 Сообщение о приеме:0 сообщений Скорость приема:0,00 МБ/сек (с 1-го сообщения) Получено:0,00 МБ]
8 мая 2014 г. 10:54:21 org.apache.catalina.ha.session.DeltaManager waitForSendAllSessions ИНФОРМАЦИЯ: Менеджер [webservice#]; состояние сеанса отправлено 08.05.14 10:54, получено за 111 мс.
Итак, кластеризация и многоадресная рассылка работают.
Вот конфигурация бэкэнда HAProxy:
backend BE-tomcat_http
mode http
cookie SERVERID insert indirect nocache
balance leastconn
timeout connect 30000
timeout server 30000
retries 3
option httpchk OPTIONS /
option redispatch
option http-server-close
option http-pretend-keepalive
server node01 10.2.1.69:80 cookie node01 check inter 1000
server node02 10.2.1.90:80 cookie node02 check inter 1000
Вот сервер Tomcat.xml
<Engine name="Catalina" defaultHost="localhost" jvmRoute="node01">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"
mapSendOptions="8"/>
<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="5000"
selectorTimeout="500"
minThreads="2"
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=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
<!-- <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/> -->
</Cluster>
Я вижу, что сохранение cookie работает, потому что когда пользователи входят в систему, они привязаны к одному внутреннему серверу, пока сеанс действителен. Однако, когда я выключаю сервер, на котором хранится сеанс, пользователи вылетают, хотя я вижу в файле журнала, что другой сервер это заметил.
Также web.xml имеет набор распределяемых элементов.
Есть идеи?
Спасибо
решение1
Я не вижу проблем с предоставленной вами конфигурацией. Несколько предложений для вас.
Вы можете подтвердить репликацию сеансов на каждый узел кластера, перейдя в менеджер (http://node01:80/manager/html) и просматривать каждый сеанс в менеджере другого узла.
Я подозреваю, что вы не выполняете репликацию, поскольку потеря узла не должна прерывать сеанс.
Проверьте правила брандмауэра для порта: 5000 и для адреса многоадресной рассылки: 228.0.0.4.
Большинство проблем мы решили из-за конфигурации брандмауэра!