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.

  1. Balance de carga con HAProxy
  2. Sesiones en el balance de carga con HAProxy
  3. Balance de carga con HAProxy: Instalación
  4. Balance de carga con HAProxy: Configuración
  5. Balance de carga con HAProxy: Prueba de instalación y conclusiones