Sesiones en el balance de carga con HAProxy
En el artículo anterior vimos una breve introducción a la definición de Web y los problemas que puede solucionar el balance de carga con HAProxy y qué alternativas existen para realizar un balance.
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:
- HaProxy – http://haproxy.1wt.eu/
- Pound – http://www.apsis.ch/pound/
- NginX – http://nginx.org/
- Lighty – http://www.lighttpd.net/
- Apache – http://httpd.apache.org/
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.
Demasiado buenos los articulos, Felicidades sigan adelante!
estaremos esperando con ansias los proximos!
Hola he implementado correctamente el haproxy + keepalive en dos apache, parece que funciona perfectamente pero tengo un perqueño problema, aunque la sesión parece que se mantiene si paro uno de los apache me he fijado que el valor de las varialbes de sesión no se replicar y por ejemplo si uno tiene 2 y luego paro el otro al volver a encender el que tenía parado tiene 2 y no el valor que tenía el otro.
Por lo visto la sesión se guarda a nivel local en /var/lib/php5, cómo puedo conseguir que el contenido de las variables de sesión también sean persistentes?
Felicidades por los artículos
Gracias