¿Cómo se logra la rigidez de sesión en múltiples servidores web?

23

¿Cuántos servidores web tiene StackOverflow / ServerFault?

Si la respuesta es 'más de uno', entonces ¿logra la permanencia de la sesión durante el sondeo de DNS?

p.campbell
fuente
En realidad no, pero si se formulara de manera diferente, podría ser una pregunta interesante.
Deberías reformular la pregunta. Cambie el título a "¿Cómo se logra la adherencia de la sesión en varios servidores web?" o algo así ...
William Brendel
¿podrías hacerme un favor para mostrarme la frase correcta?
1
La suposición de que tener varios servidores implica sesiones permanentes, que son una abominación, me duele.
womble

Respuestas:

42

Los sitios web grandes pueden tener "carga equilibrada" en varias máquinas. En muchas configuraciones de carga equilibrada, un usuario puede golpear cualquiera de las máquinas de back-end durante una sesión. Debido a esto, existen varios métodos para permitir que muchas máquinas compartan sesiones de usuario.

El método elegido dependerá del estilo de equilibrio de carga empleado, así como de la disponibilidad / capacidad de almacenamiento de back-end:

Información de sesión almacenada solo en cookies : la información de sesión (no solo un identificador de sesión) se almacena en la cookie de un usuario. Por ejemplo, la cookie del usuario puede contener el contenido de su cesta de la compra. Para evitar que los usuarios alteren los datos de la sesión, se puede proporcionar un HMAC junto con la cookie. Este método es probablemente el menos adecuado para la mayoría de las aplicaciones:

  • No se requiere almacenamiento de backend
  • El usuario no necesita golpear la misma máquina cada vez, por lo que se puede emplear el equilibrio de carga de DNS
  • No hay latencia asociada con la recuperación de la información de sesión de una máquina de base de datos (ya que se proporciona con la solicitud HTTP). Útil si su sitio está equilibrado por carga en máquinas de diferentes continentes.
  • La cantidad de datos que se pueden almacenar en la sesión es limitada (por el límite de tamaño de cookie 4K)
  • Se debe utilizar el cifrado si un usuario no puede ver el contenido de su sesión
  • Se debe emplear HMAC (o similar) para evitar la manipulación del usuario de los datos de la sesión
  • Dado que los datos de la sesión no se almacenan en el servidor, es más difícil para los desarrolladores depurar

El equilibrador de carga siempre dirige al usuario a la misma máquina : muchos equilibradores de carga pueden establecer su propia cookie de sesión, indicando desde qué máquina de fondo está solicitando un usuario, y dirigirlos a esa máquina en el futuro. Debido a que el usuario siempre se dirige a la misma máquina, no es necesario compartir sesiones entre varias máquinas. Esto puede ser bueno en algunas situaciones:

  • Es posible que no sea necesario cambiar el manejo de la sesión de una aplicación existente para tener en cuenta varias máquinas
  • No se requiere un sistema de base de datos compartido (o similar) para almacenar sesiones, posiblemente aumentando la confiabilidad, pero a costa de la complejidad
  • Una máquina de back-end que se apaga eliminará todas las sesiones de usuario que se inicien en ella, con ella.
  • Poner las máquinas fuera de servicio es más difícil. Los usuarios con sesiones en una máquina que se desmantelarán por mantenimiento deben poder completar sus tareas, antes de apagar la máquina. Para respaldar esto, los equilibradores de carga web pueden tener una función para "drenar" las solicitudes a una determinada máquina de back-end.

Base de datos de fondo compartida o almacén de clave / valor : la información de la sesión se almacena en una base de datos de fondo, a la que todos los servidores web tienen acceso para consultar y actualizar. El navegador del usuario almacena una cookie que contiene un identificador (como el ID de sesión), que apunta a la información de la sesión. Este es probablemente el método más limpio de los tres:

  • El usuario nunca necesita estar expuesto a la información de sesión almacenada.
  • El usuario no necesita golpear la misma máquina cada vez, por lo que se puede emplear el equilibrio de carga de DNS
  • Una desventaja es el cuello de botella que se puede colocar en cualquier sistema de almacenamiento backend empleado.
  • La información de la sesión puede expirar y respaldarse consistentemente.

En general, la mayoría de las aplicaciones web dinámicas realizan una serie de consultas a la base de datos o solicitudes de almacenamiento de clave / valor, por lo que la base de datos o el almacén de clave / valor es la ubicación de almacenamiento lógica de los datos de la sesión.

Tommeh
fuente
2
+1 Respuesta bastante completa y me ahorra escribirla. :) En lo que respecta al almacenamiento de db, una base de datos relacional es probablemente lo incorrecto. Algo así como uno de los tenedores Memcached persistentes es mejor. memcachedb podría ser adecuado. También se perdió la replicación de la información de sesión entre servidores. No es el mejor método, pero cosas como Tomcat lo hacen, así que vale la pena documentarlo.
David Pashley
¿Qué enfoque utilizan Google, Twitter o Facebook?
Dannyboy
1
No estoy seguro acerca de Google, Twitter o Facebook, pero Redis es ideal para una tienda de sesiones. Es básicamente el "recuerdo persistente" que David Pashley estaba recomendando en 2009, cuando Redis era embrionario.
Ben R
4

Si su pregunta es cómo mantener sesiones en múltiples servidores web front-end, entonces la respuesta suele ser utilizar una base de datos centralizada. En lugar de confiar en las instancias del servidor web para rastrear los archivos de sesión en los sistemas de archivos locales, escribiría los identificadores de sesión y los datos en una base de datos central, y todos los servidores web recuperarían los datos de allí.

zombat
fuente
+1 por mencionar la base de datos centralizada. Solo para expandir / simplificar un poco esa idea. Si configura una cookie en la PC de un usuario con algo único, como una ID de usuario global, puede almacenar ese GUID en una base de datos. No importará a qué servidor se conecta un cliente, siempre que tenga el GUID / cookie, podrá buscarlos en la base de datos y realizar un seguimiento de la sesión en consecuencia.
KPWINC
2
Almacenar sesiones en una base de datos relacional es siempre una mala idea. No debe usar bases de datos para almacenar datos transitorios.
David Pashley
2

Usar nemcached parece ser una buena solución no mencionada por @David Pashley

Significa tener una instancia remota de memcached compartida por todos los servidores y usar la extensión PECL de memcache que proporciona su propio controlador de sesión.

¡Solo requiere cambiar dos parámetros en la configuración de php!

Aquí hay un buen tutorial http://www.dotdeb.org/2008/08/25/storing-your-php-sessions-using-memcached/

Tristan
fuente
Pero, ¿qué hay múltiples centros de datos?
Dannyboy
0

IIRC, en DotNetRocks # 440 dijeron un período de servidor. No sé si ese sigue siendo el caso.

Editar: En realidad, fue Hanselminutes # 134 . Lo siento.

ongle
fuente
0

Puedes configurar una cookie.

Puede calcular un hash de la IP remota (en su forma más simple, los hosts remotos con números impares van al servidor A, los hosts con números pares van al servidor B).

Parece que también puede hacerlo a través de algunos valores que permanecen con el sistema de origen si está utilizando un túnel SSL.

Normalmente, cada uno de los mecanismos anteriores requiere un servidor "proxy inverso" o un equilibrador de carga de algún tipo. Ese equilibrador de carga acepta el tráfico y luego lo dirige a cualquier servidor que inicialmente haya tenido la sesión, según uno de los criterios anteriores.

Sin embargo, no estoy seguro de qué quiere decir con "sondeo de DNS"

Chris
fuente
0

a) Puede almacenar información de sesión en la cookie del usuario. Consulte las cookies reforzadas sin estado, que no almacenan datos en el lado del servidor, pero conserva el estado de la sesión http://www.cl.cam.ac.uk/~sjm217/papers/protocols08cookies.pdf . b) Puede cambiar el almacenamiento de fondo de la sesión a la base de datos o memcached. Para eliminar un solo punto de falla, puede configurar la replicación de la base de datos o múltiples nodos memcached. Tenga en cuenta que se recomienda memcached en tales configuraciones donde perder el estado del usuario en la sesión no es un gran error y no lo hace muy infeliz. Para casos en los que es vital preservar el estado, use bases de datos Tanto PHP, Django y Rails permiten al desarrollador escribir sesiones de fondo personalizadas.

Kristaps
fuente