Load Balancing con HAProxy y Health Checks
Configura HAProxy como load balancer de alto rendimiento con health checks activos, sticky sessions y SSL termination para distribucion resiliente de servicios
Distribuye trafico entrante entre multiples servidores backend usando HAProxy, un load balancer TCP/HTTP de alto rendimiento. Esta recipe cubre distribucion round-robin, health checks activos, sticky sessions y SSL termination para resiliencia production-grade.
Cuando Usar Esto
- Corres multiples instancias de aplicacion y necesitas distribuir trafico equitativamente. Consulta Health Check Endpoint para health probes de backend.
- Los servicios deben removerse automaticamente de rotacion cuando esten unhealthy. Consulta Circuit Breaker para aislamiento de fallos.
- SSL termination deberia ocurrir en el edge, no en cada servidor de aplicacion. Consulta Nginx Reverse Proxy para patrones de proxy edge.
Solucion
1. Configuracion Basica de HAProxy
# haproxy.cfg
global
log stdout local0
maxconn 4096
defaults
mode http
timeout connect 5s
timeout client 30s
timeout server 30s
option httpchk GET /health
frontend web_frontend
bind *:80
default_backend app_servers
backend app_servers
balance roundrobin
server web1 10.0.1.10:3000 check
server web2 10.0.1.11:3000 check
server web3 10.0.1.12:3000 check
2. Health Checks Activos
backend app_servers
balance roundrobin
option httpchk GET /health
# Marca como down despues de 2 checks fallidos; up despues de 3 exitosos
default-server inter 5s fall 2 rise 3
server web1 10.0.1.10:3000 check
server web2 10.0.1.11:3000 check
server web3 10.0.1.12:3000 check
3. Sticky Sessions con Cookies
backend app_servers
balance roundrobin
cookie SERVERID insert indirect nocache
server web1 10.0.1.10:3000 check cookie web1
server web2 10.0.1.11:3000 check cookie web2
server web3 10.0.1.12:3000 check cookie web3
4. SSL Termination
frontend web_frontend
bind *:443 ssl crt /etc/ssl/certs/site.pem
http-request redirect scheme https unless { ssl_fc }
default_backend app_servers
5. Dashboard de Stats
listen stats
bind *:8404
stats enable
stats uri /stats
stats refresh 10s
Como Funciona
- Frontend escucha en un puerto y recibe conexiones de clientes
- Backend define el pool de servidores y el algoritmo de balanceo
- Health checks envian requests periodicos; servidores fallidos se remueven
- Cookie insertion pinnea un usuario a un backend especifico para session affinity
Variacion: Load Balancing Ponderado
backend app_servers
balance roundrobin
server web1 10.0.1.10:3000 check weight 3
server web2 10.0.1.11:3000 check weight 2
server web3 10.0.1.12:3000 check weight 1
Consideraciones de Produccion
- Corre HAProxy en active-passive con keepalived para failover
- Usa
leastconnpara conexiones WebSocket de larga duracion - Habilita compresion con
compression algo gzip
Errores Comunes
- Olvidar exponer un endpoint
/healthen las aplicaciones - Usar source IP affinity detras de NAT donde todos los clientes comparten una IP
- No monitorear la pagina de stats para degradacion de backends
Tips de Rendimiento
- Ajusta
maxconnsegún la memoria disponible. Cada conexión usa ~200 bytes. Para 10K conexiones, asigna ~2MB:
global
maxconn 10000
nbproc 4 # Usar múltiples procesos para CPUs multi-core
- Usa
nbthreadpara modo multi-thread. HAProxy 2.0+ soporta threads:
global
nbthread 4
cpu-map auto:1/1-4 0-3
- Habilita
splice-requestysplice-responsepara TCP. Usa kernel splice para zero-copy forwarding:
defaults
mode tcp
option splice-request
option splice-response
- Usa
tune.ssl.default-dh-parampara rendimiento SSL. Establece a 2048 o superior:
global
tune.ssl.default-dh-param 2048
- Monitorea con el stats socket de HAProxy. Exporta métricas a Prometheus para alerting:
# Habilitar stats socket
echo "stats socket /var/run/haproxy.sock mode 660 level admin" >> haproxy.cfg
# Consultar stats
echo "show info" | socat /var/run/haproxy.sock -
echo "show servers state" | socat /var/run/haproxy.sock - Preguntas frecuentes
En que se diferencia de Nginx?
HAProxy se especializa en load balancing layer 4/7 con granularidad superior de health checks. Nginx es un servidor web de proposito general que tambien hace proxy.
Puedo usar HAProxy con Docker?
Si. Usa la imagen oficial haproxy y monta tu haproxy.cfg como volumen.
Recursos Relacionados
Patrón Ambassador: Llamadas Resilientes vía Proxy Local
Descarga reintentos, timeouts y circuit breaker a un ambassador local que envuelve las llamadas remotas, manteniendo clientes delgados y políticas consistentes.
RecipeConfigura Nginx como Reverse Proxy y API Gateway
Como usar Nginx como reverse proxy para servicios backend, implementar balanceo de carga, terminacion SSL y rate limiting para API gateways de produccion
PatternPatrón Circuit Breaker en Python, JavaScript y Java
Previene fallos en cascada deteniendo solicitudes a servicios que están fallando. Un patrón arquitectural para sistemas distribuidos resilientes.
RecipeScripts de Bash para AWS CLI
Un conjunto de scripts de Bash que envuelven AWS CLI para aprovisionar, etiquetar, auditar y limpiar recursos de AWS, incluidos despliegues multi-cuenta.
RecipeReceta: Optimización de Costos Cloud
Reduce costos de infraestructura cloud con right-sizing, instancias reservadas, spot instances y scheduling automatizado en AWS, GCP y Azure.
RecipeProvisionar una VPC de AWS con Terraform
Cómo usar Terraform para provisionar una VPC de AWS lista para producción con subredes públicas y privadas, NAT gateways y security groups