Balance de carga con HAProxy
Cuando hablamos de "Web" nos referimos a un protocolo, HTTP y a distintas clases de contenidos que puede transportar ese protocolo como: imágenes, películas flash, o páginas en HTML. Sin embargo, HTTP no es el único protocolo utilizado en la web y se basa en protocolos inferiores para su funcionamiento. De esta forma, HTTP no debe preocuparse por cómo llegar a una máquina, pues esa lógica de transporte la delega a los protocolos inferiores.
Es necesario entender que por debajo de HTTP está el protocolo TCP y a nivel de TCP se habla de puertos, que sirven para identificar servicios en una misma máquina. Por debajo de TCP está el protocolo IP y a nivel del protocolo IP se habla de números de IP, que sirven para diferenciar máquinas en Internet.
Entonces, si se tiene un servidor web en 192.168.12.5:80, eso significa que el servidor podrá ser contactado en la IP 192.168.12.5 y que escuchará en el puerto 80. De esta forma, se puede instalar otro servidor, de mail por ejemplo, en la misma máquina pero escuhando en otro puerto, 192.168.12.5:25. Es el IP quien lleva los paquetes, y dentro de la máquina, TCP el que entrega los datagramas al servidor correspondiente.
Problemas que soluciona el balance de carga
El problema a solucionar es la sobrecarga de los servidores. Se puede balancear cualquier protocolo, pero dado que este sitio se centra en las tecnologías web, el artículo trata exclusivamente de balancear servidores HTTP.
Al mismo tiempo, si el balanceador detecta la caída de uno de los servidores web, puede optar por no enviarle más peticiones. De esta forma, si uno de los servidores web se cae, las peticiones del cliente no se dirigen al servidor caído.
Vemos que el balance de carga también contribuye a una infraestructura redundante y de alta disponibilidad (aunque no la asegura, el balance de carga por sí mismo no alcanza para tener HA1 ). En este punto creo conveniente introducir los conceptos básicos que se manejarán a lo largo del artículo:
- Balanceador: es un sistema, software o hardware, que distribuye las peticiones de los clientes de forma equitativa entre distintos servidores de “backend”.
- Servidor de backend: es un servidor (web en este caso), que responde la petición del usuario.
Así el balanceador distribuye las peticiones y son los servidores de backend, quienes arman la respuesta efectiva al cliente. Para balancear la carga entre varios servidores es deseable que el mismo balanceador sea justo (fair), y que detecte servidores sobrecargados para dejar de enviarle peticiones hasta que no baje su carga. Este mismo mecanismo sirve para que un balanceador no envíe peticiones a un servidor caído.
Alternativas para balancear
La forma más elemental de balancear la carga entre varios servidores esa utilizando el DNS. Por ejemplo, si buscamos la IP de www.yahoo.com.ar:
$ dig www.yahoo.com.ar ; <<>> DiG 9.7.0-P1 <<>> www.yahoo.com.ar ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21971 ;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 2, ADDITIONAL: 1 ;; QUESTION SECTION: ;www.yahoo.com.ar. IN A ;; ANSWER SECTION: www.yahoo.com.ar. 714 IN CNAME rc.yahoo.com. rc.yahoo.com. 127 IN CNAME rc.g01.yahoodns.net. rc.g01.yahoodns.net. 282 IN CNAME any-rc.a01.yahoodns.net. any-rc.a01.yahoodns.net. 6 IN A 206.190.60.37 any-rc.a01.yahoodns.net. 6 IN A 68.180.206.184 ;; AUTHORITY SECTION: a01.yahoodns.net. 53376 IN NS yf1.yahoo.com. a01.yahoodns.net. 53376 IN NS yf2.yahoo.com. ;; ADDITIONAL SECTION: yf2.yahoo.com. 1480 IN A 68.180.130.15 ;; Query time: 25 msec ;; SERVER: 200.49.130.30#53(200.49.130.30) ;; WHEN: Thu Feb 17 22:
Vemos que, en definitiva, son dos los servidores que responden: 68.180.206.184 y 206.190.60.37.
Este es el tipo de balanceo más elemental que se puede hacer, y tiene una ventaja muy importante: simplicidad y eficiencia; ya que en principio lo único que se necesitan son varios servidores con distintas IPs, por lo que es barato, simple y fácil de mantener. Sin embargo, el balance de carga por DNS tiene algunos inconvenientes. Por un lado, un balanceador puede tener en cuenta la carga de cada equipo y distribuir las peticiones según esas cargas, mientras que al balancear por DNS no se tiene en cuenta la carga de los equipos.
Además, si un servidor queda fuera de línea, el balanceador de carga lo detecta y redirige las peticiones web a los otros servidores. Pero esto no ocurre cuando se balancea con DNS (excepto que la aplicación sea consciente que se está balanceando y quiera probar con otro servidor, pero en este artículo hablamos de balance de carga transparente para la aplicación).
Por último, la mayoría de los balanceadores pueden mantener las sesiones de los usuarios, de forma que un usuario que inicia sesión en el servidor “A” siempre sea dirigido por el balanceador al mismo servidor “A” (de no hacerlo el usuario perdería la sesión). Sin embargo, el balance de carga por DNS es del tipo “Round Robin”, por lo que es casi seguro que el usuario pierda la sesión.
Una guía de 5 artículos
Esta es una guía de 5 artículos acerca del balance de carga para servidores web donde aprenderás cómo configurar un balance de carga con HAProxy y para qué sirve. Revisa los siguiente pasos.
Muy buen artículo, me gustó mucho
Excelente articulo!
Bueno el articulo, me quede con las ganas de leer los siguientes 4 artículos. 😉
Saludos,
EXCELENTE, tu post por favor escribe mas..
Excelente articulo, es un tema que nunca me he puesto a investigar, y desconocia como era que funcionaba la distribucion entre varios servidores. Muy bien redactado y bien explicado =), estare al tanto de los que siguen.
[…] 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 […]
¡Muchas gracias por las lecturas y los comentarios!
[…] Hace unos meses Matias escribió un post sobre HAProxy en el blog de Maestros del Web. […]