instalar cluster carga balancing balanceo java apache tomcat load-balancing mod-proxy-balancer

java - cluster - Apache+Tomcat-Problemas con las sesiones adhesivas y balanceo de carga



tomcat cluster (3)

Estoy enfrentando algunos problemas con Apache mod_proxy_balancer con respecto a las sesiones adhesivas.

Hemos desarrollado un servicio web tranquilo en Java, ejecutándose en Tomcat. El backend real está usando la seguridad de Acegi, con autentificación Auth Basic.

La arquitectura es (lo siento, soy un nuevo usuario, no puedo publicar imágenes):

-------------------- |Java Reverse Proxy| -------------------- | -------------------- |Apache load balancer| -------------------- | --------|-------- | | -------- -------- |tomcat1| |tomcat2| -------- --------

Tenemos este "Proxy inverso de Java" para realizar varios negocios. También realiza la autenticación básica de autenticación en Tomcat (Tomcat1, Tomcat2).

El usuario final llama a las URL como: http: /// a / b? Username = foo & password = bar & session = xxx

El proxy inverso transmite la solicitud a Apache, enviando las credenciales como tokens de autenticación básica.

El usuario final tiene tres URL diferentes:

http://<java reverse proxy domain>/service1 http://<java reverse proxy domain>/service2 http://<java reverse proxy domain>/service3

Solo service1 y service2 están protegidos a través de Acegi. service3 es accesible anónimamente (este es un requisito).

Tenemos la siguiente configuración en Apache para realizar el balanceo de carga:

<Proxy balancer://cluster> Header set Cache-Control no-cache Header set Pragma no-cache BalancerMember http://xxx:9671 route=server1 BalancerMember http://xxx:9672 route=server2 </Proxy> ProxyPreserveHost On ProxyPass / balancer://cluster/ stickysession=JSESSIONID ProxyPassReverse / balancer://cluster/ stickysession=JSESSIONID

En la primera llamada al servicio1, se devuelve JSESSIONID al usuario y luego envía esta información de sesión como parte de la solicitud (en la cadena de consulta, parámetro de sesión)

Para mantener estados de sesiones en los tomcat de backend (tomcat1, tomcat2), el proxy inverso java obtiene la sesión de la cadena de consulta y la envía a los tomcat proxy como una cookie JSESSIONID.

Todo funciona perfectamente bien para las URL que son protegidas por autenticación básica. Pero luego, cuando el usuario llama a la tercera url (que está disponible públicamente), Apache no realiza el balanceo de carga correctamente.

Por ejemplo, cuando llamo al servicio 1 o 2, obtengo los siguientes registros de Apache:

[Wed Feb 22 10:48:52 2012] [debug] mod_proxy_balancer.c(280): proxy: BALANCER: Found value "3FB8F8135173BBBE78E5E4BBD6F5C8FB" for stickysession JSESSIONID [Wed Feb 22 10:48:52 2012] [debug] mod_proxy_balancer.c(1003): proxy: Entering byrequests for BALANCER (balancer://cluster) [Wed Feb 22 10:48:52 2012] [debug] mod_proxy_balancer.c(1046): proxy: byrequests selected worker "http://xxx:9672" : busy 0 : lbstatus 1

Lo cual está perfectamente bien, ya que la solicitud está destinada a target tomcat2.

Pero cuando llamo a service3, obtengo:

[Wed Feb 22 10:49:27 2012] [debug] mod_proxy_balancer.c(280): proxy: BALANCER: Found value "3FB8F8135173BBBE78E5E4BBD6F5C8FB" for stickysession JSESSIONID [Wed Feb 22 10:49:27 2012] [debug] mod_proxy_balancer.c(1003): proxy: Entering byrequests for BALANCER (balancer://cluster) [Wed Feb 22 10:49:27 2012] [debug] mod_proxy_balancer.c(1046): proxy: byrequests selected worker "http://xxx:9671" : busy 0 : lbstatus 0

Como puede ver, aunque la cookie JSESSIONID es la misma, Apache envía la solicitud al gato equivocado (aquí tomcat1).

¿Podría ser el hecho de que la url para service3 no requiere Auth Basic authentication, wherease service1 y service2 do?

Estoy bastante seguro de haber hecho algo mal, pero he estado buscando por mucho tiempo, y no puedo hacer que funcione.

Su ayuda es muy apreciada.

Gracias


No veo un sufijo jvmRoute en su JSESSIONID. mod_proxy usa jvmRoute para enrutar correctamente las sesiones adhesivas a tus instancias de Tomcat. jvmRoute se declara en la configuración de su servidor tomcat (donde cada instancia de servidor tiene su propio identificador jvmRoute exclusivo).


Quizás sea de ayuda. Esta es mi configuración en un servidor web:

<Proxy balancer://hybriscluster> BalancerMember ajp://tomcatServer1:8009 route=tomcat1 keepalive=On ping=5 max=200 ttl=120 BalancerMember ajp://tomcatServer2:8009 route=tomcat2 keepalive=On ping=5 max=200 ttl=120 ProxySet stickysession=JSESSIONID|jsessionid lbmethod=byrequests timeout=60 </Proxy>

Config en server.xml de tomcat Server 1:

<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1"}">


Estaba enfrentando el mismo problema y lo resolví modificando la línea siguiente:

ProxyPass /test balancer://mycluster stickysession=JSESSIONID|jsessionid scolonpathdelim=On <Proxy balancer://mycluster> BalancerMember http://192.168.1.2:80 route=node1 BalancerMember http://192.168.1.3:80 route=node2 </Proxy>

Tenga en cuenta la configuración scolonpathdelim = On Reference - http://httpd.apache.org/docs/2.2/mod/mod_proxy_balancer.html