¿Qué es HAProxy?
HAProxy (proxy de alta disponibilidad) es un equilibrador de carga de código abierto que puede equilibrar la carga de cualquier servicio TCP. HAProxy es una solución gratuita, muy rápida y fiable que ofrece equilibrio de carga, alta disponibilidad y proxy para aplicaciones basadas en TCP y HTTP. Es especialmente adecuado para sitios web de muy alto tráfico y potencia muchos de los más visitados del mundo.
Desde su existencia, se ha convertido en el equilibrador de carga de código abierto estándar de facto. Aunque no se anuncia a sí mismo, pero se usa ampliamente. A continuación se muestra un diagrama básico de cómo se ve la configuración:
Instalando HAProxy
Estoy usando Ubuntu 14.04 y lo instalo por:
apt-get install haproxy
Puede comprobar la versión por:
haproxy -v
Necesitamos habilitar HAProxy para que se inicie mediante el script de inicio /etc/default/haproxy. Establezca la opción HABILITADO en 1 como:
ENABLED=1
Para verificar si este cambio se realiza correctamente, ejecute el script de inicio de HAProxy sin ningún parámetro. Debería ver lo siguiente:
$ service haproxy <press_tab_key>
reload restart start status stop
HAProxy ya está instalado. Ahora creemos una configuración en la que tenemos 2 (dos) instancias de servidor web Apache y 1 (una) instancia de HAProxy. A continuación se muestra la información de configuración:
Usaremos tres sistemas, generados virtualmente a través de VirtualBox:
Instancia 1:Equilibrador de carga
Nombre de host:haproxy
SO:Ubuntu
IP privada:192.168.205.15
Instancia 2 - Servidor web 1
Nombre de host:webser01
SO:Ubuntu con LAMP
IP privada:192.168.205.16
Instancia 2 - Servidor web 2
Nombre de host:webserver02
SO:Ubuntu con LAMP
IP privada:192.168.205.17
Este es el diagrama de cómo se ve la configuración:
Ahora configuremos HAProxy.
Configuración de HAProxy
Haga una copia de seguridad del archivo original cambiándole el nombre:
mv /etc/haproxy/haproxy.cfg{,.original}
Crearemos nuestro propio archivo haproxy.cfg. Con su editor de texto favorito, cree el archivo /etc/haproxy/haproxy.cfg como:
global log /dev/log local0 log 127.0.0.1 local1 notice maxconn 4096 user haproxy group haproxy daemon defaults log global mode http option httplog option dontlognull retries 3 option redispatch maxconn 2000 contimeout 5000 clitimeout 50000 srvtimeout 50000 listen webfarm 0.0.0.0:80 mode http stats enable stats uri /haproxy?stats balance roundrobin option httpclose option forwardfor server webserver01 192.168.205.16:80 check server webserver02 192.168.205.17:80 check
Explicación:
global log /dev/log local0 log 127.0.0.1 local1 notice maxconn 4096 user haproxy group haproxy daemon
La directiva de registro menciona un servidor syslog al que se enviarán los mensajes de registro.
La directiva maxconn especifica el número de conexiones simultáneas en el front-end. El valor predeterminado es 2000 y debe ajustarse de acuerdo con la configuración de su sistema.
Las directivas de usuario y grupo cambian el proceso HAProxy al usuario/grupo especificado. Estos no deben cambiarse.
defaults log global mode http option httplog option dontlognull retries 3 option redispatch maxconn 2000 contimeout 5000 clitimeout 50000 srvtimeout 50000
La sección anterior tiene los valores predeterminados. La opción de reenvío permite la redistribución de la sesión en caso de fallas en la conexión. Por lo tanto, la permanencia de la sesión se anula si una instancia del servidor web deja de funcionar.
La directiva de reintentos establece el número de reintentos a realizar en una instancia de servidor web después de una falla de conexión.
Los valores a modificar son las distintas directivas de tiempo de espera. La opción contimeout especifica el tiempo máximo de espera para que un intento de conexión a una instancia de servidor web tenga éxito.
clitimeout y srvtimeout se aplican cuando se espera que el cliente o servidor reconozca o envíe datos durante el proceso TCP. HAProxy recomienda establecer los tiempos de espera del cliente y del servidor en el mismo valor.
listen webfarm 0.0.0.0:80 mode http stats enable stats uri /haproxy?stats balance roundrobin option httpclose option forwardfor server webserver01 192.168.205.16:80 check server webserver02 192.168.205.17:80 check
El bloque anterior contiene la configuración tanto para el frontend como para el backend. Estamos configurando HAProxy para escuchar en el puerto 80 para webfarm, que es solo un nombre para identificar una aplicación.
Las directivas stats habilitan la página de estadísticas de conexión. Esta página se puede ver con la URL mencionada en stats uri, por lo que en este caso, es http://192.168.205.15/haproxy?stats se puede ver una demostración de esta página aquí.
La directiva de equilibrio especifica el equilibrio de carga algoritmo a utilizar. Las opciones de algoritmo disponibles son:
- Round Robin (todo contra todos),
- Round Robin estático (static-rr),
- Conexiones mínimas (leastconn),
- Fuente (fuente),
- URI (uri) y
- Parámetro de URL (url_param).
La información sobre cada algoritmo se puede obtener de la documentación oficial.
La directiva del servidor declara un servidor backend, la sintaxis es:
server <server_name> <server_address>[:port] [param*]
El nombre que mencionamos aquí aparecerá en registros y alertas. Hay algunos parámetros más admitidos por esta directiva y usaremos el parámetro de verificación en este artículo. La opción de verificación habilita las comprobaciones de estado en la instancia del servidor web; de lo contrario, la instancia del servidor web "siempre se considera disponible".
Una vez que haya terminado de configurar, inicie el servicio HAProxy:
sudo service haproxy start
Prueba de equilibrio de carga y conmutación por error
Agregaremos el nombre del servidor en el archivo index.html predeterminado ubicado de manera predeterminada en /var/www/index.html
En la Instancia 2 - Servidor web 1 (webserver01 con IP- 192.168.205.16), agregue la siguiente línea como:
sudo sh -c "echo \<h1\>Hostname: webserver01 \(192.168.205.16\)\<\/h1\> >> /var/www/index.html"
En la Instancia 3 - Web Server 2 (webserver02 con IP- 192.168.205.17), agregue la siguiente línea como:
sudo sh -c "echo \<h1\>Hostname: webserver02 \(192.168.205.17\)\<\/h1\> >> /var/www/index.html"
Ahora abra el navegador web en la máquina local y navegue a través de la IP haproxy, es decir, http://192.168.205.15
Cada vez que actualice la pestaña, verá que la carga se distribuye a cada servidor web. A continuación se muestra una captura de pantalla de mi navegador:
Por primera vez, cuando visito http://192.168.205.15, obtengo:
Y por segunda vez, es decir, cuando actualizo la página, obtengo:
También puede consultar las estadísticas de haproxy visitando http://192.168.205.15/haproxy?stats
Hay más que puede hacer con esta configuración. Algunas ideas incluyen:
- desconecta uno o ambos servidores web para probar qué sucede cuando accedes a HAProxy
- configurar HAProxy para servir una página de mantenimiento personalizada
- configure la interfaz web para que pueda monitorear visualmente las estadísticas de HAProxy
- cambiar el programador a algo que no sea turno rotatorio
- configurar priorización/pesos para servidores particulares
¡Eso es todo!