
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ê.
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.
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!