Balance de carga con HAProxy: Instalación
Siguiendo con la serie de artículos sobre el Balance de carga con HAProxy y Sesiones en el Balance de carga con HAProxy en este tercer capítulo veremos la instalación del sistema base, configuraciones y el problema.
Instalación del sistema base
El entorno para este artículo es:
- 192.168.0.121 – Backend1 – LAMP
- 192.168.0.122 – Backend2 – LAMP
- 192.168.0.123 – Balanceador – HAProxy
En los tres casos se trata de máquinas Ubuntu 10.10. Los firewalls están desactivados para hacer las cosas menos engorrosas. Voy a asumir que ya está instalado este entorno.
Ahora que hemos definido el escenario de testing, pasemos a la instalación del balanceador.
Configuración del balanceador y backends
Podemos instalar HAProxy con un manejador de paquetes. Por ejemplo, en Ubuntu podemos buscarlo:
<pre>$ apt-cache search haproxy haproxy - fast and reliable load balancing reverse proxy</pre>
Y luego instalarlo:
<pre>$ sudo apt-get install haproxy</pre> Si no, dado que HAProxy es OpenSource, podemos bajar el código de la web y compilarlo.
El mismo instalador deja un archivo con una configuración por default en:
<pre>/etc/haproxy/haproxy.cfg</pre>
Las opciones de configuración son muchas y no pretendemos verlas todas aquí, por lo que voy a detallar el problema a solucionar y ver cuál sería la configuración para eso.
El problema
- Se requiere balancear entre dos servidores web donde backend2 soporta más carga que backend1. Es decir, el balance no puede ser RoundRobin ni por origen, sino por peso.
- La aplicación hosteada en los dos servidores usa sesiones. Por lo tanto, la solución debe soportar sesiones.
- Además, el balanceador deberá reconocer cuando un backend está caído y dejar de enviarle peticiones.
- Por último, todas las imágenes están cargadas en backend1.
Quizás no sea un entorno realista, pero sirve para ilustrar varios puntos en la configuración de HAProxy.
Configuración de HAProxy
En este artículo asumimos que la configuración de los servidores web de backend ya está hecha. De todas formas, no es necesario cambiar nada en los backend para implementar este escenario de balance de carga.
Primero abrimos el archivo de configuración de HAProxy:
<pre>vi /etc/haproxy/haproxy.cfg</pre> Y escribimos la siguiente configuración: <pre># PARTE 1. Comienza configuracion estandar global log 127.0.0.1 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 # # PARTE 2. Comienza configuracion propia # stats enable stats auth matias:3ik</pre> <pre>frontend webfarm bind 192.168.0.123:80 default_backend servidores</pre> <pre> # Esta ACL matchea con los archivos de imagenes acl url_static path_end .gif .png .jpg</pre> <pre> # Mando las peticiones al backend imagenes, donde estan todas las imagenes. use_backend imagenes if url_static</pre> <pre>backend servidores cookie PHPSESSID prefix balance roundrobin option httpclose option forwardfor option httpchk HEAD /check.txt HTTP/1.0 server backend1 192.168.0.121:80 weight 1 cookie A check source 192.168.0.123 inter 1000 server backend2 192.168.0.122:80 weight 2 cookie B check source 192.168.0.123 inter 1000</pre> <pre>backend imagenes balance roundrobin option httpclose option forwardfor option httpchk HEAD /check.txt HTTP/1.0 server imagenes1 192.168.0.121:80 weight 5 check source 192.168.0.123 inter 1000</pre> Habilitamos el servicio (tratandose de un servidor Debian/Ubuntu) poniendo ENABLED=1 en /etc/default/haproxy.
Reiniciamos el servicio:
<pre>/etc/init.d/haproxy restart</pre>
¡Y está listo! Sin embargo, antes de seguir, quisiera explicar un poco la configuración de arriba.
Para el siguiente artículo veremos más acerca de la instalación y configuración del balanceador en HaProxy.
Una alternativa a usar el haproxy (que tiene como ventajas el ser bastante “barato” en recursos, y de facil configuracion) es usar varnish (http://varnish-cache.org), donde no solo se balancea entre distintos servidores, sino que ademas se pueden cachear resultados, decidir distintos backends en base a los pedidos, modificar cabezales y otra gran cantidad de funcionalidades extra.
Su configuracion tiene un enfoque distinto, es mas programa (que de hecho, se compila a codigo C al cargarla) que configuracion estatica. No tiene una interfaz visual como la del haproxy para ver el estado actual del balanceo, aunque hay herramientas para ver el estado actual. Y como puede preservar en memoria recursos servidos, puede usar bastante mas memoria. Pero para sitios de alto trafico probablemente sea una mejor opcion.
¡Hola!
No probé Varnish, pero ya me lo habían recomendado hace unos meses, así que le voy a dar una ojeada
Por lo de enviar las peticiones a distintos backends, eso también lo podés hacer con HAProxy, en base al “peso” de cada backend, al algoritmo que uses para balancear (por origen, round robin, etc.) y si no por ACLs (En el ejemplo, aplicadas a archivos de imágenes).
En cuanto a la manipulación de los headers de HTTP, eso también se puede hacer, aunque me parece que en este caso sí está un poco limitado. Eso está en la sección 6 (HTTP header manipulation) del manual de configuración, en:
http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
¡Gracias por la lectura y el comentario!
Hola amigos,
Interesantte el articulo, justo asi estaba buscando como hacer un balanceo de carga, pero aplicado para replicas. Si tiene la misma logica seria super, ire revisando mas. Gracias Matias por el articulo.
Saludos
Gildus