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 keepalivedConfirmé que el servicio estuviera parado antes de configurar:
sudo systemctl stop keepalived
sudo systemctl disable keepalivedConfiguració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 0Permisos:
sudo chmod +x /usr/local/bin/check_service.shIniciando keepalived#
sudo systemctl start keepalived
sudo systemctl enable keepalivedVerifiqué que la VIP estuviera asignada en el maestro:
ip addr showDeberí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.