Репликация сеанса Tomcat 6 не работает с HAProxy

Репликация сеанса Tomcat 6 не работает с HAProxy

У меня есть балансировщик нагрузки 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

Я не вижу проблем с предоставленной вами конфигурацией. Несколько предложений для вас.

  1. Вы можете подтвердить репликацию сеансов на каждый узел кластера, перейдя в менеджер (http://node01:80/manager/html) и просматривать каждый сеанс в менеджере другого узла.

    Я подозреваю, что вы не выполняете репликацию, поскольку потеря узла не должна прерывать сеанс.

  2. Проверьте правила брандмауэра для порта: 5000 и для адреса многоадресной рассылки: 228.0.0.4.

    Большинство проблем мы решили из-за конфигурации брандмауэра!

Связанный контент