A replicação de sessão do Tomcat 6 não funciona com HAProxy

A replicação de sessão do Tomcat 6 não funciona com HAProxy

Tenho balanceador de carga HAProxy e dois servidores back-end Tomcat. O HAProxy está configurado com persistência baseada em cookies, o Tomcat está configurado com SimpleTcpCluster conforme documentação. O multicast entre os dois servidores back-end do Tomcat está habilitado. No entanto, a replicação da sessão não funciona. Sempre que desligo o servidor que mantém a sessão, os usuários são desconectados. Em catalina.out vejo que os servidores estão se comunicando entre si, por exemplo, quando desativo um back-end:

8 de maio de 2014 11:00:25 org.apache.catalina.tribes.group.interceptors.TcpFailureDetector performBasicCheck INFO: Membro suspeito, confirmado morto.[org.apache.catalina.tribes.membership.MemberImpl[tcp://{ 10, 2, 1, 69}:5000,{10, 2, 1, 69},5000, vivo=931801,id={-18 123 59 -88 -95 20 78 -34 -83 31 -43 73 -64 -71 42 -62 }, carga={}, comando={}, domínio={}, ]]

Além disso, quando eu pego o backend:

AVISO: Gerenciador [webservice#], solicitando o estado da sessão de org.apache.catalina.tribes.membership.MemberImpl[tcp://{10, 2, 1, 69}:5000,{10, 2, 1, 69}, 5000, vivo=672675,id={-18 123 59 -88 -95 20 78 -34 -83 31 -43 73 -64 -71 42 -62 }, carga útil={}, comando={}, domínio={} , ]. Esta operação atingirá o tempo limite se nenhum estado de sessão for recebido em 60 segundos. 8 de maio de 2014 10:54:21 org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor report INFO: ThroughputInterceptor Report Tx Msg:1 messages Enviadas:0,00 MB (total) Enviadas:0,00 MB (aplicativo) Tempo:0,01 segundos Velocidade Tx:0,04 MB/seg (total) TxSpeed:0,04 MB/seg (aplicativo) Mensagem de erro:0 Mensagem Rx:0 mensagens Velocidade Rx:0,00 MB/seg (desde a primeira mensagem) Recebida:0,00 MB]

8 de maio de 2014 10:54:21 org.apache.catalina.ha.session.DeltaManager waitForSendAllSessions INFO: Manager [webservice#]; estado da sessão enviado em 08/05/14 10h54 recebido em 111 ms.

Portanto, clustering e multicast estão funcionando.

Aqui está a configuração de back-end do 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

Aqui está o servidor 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>

Vejo que a persistência de cookies funciona, porque quando os usuários estão logados, eles ficam presos a um servidor back-end, desde que a sessão seja válida. No entanto, quando encerro o servidor que mantém a sessão, os usuários são expulsos, embora eu veja no arquivo de log que outro servidor percebeu isso.

Além disso, web.xml possui o conjunto de elementos distribuíveis.

Alguma ideia?

Obrigado

Responder1

Não consigo ver nenhum problema com a configuração que você forneceu. Algumas sugestões para você.

  1. Você pode confirmar se as sessões são replicadas para cada nó do cluster acessando o gerenciador (http://node01:80/manager/html) e visualize cada sessão no gerenciador do outro nó.

    Suspeito que você não esteja replicando porque a perda de um nó não deve encerrar a sessão.

  2. Verifique as regras de firewall para a porta: 5000 e para o endereço multicast: 228.0.0.4

    Encontramos a maioria dos nossos problemas na configuração do firewall!

informação relacionada