
Tengo el balanceador de carga HAProxy y dos servidores backend Tomcat. HAProxy está configurado con persistencia basada en cookies, Tomcat está configurado con SimpleTcpCluster según la documentación. La multidifusión entre ambos servidores backend de Tomcat está habilitada. Sin embargo, la replicación de sesiones no funciona. Cada vez que cierro el servidor que mantiene la sesión, los usuarios cierran la sesión. En catalina.out veo que los servidores se comunican entre sí, por ejemplo cuando desactivo un backend:
8 de mayo de 2014 11:00:25 a.m. org.apache.catalina.tribes.group.interceptors.TcpFailureDetector performBasicCheck INFORMACIÓN: Miembro sospechoso, muerto confirmado.[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 útil={}, comando={}, dominio={}, ]]
Además, cuando hago el backend:
ADVERTENCIA: Administrador [webservice#], solicitando el estado de la sesión desde 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 = {}, dominio = {} , ]. Esta operación expirará si no se recibe ningún estado de sesión dentro de 60 segundos. 8 de mayo de 2014 10:54:21 a.m. org.apache.catalina.tribes.group.interceptors.Informe ThroughputInterceptor INFORMACIÓN: Informe ThroughputInterceptor Mensaje de transmisión:1 mensajes Enviados:0,00 MB (total) Enviados:0,00 MB (aplicación) Hora:0,01 segundos Velocidad de transmisión: 0,04 MB/seg (total) Velocidad de transmisión: 0,04 MB/seg (aplicación) Mensaje de error: 0 Mensaje de recepción: 0 mensajes Velocidad de recepción: 0,00 MB/seg (desde el primer mensaje) Recibido: 0,00 MB]
8 de mayo de 2014 10:54:21 a.m. org.apache.catalina.ha.session.DeltaManager waitForSendAllSessions INFORMACIÓN: Administrador [webservice#]; Envío del estado de la sesión el 8/05/14 a las 10:54 a.m. recibido en 111 ms.
Entonces, la agrupación en clústeres y la multidifusión están funcionando.
Aquí está la configuración del backend de 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
Aquí está el 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>
Veo que la persistencia de las cookies funciona, porque cuando los usuarios inician sesión, se quedan con un servidor backend siempre que la sesión sea válida. Sin embargo, cuando cierro el servidor que mantiene la sesión, los usuarios son expulsados aunque veo en el archivo de registro que otro servidor lo notó.
También web.xml tiene el conjunto de elementos distribuibles.
¿Algunas ideas?
Gracias
Respuesta1
No veo ningún problema con la configuración que proporcionaste. Algunas sugerencias para ti.
Puede confirmar que las sesiones se replican en cada nodo del clúster ingresando al administrador (http://nodo01:80/administrador/html) y ver cada sesión en el administrador del otro nodo.
Sospecho que no está replicando porque la pérdida de un nodo no debería interrumpir la sesión.
Verifique las reglas de su firewall para el puerto: 5000 y para la dirección de multidifusión: 228.0.0.4
¡Nos encontramos con la mayoría de nuestros problemas en la configuración del firewall!