Dado que las sesiones se guardan en el backend, el balanceador debe dirigir a un usuario determinado siempre al mismo servidor de lo contrario, el usuario la perdería. Los balanceadores que preservan la sesión del usuario tienen la lógica suficiente para dirigir un usuario siempre al mismo servidor de backend.

El problema de las sesiones

Para mantener la sesión del usuario, los balanceadores generalmente insertan algún parámetro en una cookie del usuario (casi siempre en la de la sesión). Las conexiones sobre SSL están cifradas, ¿cómo obtener la cookie de sesión si la conexión está cifrada?

Para esto existen dos posibles soluciones: Por un lado se pueden dejar los certificados en el balanceador, o sea que la comunicación sea cifrada entre el cliente y el balanceador, y después la comunicación entre el balanceador y el backend puede o no ser cifrada.

La otra opción es balancear por origen, en este caso se balancea por IP:PUERTO de origen, o sea a nivel de TCP, por lo que no importa si la conexión está o no cifrada. Es la forma más sencilla de implementarlo.

Balanceadores

Existen varias alternativas para balancear HTTP por software. Antes de mencionarlas, veamos cuáles son algunas de las características deseables para un balanceador:

  • Soporte de sesiones, para que el usuario conserve la sesión.
  • Detectar servidores de backend caídos, para no dirigir peticiones a un servidor que está fuera de línea.
  • Detectar servidores con mucha carga, para balancear la carga equitativamente entre todos los servidores de backend y según sus recursos.
  • Algoritmos de balance, para elegir entre balance Roundrobin, por peso, por origen, etc.
  • Escalabilidad, para que sea fácil adicionar más servidores de backend o sitios hosteados.
  • ACLs por tipo de contenido, nombre de dominio, etc., para filtrar contenido, o dirigir las peticiones por contenido estático a un servidor en particular, etc.

Opciones para balancear libremente

Veamos algunas aplicaciones OpenSource que sirven para balancear la carga:

Los dos primeros son balanceadores y proxy, pueden balancear HTTP y TCP.

Los últimos tres son servidores web. De estos, Apache puede balancear utilizando mod_proxy con mod_proxy_balancer. O sea que son necesarios módulos extras para que balancee. Lighttpd (o Lighty) es un servidor web liviano que soporta balance de carga pero no mantiene la sesión del usuario. Por último, nginX, es otro servidor web liviano que balancea, pero a diferencia de Lighty, sí soporta sesiones.

Todos estos productos son OpenSource (Licencias GPL, LGPL, BSD, etc) y de ellos sólo Apache requiere de módulos extras para lograr el balance. De entre estas opciones, voy a elegir HaProxy para este artículo. Por un lado, porque ha demostrado ser muy estable y es con el que más experiencia tengo; y por otro, HAProxy tiene una interface web con estadísticas de tráfico, lo cual es bastante útil para tener una idea del tráfico que pasa por el balanceador, así como el \emph{uptime} y \emph{downtime} de los backends.

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