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

2

Eu tenho o balanceador de carga HAProxy e dois servidores de back-end do Tomcat. O HAProxy é configurado com persistência baseada em cookie, o Tomcat é configurado com SimpleTcpCluster de acordo com a documentação. A multidifusão entre os dois servidores de back-end do Tomcat está ativada. No entanto, a replicação de sessão não funciona. Toda vez que quando eu desligar servidor que detém sessão, os usuários são desconectados. Em catalina.out, vejo que os servidores estão se comunicando uns com os outros, por exemplo, quando pego um backend:

May 8, 2014 11:00:25 AM org.apache.catalina.tribes.group.interceptors.TcpFailureDetector performBasicCheck INFO: Suspect member, confirmed dead.[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={}, ]]

Além disso, quando faço o backend:

WARNING: Manager [webservice#], requesting session state from 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={}, ]. This operation will timeout if no session state has been received within 60 seconds. May 8, 2014 10:54:21 AM org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor report INFO: ThroughputInterceptor Report Tx Msg:1 messages Sent:0.00 MB (total) Sent:0.00 MB (application) Time:0.01 seconds Tx Speed:0.04 MB/sec (total) TxSpeed:0.04 MB/sec (application) Error Msg:0 Rx Msg:0 messages Rx Speed:0.00 MB/sec (since 1st msg) Received:0.00 MB]

May 8, 2014 10:54:21 AM org.apache.catalina.ha.session.DeltaManager waitForSendAllSessions INFO: Manager [webservice#]; session state send at 5/8/14 10:54 AM received in 111 ms.

Então, clustering e multicast estão funcionando.

Aqui está a configuração do backend 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 server.xml do Tomcat

    <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>

Eu vejo que o cookie persistnce funciona, porque quando os usuários estão logados, eles ficam com um servidor de backend, contanto que a sessão seja válida. No entanto, quando eu desligar servidor que detém a sessão, os usuários são expulsos, embora eu vejo no arquivo de log que outro servidor percebeu isso.

O web.xml também tem o conjunto de elementos distribuíveis.

Alguma idéia?

Obrigado

    
por Tom Aac 08.05.2014 / 11:31

1 resposta

0

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

  1. Você pode confirmar as sessões replicadas para cada nó no cluster indo para o gerente ( link ) e ver cada sessão no gerenciador do outro nó.

    Eu suspeito que você não está replicando porque uma perda de nó não deve matar o sessão.

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

    Nós encontramos a maioria dos nossos problemas na configuração do firewall!

por 12.05.2015 / 00:00