2010-12-30 20 views
19

Voy a tener 3 servidores Tomcat y un Load Balancer que distribuye las solicitudes sin usar 'sticky sessions'.

Quiero compartir los datos de las sesiones entre los servidores y estoy pensando en mantenerlos en DB. Me gustaría utilizar memcached como una capa en frente de mi base de datos para atender las solicitudes más rápido y al don't put my db under heavy load.

Estoy pensando en proporcionar mi Administrador personalizado de tomcat que use memcached antes de obtener/persistir datos de sesión en DB ya que en este momento no veo una forma transparente de hacerlo (significa que tendré que gestionarlo) de nuevo en el caso de que cambie a otro servidor de aplicaciones).

¿Es esta una buena solución o ve un mejor enfoque?Compartir sesiones entre instancias de tomcat (sin utilizar Sesiones adhesivas)

Respuesta

0

Hacemos algo similar en nuestra aplicación (Weblogic, pero eso no importa), donde tenemos una clave de sesión única almacenada como una cookie en el navegador. Esa clave se usará en cada solicitud para restaurar los datos de sesión relevantes de la base de datos.

Usando este principio, siempre podemos cambiar a otro servidor usando el equilibrador de carga sin que el usuario note nada. Además de eso, apenas almacenamos nada relevante en la sesión del usuario y trabajamos con muchos campos ocultos en el navegador (el equilibrador de carga admite cifrado de URL y protección de valor de formulario, por lo que estamos seguros). .

+0

@Lucas Eder tenemos una configuración similar, la diferencia es que usamos Memcached para la tienda de sesiones. – Nishant

+0

Para algunas aplicaciones, "no importa" (es decir, los datos de sesión pueden no ser considerados sensibles para el usuario autenticado), pero en principio enviar datos de "sesión" hacia adelante y hacia atrás, ya sea como campos "ocultos" (de por supuesto, ningún campo en una página HTML está realmente oculto para el usuario) o como las cookies, que están hechas para este propósito, es una práctica deficiente. A menos que el lado del cliente de la aplicación necesite estos datos, no debe exponerse al navegador. –

+1

@DanFarrell: los campos ocultos no eran datos confidenciales, y la protección de valor de formulario evitaba que se modificara. Entonces no veo cómo sería una mala práctica, en cuanto a la seguridad. Hubo una gran cantidad de sobrecarga de transferencia de datos, por supuesto ... –

6

Almacenar su estado de sesión fuera de los servidores de aplicaciones (Tomcat en su caso), es una configuración muy común y recomendada para sitios web a gran escala. Esto se hace generalmente en busca de un estilo de arquitectura llamado Shared Nothing.

Puede almacenar su estado en varios lugares diferentes: db, memcached, caché comercial replicada, etc. Todos ellos funcionan con diferentes mezclas de compensaciones. Personalmente, he tenido un gran éxito con memcached. Memcached es extremadamente rápido y estable.

En general, opto por la simplicidad y uso N servidores de Memcache donde N> 1, por ejemplo 2. A medida que los usuarios inician sesión, los servidores de aplicaciones lanzan una moneda para decidir qué servidores almacenan los usuarios. La cookie enviada al navegador incluye información para saber a qué servidor de Memcache enrutar a partir de ese momento. Las solicitudes posteriores del navegador obtienen el estado del servidor Memcache apropiado en cada solicitud. En caso de que un servidor de Memcache falle, el usuario tendrá que volver a iniciar sesión cuando los servidores de la aplicación vuelvan a seleccionar un nuevo servidor, pero eso es extremadamente raro.

16

Las sesiones persistentes en la base de datos limitan su escalabilidad. Si la escalabilidad no es tan importante para usted, esto (db + memcached) es un enfoque válido.

Una cosa que debes tener en cuenta cuando usas sesiones no conflictivas son las solicitudes simultáneas: cuando tienes, por ejemplo, ajax-requests (ejecutados en paralelo/concurrentemente) serán servidos por diferentes tomcats (debido a la falta de adherencia) y, por lo tanto, acceden a la sesión al mismo tiempo. Siempre que tenga solicitudes simultáneas que puedan modificar la sesión, deberá implementar algún tipo de sincronización/bloqueo de sesión.

Quizás esto le interese: Creé el memcached-session-manager con el objetivo de lograr un rendimiento óptimo y una escalabilidad ilimitada. Puede funcionar con cualquier backend compatible con memcached (por ejemplo, también memcachedb, membase, etc. o simplemente memcached). Aunque originalmente se creó para un enfoque de sesiones adhesivas, ya existe un branch for nonsticky-sessions existente y un sample app que muestra cómo/eso funciona. Ahora mismo hay un thread on the mailing list on further improvements for nonsticky-sessions (manejo de solicitudes simultáneas y prevención del punto único de falla).

+2

Solo quiero dejar una nota aquí que acabo de lanzar memcached-session-manager con soporte para sesiones no adhesivas (y soporte para tomcat7). El anuncio con algunos detalles sobre sesiones no adhesivas: http://groups.google.com/group/memcached-session-manager/t/612891b0ae10649d – MartinGrotzke

+0

muy buen punto sobre las solicitudes de ajax. Dentro del mismo flujo, podría haber solicitudes múltiples al servidor. – vsingh

Cuestiones relacionadas