У меня есть балансировщик нагрузки HAProxy и два внутренних сервера Tomcat. HAProxy настроен на сохранение на основе файлов cookie, Tomcat настроен с помощью SimpleTcpCluster в соответствии с документацией. Многоадресная рассылка между обоими внутренними серверами Tomcat включена. Однако репликация сеанса не работает. Каждый раз, когда я выключаю сервер, на котором находится сеанс, пользователи выходят из системы. В catalina.out я вижу, что серверы общаются друг с другом, например, когда я отключаю один бэкэнд:
8 мая 2014 г. 11:00:25 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, живые = 931801, id = {- 18 123 59-88-95 20 78-34-83 31-43 73-64 -71 42 -62}, полезная нагрузка = {}, команда = {}, домен = {},]]
Кроме того, когда я поднимаю бэкэнд:
ВНИМАНИЕ: Менеджер [веб-сервис #], запрашивает состояние сеанса у org.apache.catalina.tribes.membership.MemberImpl [tcp: // {10, 2, 1, 69}: 5000, {10, 2, 1, 69}, 5000, живое = 672675, id = {- 18 123 59-88-95 20 78-34-83 31-43 73-64-71 42-62}, полезная нагрузка = {}, команда = {}, домен = {} ,]. Эта операция завершится по тайм-ауту, если в течение 60 секунд не было получено состояние сеанса. 8 мая 2014 г. 10:54:21 org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor report INFO: ThroughputInterceptor Report Tx Msg: 1 message Отправлено: 0,00 МБ (всего) Отправлено: 0,00 МБ (приложение) Время: 0,01 секунд Скорость передачи: 0,04 МБ / с (всего) Скорость передачи: 0,04 МБ / с (приложение) Сообщение об ошибке: 0 Сообщение об ошибке: 0 сообщений Скорость приема: 0,00 МБ / с (с момента первого сообщения) Получено: 0,00 МБ]
8 мая 2014 г. 10:54:21 org.apache.catalina.ha.session.DeltaManager waitForSendAllSessions ИНФОРМАЦИЯ: менеджер [webservice #]; состояние сеанса отправлено 8.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 server.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 имеет набор распространяемых элементов.
Любые идеи?
Спасибо
Я не вижу проблемы с предоставленной вами конфигурацией. Несколько предложений для вас.
Вы можете подтвердить репликацию сеансов на каждый узел кластера, зайдя в менеджер (http: // node01: 80 / менеджер / html) и просматривайте каждый сеанс в диспетчере другого узла.
Я подозреваю, что вы не реплицируете, потому что потеря узла не должна уничтожить сеанс.
Проверьте правила брандмауэра для порта: 5000 и для адреса многоадресной рассылки: 228.0.0.4
Мы столкнулись с большинством наших проблем при настройке брандмауэра!