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?
fuente
Respuestas:
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:
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.
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.
fuente
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:
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.
fuente