equilibrio de carga en varias instancias horizontales de drupal


8

Desarrollé un REST WebAPI usando el módulo Servicios. Funciona bien. Tengo un cliente de esa API con un uso proyectado que requiere escalar horizontalmente mi instancia de Drupal. Tenga en cuenta que debido a la naturaleza de mi API, que requiere recursos importantes de CPU y GPU, no puedo usar servidores en la nube. Además, debido a la naturaleza de mi API, las instancias de Drupal deben ejecutarse en el sistema operativo Windows. (Mi aplicación requiere software solo disponible en Win64.) Ahora tengo un servidor bastante robusto en una ubicación conjunta, y para este ambicioso cliente, estoy planeando escalar horizontalmente mi hardware de la siguiente manera:

  • Un servidor CentOS que ejecuta HaProxy como equilibrador de carga frontal,
  • Dos para comenzar, con más agregados según sea necesario, los servidores Windows Server 2008 R2 que alojan Drupal,
  • Un servidor de base de datos CentOS que proporciona una única base de datos para las múltiples instancias de Drupal,
  • Un servidor de base de datos CentOS que se ejecuta en modo de replicación en caso de que muera el servidor DB 1.

Mis preguntas tienen que ver con el funcionamiento del equilibrador de carga HaProxy. Supongo que los Id. De sesión creados por las instancias de Drupal serán únicos entre sí. ¿El balanceador de carga mira el sessionId y enruta todas las solicitudes al mismo servidor que produjo ese sessionId? ¿Cómo funcionaría una comunicación REST WebAPI si el equilibrio de carga causara que cada solicitud de API vaya a un servidor diferente? ¿Todos y cada uno de los datos a los que hace referencia WebAPI deben almacenarse en la base de datos porque no puedo asegurar que varias solicitudes de API para el mismo recurso se enrutarán a la misma instancia de Drupal?


Pregunta muy interesante Sin embargo, no puedo evitar sentir que es más una pregunta general que estrictamente sobre Drupal (podría aplicarse a cualquier API REST basada en PHP que use autenticación de sesión si la estoy leyendo bien); si ese es el caso, podría beneficiarse marcando para que se migre al sitio principal de SO. Solo un pensamiento :)
Clive

+1 para encontrar más información en otro lugar. Puede utilizar la mayoría de los consejos para escalar cualquier aplicación PHP con Drupal. Como mi comentario fue demasiado largo, publiqué una respuesta que puede ayudarlo a encontrar lo que necesita.
rocketeerbkw

Gracias rocketeerbkw y Berdir por sus ideas. En mi investigación en curso sobre esto, aprendí que HaProxy no maneja SSL con sesiones fijas, y necesito usar algo como stunnel para SSL, ya que todas mis comunicaciones API son a través de SSL. Parece que se necesita más investigación para comprender completamente mi próximo movimiento aquí.
Blake Senftner

Y más investigaciones parecen indicar que mi configuración debe parecerse al nivel 1: servidor de seguridad y stunnel, nivel 2: equilibrador de carga, nivel 3: servidores web drupal múltiples, nivel 4: servidor de base de datos compartido, nivel 5: servidor de base de datos replicante. Y posiblemente junto con tier4 una SAN para el almacenamiento de archivos compartidos para las múltiples instancias de Drupal. Cualquier información, migajas de pan o artículos web que describan a personas que crean algo como esto son bienvenidos.
Blake Senftner

Respuestas:


12

Tener varios servidores web detrás de un equilibrador de carga / proxy inverso es bastante común para Drupal y está bien soportado. El barniz se usa generalmente en el mundo de Linux porque esa cosa es increíblemente rápida cuando se puede usar, es decir, visitantes anónimos. Lo cual obviamente no es el caso de su sitio.

Las sesiones se almacenan en la base de datos de forma predeterminada, por lo que no es un problema. La única otra cosa que debe compartirse en todos los servidores es el directorio de archivos públicos y cualquier otro como los archivos privados si está usando algo así). En la mayoría de los casos, se utiliza un sistema de archivos compartido / distribuido como NFS, aunque existen algunos enfoques más avanzados. En un sitio en el que estoy involucrado, se encuentra el sistema de archivos proporcionado por otro servidor que es un montaje NFS en los servidores Drupal (por lo que el acceso es lento) y Lighthttpd lo distribuye en un dominio diferente. Pero de nuevo, eso probablemente no sea tan relevante para usted, ya que no va a almacenar muchas imágenes y archivos css en el servidor, supongo.

Según lo mencionado por rocketeerbkw, hay backends de caché para Memcache, Redis y otros. Hasta ahora, solo he usado Memcache, pero recientemente comencé a buscar en Redis y parece muy prometedor, pero no estoy seguro de si está disponible para Windows. Sin embargo, sería posible configurar un servidor Linux separado para utilizarlo en la memoria caché. Drupal 7 depende en gran medida de los cachés, por lo que es muy importante poder sacarlos de la base de datos:

  1. Las herramientas como Redis y Memcache están diseñadas para búsquedas rápidas basadas en claves y mantienen sus datos siempre en la memoria para que la búsqueda sea lo más rápida posible. También han incorporado soporte para limpiar automáticamente los datos de caché antiguos si el límite configurado se acerca.

  2. Quizás aún más importante, ayuda a bajar la carga de la base de datos. Una vez que tenga la configuración básica en su lugar, agregar servidores web adicionales es fácil. Una vez que comienza a alcanzar los límites de un único servidor de base de datos, las cosas se vuelven mucho más complicadas y debe analizar cosas como la replicación maestro / maestro (Drupal 7 realmente no gana mucho de los entornos maestro / esclavo).

Entonces, es básicamente tu propia API la que debes cuidar. Si es posible, debe asegurarse de que todo esté siempre disponible desde todos los servidores. Puede usar el databse, el sistema de archivos o algo más (Drupal también puede usar MongoDB para almacenar ciertos datos, por ejemplo, campos). Si esa no es una opción, deberá utilizar sesiones fijas para que los usuarios siempre terminen en la misma instancia. Sin embargo, debería tratar de evitarlo porque si uno de los servidores falla, entonces todos los usuarios que estaban en ese servidor deben volver a conectarse a otro servidor, posiblemente perdiendo datos.


0

Por defecto, PHP almacena sesiones en el disco. Si un usuario inicia sesión en el Servidor 1, luego presiona el Servidor 2, se cerrará la sesión. Hay algunas opciones para solucionar esto:

  1. No almacene sesiones en disco
  2. Asegúrese de que los usuarios siempre accedan al mismo servidor
  3. Montar un sistema de archivos compartido en todos los servidores

Para implementar el n. ° 2 y responder sus preguntas sobre HAProxy; En la configuración más básica, puede ejecutarlo en modo TCP y utilizar el algoritmo de equilibrio "fuente" ( http://cbonte.github.com/haproxy-dconv/configuration-1.4.html#4-balance ) para asegurarse de que los usuarios presionen El mismo servidor. Debería leer los documentos para determinar si hay inconvenientes para usted usando ese enfoque.

Para el n. ° 1, puede usar una tienda de clave / valor como Redis o Memecached a la que todos sus servidores se conectarían y recuperarían sesiones. Esto hace que las sesiones se carguen / guarden muy rápidamente y también puede usarlas como caché Drupal compartida.


66
Drupal por defecto almacena las sesiones en la base de datos y no en el sistema de archivos.
Berdir el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.