← Volver al blog

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