Назад | Перейти на главную страницу

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

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

Любые идеи?

Спасибо

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

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

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

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

    Мы столкнулись с большинством наших проблем при настройке брандмауэра!