Ir al contenido

Failover Automático con Keepalived: Alta Disponibilidad en Casa

Rogelio Guerra Riverón
Autor
Rogelio Guerra Riverón
Construyendo mi propia infraestructura web desde cero. Aquí documento cada paso: servidores, redes, contenedores y lo que vaya surgiendo.

El problema
#

Tengo dos servidores en casa corriendo servicios críticos. Un día uno falla y pierdo acceso a todo durante horas. Eso no puede pasar. Necesitaba algo simple que detectara cuando un servidor cae y automáticamente activara el otro sin intervención manual.

Keepalived es exactamente eso: un daemon que monitorea la salud de tus servidores y mueve una IP virtual (VIP) entre ellos cuando algo falla. Sin complejidad de Kubernetes ni infraestructura pesada.

La arquitectura
#

Dos servidores Linux idénticos. Uno activo, uno en standby. Comparten una IP virtual flotante. Los clientes se conectan a esa VIP. Cuando el activo muere, keepalived lo detecta en segundos y la VIP salta al standby. Transparente para los clientes.

Instalación en ambos servidores
#

sudo apt update
sudo apt install keepalived

Confirmé que el servicio estuviera parado antes de configurar:

sudo systemctl stop keepalived
sudo systemctl disable keepalived

Configuración del servidor MAESTRO
#

Edité /etc/keepalived/keepalived.conf:

global_defs {
    router_id MASTER_SERVER
    script_user root
    enable_script_security
}

vrrp_script check_service {
    script "/usr/local/bin/check_service.sh"
    interval 2
    weight -20
    fall 3
    rise 2
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass serviciosrogeliowar
    }
    virtual_ipaddress {
        192.168.1.100/24
    }
    track_script {
        check_service
    }
}

La parte crítica es la priority en 100. El maestro tiene prioridad más alta.

Configuración del servidor ESCLAVO
#

Mismo archivo, pero:

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass serviciosrogeliowar
    }
    virtual_ipaddress {
        192.168.1.100/24
    }
    track_script {
        check_service
    }
}

Notar state BACKUP y priority 50. El virtual_router_id debe ser idéntico en ambos.

Script de monitoreo
#

Creé /usr/local/bin/check_service.sh para verificar que los servicios realmente funcionan:

#!/bin/bash

# Revisar que el servicio está corriendo
systemctl is-active --quiet nginx || exit 1
systemctl is-active --quiet mysql || exit 1

# Verificar conectividad básica
curl -s http://localhost/health > /dev/null || exit 1

exit 0

Permisos:

sudo chmod +x /usr/local/bin/check_service.sh

Iniciando keepalived
#

sudo systemctl start keepalived
sudo systemctl enable keepalived

Verifiqué que la VIP estuviera asignada en el maestro:

ip addr show

Debería ver 192.168.1.100 en la interfaz eth0 del servidor maestro.

Prueba del failover
#

Desconecté el servidor maestro de la red. En menos de 3 segundos, la VIP migró al esclavo. Conecté una sesión SSH a la VIP y funcionó sin interrupciones.

Luego reinicié el maestro y la VIP volvió a él automáticamente (porque tiene mayor prioridad).

Consideraciones importantes
#

Sincronización de datos: Keepalived solo maneja la IP. Tus datos y configuración deben estar sincronizados entre servidores. Yo uso rsync con cron cada 5 minutos para archivos críticos.

Logs: Monitorizaré /var/log/syslog para mensajes de keepalived. Te indica exactamente cuándo ocurren transiciones.

Firewall: Keepalived usa VRRP (protocolo 112). Asegurate que no esté bloqueado entre los servidores.

Conclusión
#

Con menos de 50 líneas de configuración, eliminé un punto único de fallo. El failover es automático, rápido y transparente. Perfectamente viable para infraestructura doméstica sin complejidad innecesaria.