Estoy tratando de entender el concepto de equilibrio de carga para garantizar la disponibilidad y la redundancia para mantener a los usuarios contentos cuando las cosas van mal, en lugar de equilibrar la carga en aras de ofrecer una velocidad vertiginosa a millones de usuarios.
Tenemos un presupuesto limitado y tratamos de mantenernos en lo que hay mucho conocimiento disponible, por lo que ejecutar Apache en Ubuntu VPS parece ser la estrategia hasta que algún motor de búsqueda famoso nos adquiera ( incluye la ironía del sábado, tenga en cuenta ).
Al menos para mí, es una jungla completa de diferentes soluciones disponibles. Los propios mod_proxy y HAproxy de Apaches son dos que encontramos mediante una búsqueda rápida en Google, pero al no tener experiencia en el equilibrio de carga, no tengo idea de lo que sería apropiado para nuestra situación, o qué buscaríamos al elegir una solución para resolver nuestro problema. preocupaciones de disponibilidad.
¿Cuál es la mejor opción para nosotros? ¿Qué debemos hacer para obtener una alta disponibilidad mientras nos mantenemos dentro de nuestros presupuestos?
fuente
Respuestas:
La solución que uso y que se puede implementar fácilmente con VPS es la siguiente:
Este arco tiene las siguientes ventajas, en mi opinión sesgada:
En su caso, tener VPS físicamente separados es una buena idea, pero hace que compartir ip sea más difícil. El objetivo es tener un sistema redundante y resistente a fallas, y algunas configuraciones para el equilibrio de carga / HA terminan estropeándolo agregando un solo punto de falla (como un solo equilibrador de carga para recibir todo el tráfico).
También sé que preguntaste sobre apache, pero esos días tenemos herramientas específicas más adecuadas para el trabajo (como nginx y barniz). Deje apache para ejecutar las aplicaciones en el back-end y sirva utilizando otras herramientas (no es que apache no pueda hacer un buen equilibrio de carga o proxy inverso, es solo una cuestión de descargar diferentes partes del trabajo a más servicios para que cada parte pueda funcionar bien) es compartir).
fuente
HAproxy es una buena solución. La configuración es bastante sencilla.
Necesitará otra instancia de VPS para sentarse frente a al menos otros 2 VPS. Por lo tanto, para el equilibrio de carga / conmutación por error, necesita un mínimo de 3 VPS
Algunas cosas en las que pensar también es:
Terminación SSL. Si usa HTTPS: // esa conexión debería terminar en el equilibrador de carga, detrás del equilibrador de carga debería pasar todo el tráfico a través de una conexión sin cifrar.
Almacenamiento de archivos. Si un usuario sube una imagen, ¿a dónde va? ¿Simplemente se sienta en una máquina? Necesita alguna manera de compartir archivos instantáneamente entre máquinas: podría usar el servicio S3 de Amazon para almacenar todos sus archivos estáticos, o podría tener otro VPS que actuaría como un servidor de archivos, pero recomendaría S3 porque es redundante e increíblemente barato.
información de la sesión cada máquina en su configuración de equilibrador de carga debe poder acceder a la información de la sesión del usuario, porque nunca se sabe a qué máquina golpearán.
db: ¿tiene un servidor db separado? si solo tiene una máquina en este momento, ¿cómo se asegurará de que su nueva máquina tenga acceso al servidor db? Y si es un servidor VPS db separado, qué redundante es eso. No tiene necesariamente sentido tener front-end web de alta disponibilidad y un solo punto de falla con un servidor db, ahora también debe considerar la replicación db y la promoción de esclavos.
Así que he estado en tu lugar, ese es el problema con un sitio web que hace unos cientos de visitas al día a una operación real. Se vuelve complejo rápido. Espero que te haya dado algo de reflexión :)
fuente
Mi voto es para Linux Virtual Server como equilibrador de carga. Esto hace que el director de LVS sea un punto único de falla, así como un cuello de botella, pero
El costo puede mantenerse bajo haciendo que el primer director esté en la misma máquina que el primer nodo LVS, y el segundo director en la misma máquina que el segundo nodo LVS. Los nodos terceros y posteriores son nodos puros, sin implicaciones de LVS o HA.
Esto también le permite ejecutar cualquier software de servidor web que desee, ya que la redirección se realiza debajo de la capa de aplicación.
fuente
¿Qué tal esta cadena?
round robin dns> haproxy en ambas máquinas> nginx para separar archivos estáticos> apache
Posiblemente también use ucarp o heartbeat para garantizar que el haproxy siempre responda. Stunnel se sentaría frente a haproxy si necesita SSL también
fuente
Es posible que desee considerar el uso de un software de agrupación adecuado. Cluster Suite de RedHat (o CentOS) , o ClusterWare de Oracle . Estos pueden usarse para configurar clústeres activo-pasivos, y pueden usarse para reiniciar servicios, y fallar entre nodos cuando hay problemas serios. Esto es esencialmente lo que estás buscando.
Todas estas soluciones de clúster están incluidas en las respectivas licencias del sistema operativo, por lo que probablemente tenga un costo excelente. Requieren algún tipo de almacenamiento compartido, ya sea un montaje NFS o un disco físico al que acceden ambos nodos con un sistema de archivos en clúster. Un ejemplo de esto último serían los discos SAN con acceso de host múltiple permitido, formateados con OCFS2 o GFS . Creo que puede usar discos compartidos VMWare para esto.
El software de clúster se utiliza para definir 'servicios' que se ejecutan en nodos todo el tiempo, o solo cuando ese nodo está 'activo'. Los nodos se comunican a través de los latidos del corazón y también supervisan esos servicios. Pueden reiniciarlos si notan fallas y reiniciar si no pueden repararse.
Básicamente, configuraría una única dirección IP 'compartida' a la que se dirigiría el tráfico. Luego, apache y cualquier otro servicio necesario también se pueden definir y ejecutar solo en el servidor activo. El disco compartido se usaría para todo su contenido web, cualquier archivo cargado y sus directorios de configuración de apache. (con httpd.conf, etc.)
En mi experiencia, esto funciona increíblemente bien.
--Christopher Karel
fuente
El equilibrio de carga óptimo puede ser muy costoso y complicado. El equilibrio de carga básico solo debe garantizar que cada servidor atienda aproximadamente el mismo número de visitas en cualquier momento.
El método más simple de equilibrio de carga es proporcionar múltiples registros A en DNS. Por defecto, la dirección IP se configurará en un método round robin. Esto dará como resultado que los usuarios se distribuyan de manera relativamente uniforme entre los servidores. Esto funciona bien para sitios apátridas. Se requiere un método un poco más complejo cuando tiene un sitio con estado.
Para manejar requisitos con estado, puede usar redireccionamientos. Proporcione a cada servidor web una dirección alternativa como www1, www2, www3, etc. Redireccione la conexión www inicial a la dirección alternativa del host. Puede terminar con problemas de marcadores de esta manera, pero deberían estar distribuidos de manera uniforme en los servidores.
Alternativamente, el uso de una ruta diferente para indicar qué servidor está manejando la sesión con estado permitiría sesiones proxy que hayan cambiado el host al servidor original. Esto puede ser un problema cuando la sesión para un servidor fallido llega al servidor que se ha hecho cargo del servidor fallido. Sin embargo, salvo el software de agrupación, el estado se perderá de todos modos. Debido al almacenamiento en caché del navegador, es posible que no experimente muchas sesiones cambiando servidores.
La conmutación por error se puede manejar configurando el servidor para que se haga cargo de la dirección IP de un servidor fallido. Esto minimizará el tiempo de inactividad si falla un servidor. Sin el software de agrupamiento, las sesiones con estado se perderán si falla un servidor.
Sin la conmutación por error, los usuarios experimentarán un retraso hasta que su navegador falle a la siguiente dirección IP.
El uso de servicios Restful en lugar de sesiones con estado debería eliminar los problemas de agrupación en el front-end. Los problemas de agrupación en el lado del almacenamiento aún se aplicarían.
Incluso con equilibradores de carga frente a los servidores, es probable que tenga DNS round-robin frente a ellos. Esto asegurará que todos sus equilibradores de carga se utilicen. Agregarán otra capa a su diseño, con complejidad adicional y otro punto de falla. Sin embargo, pueden proporcionar algunas características de seguridad.
La mejor solución dependerá de los requisitos relevantes.
La implementación de servidores de imágenes para servir contenido como imágenes, archivos CSS y otro contenido estático puede facilitar la carga en los servidores de aplicaciones.
fuente
Generalmente uso un par de máquinas OpenBSD idénticas:
OpenBSD es ligero, estable y bastante seguro: perfecto para servicios de red.
Para comenzar, recomiendo una configuración de layer3. Evita complicaciones en la configuración del firewall (PF). Aquí hay un ejemplo de archivo /etc/relayd.conf que muestra la configuración de un simple balanceador de carga de relé con monitoreo de los servidores web de fondo:
fuente
¿Le ha dado ec2 con cloudfoundry o tal vez Elastic beanstalk o simplemente un viejo escalado automático de AWS? un pensamiento? He estado usando eso y se escala bastante bien y ser elástico puede aumentar / disminuir sin ninguna intervención humana.
Dado que usted dice que no tiene experiencia con el equilibrio de carga, sugeriría estas opciones, ya que requieren un mínimo de "freír" el cerebro para comenzar a funcionar.
Podría ser un mejor uso de tu tiempo.
fuente
pound
hasta hace muy poco, cuando creo que implementaron nginx. Tenga en cuenta que nginx podría implementarse para reemplazar Apache, o simplemente como una interfaz para Apache.