Alta disponibilidad con HAProxy y Keepalived: configuración y failover automático
Implementación de soluciones de alta disponibilidad mediante HAProxy y Keepalived con ejemplos de configuración y detección de fallos automáticos para entornos empresariales.
Alta disponibilidad con HAProxy y Keepalived: configuración y failover automático
La alta disponibilidad es un requisito no negociable en infraestructuras modernas. Cuando trabajas con cargas críticas, una sola instancia de un balanceador de carga es un punto único de fallo. HAProxy maneja el balanceo de tráfico con eficiencia comprobada, pero sin un mecanismo de failover, cualquier caída en el nodo principal tira abajo la distribución completa. Keepalived resuelve exactamente este problema mediante VRRP (Virtual Router Redundancy Protocol).
Arquitectura y conceptos fundamentales
La combinación HAProxy + Keepalived crea un cluster redundante donde múltiples nodos comparten una IP virtual (VIP). Keepalived monitorea la salud de los servicios y promueve automáticamente el nodo standby a maestro cuando detecta problemas. El proceso es transparente: los clientes nunca pierden conectividad porque la VIP sigue activa.
Componentes clave
HAProxy actúa como reverse proxy y load balancer L7. Distribuye conexiones entrantes entre servidores backend y proporciona health checks granulares. Su eficiencia radica en que procesa conexiones en userspace sin syscalls innecesarias.
Keepalived implementa VRRP para redundancia. Mantiene sincronización de estado entre nodos, detecta fallos en servicios críticos y ejecuta scripts personalizados en eventos de transición.
Configuración práctica de HAProxy
El archivo de configuración de HAProxy es straightforward pero requiere precisión. Utilizamos secciones frontend para escuchar tráfico entrante y backend para definir servidores destino.
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
maxconn 4096
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
errorfile 400 /etc/haproxy/errors/400.http
frontend web_frontend
bind *:80
bind *:443 ssl crt /etc/ssl/certs/combined.pem
mode http
option forwardfor
default_backend web_servers
backend web_servers
mode http
balance roundrobin
option httpchk GET /health HTTP/1.1\r\nHost:\ example.com
http-check expect status 200
server web01 192.168.1.10:8080 check inter 2000 rise 2 fall 3
server web02 192.168.1.11:8080 check inter 2000 rise 2 fall 3
server web03 192.168.1.12:8080 check inter 2000 rise 2 fall 3 backup
Puntos críticos en esta configuración:
- httpchk define un health check HTTP específico. Esto permite validar la aplicación real, no solo TCP.
- rise 2 fall 3 indica que un servidor necesita 2 checks exitosos para considerarse up, pero 3 fallos para marcarlo down.
- inter 2000 establece intervalos de 2 segundos entre checks. Ajusta según la sensibilidad deseada.
Configuración de Keepalived
Keepalived maneja la redundancia entre dos nodos con HAProxy. El nodo maestro mantiene la VIP activa mientras el standby aguarda.
global_defs {
router_id HAPROXY_LB
script_user root
enable_script_security
}
vrrp_script check_haproxy {
script "/usr/local/bin/check_haproxy.sh"
interval 2
weight -20
fall 3
user root
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass your_secure_pass_12345
}
virtual_ipaddress {
192.168.1.100/24 dev eth0 label eth0:vip
}
track_script {
check_haproxy
}
notify_master "/usr/local/bin/notify_master.sh"
notify_backup "/usr/local/bin/notify_backup.sh"
notify_fault "/usr/local/bin/notify_fault.sh"
}
En el nodo standby, cambia state MASTER por state BACKUP y reduce priority a 100. Esto garantiza que el master siempre gana las elecciones VRRP.
Script de monitoreo personalizado
El corazón del failover automático es un script que valida que HAProxy esté realmente funcional:
#!/bin/bash
HAPROXY_PID=$(pidof haproxy)
TIMEOUT=5
if [ -z "$HAPROXY_PID" ]; then
systemctl start haproxy
sleep 2
HAPROXY_PID=$(pidof haproxy)
if [ -z "$HAPROXY_PID" ]; then
echo "CRITICAL: HAProxy failed to start" >> /var/log/keepalived.log
exit 1
fi
fi
# Verifica conectividad con backend
timeout $TIMEOUT curl -s -f http://localhost/health > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "WARNING: Health check failed" >> /var/log/keepalived.log
exit 1
fi
exit 0
Este script hace dos cosas: asegura que HAProxy esté running y valida que pueda alcanzar sus propios backends. Si falla, Keepalived reduce su prioridad y el otro nodo asume el rol maestro.
Validación y troubleshooting
Después de desplegar, verifica el estado de VRRP:
ip addr show
ip route show
tcpdump -i eth0 -n proto 112 # VRRP usa protocolo 112
Monitorea la transición de estados con:
journalctl -u keepalived -f
tail -f /var/log/haproxy.log
Un error común es la configuración de firewall bloqueando VRRP (protocolo 112). Asegúrate de permitir multicast en la subred y el protocolo correspondiente.
Consideraciones de producción
Implementa notificaciones via scripts que envíen alertas a Slack o email cuando ocurran cambios de estado. Mantén logs detallados de transiciones para auditoría. Realiza failovers programados regularmente para validar que tu standby funciona correctamente.
La sincronización de configuración entre nodos es crítica. Usa Ansible o similar para garantizar que ambos nodos siempre ejecuten versiones idénticas de HAProxy y Keepalived.
Conclusión
HAProxy + Keepalived proporciona alta disponibilidad sin dependencias de infraestructura propietaria. La configuración es simple pero la robustez es empresarial. Con health checks bien diseñados y scripts de validación personalizados, logras