Instalación en Alta Disponibilidad (Failover Básico)
Esta guía cubre la instalación de Netsocs en dos nodos Linux en una configuración activo-pasivo de alta disponibilidad. Si el Nodo A (maestro) falla, el Nodo B (backup) toma el control automáticamente y Netsocs continúa funcionando sin intervención manual.
Alcance de esta guía
Esta configuración cubre el failover de la capa de aplicación únicamente (stack Docker + archivos compartidos + IP Virtual). Las bases de datos (MySQL, MongoDB, Redis) se asumen en servidores externos y no forman parte de esta configuración.
Requisitos¶
Ambos nodos deben tener¶
- Ubuntu 20.04+ o Debian 11+ (o compatible)
- Docker Engine ≥ 24.x instalado
- Plugin Docker Compose instalado
- El repositorio
netsocs-docker-composeclonado en la misma ruta en ambos nodos (recomendado:/opt/netsocs) - Conectividad de red entre ambos nodos (ping mutuo)
Puertos a abrir entre nodos¶
| Puerto | Protocolo | Dirección | Propósito |
|---|---|---|---|
| 112 | VRRP | Ambas | Heartbeat de Keepalived |
| 2049 | TCP/UDP | Nodo B → Nodo A | NFS (volúmenes compartidos) |
| 111 | TCP/UDP | Nodo B → Nodo A | Portmapper NFS |
Información que necesitarás tener lista¶
| Variable | Descripción | Ejemplo |
|---|---|---|
NODE_A_IP |
IP real del Nodo A (maestro) | 192.168.1.10 |
NODE_B_IP |
IP real del Nodo B (backup) | 192.168.1.11 |
VIP_ADDRESS |
IP Virtual flotante — no debe estar en uso | 192.168.1.100 |
NETWORK_IFACE |
Nombre de la interfaz de red en ambos nodos | eth0 / ens3 |
AUTH_PASS |
Contraseña VRRP compartida (máximo 8 caracteres) | Ns3c2024 |
La VIP debe estar libre
La VIP_ADDRESS debe ser una IP que no esté asignada a ningún dispositivo en tu red. Ambos nodos deben estar en la misma subred que esta IP.
Paso 1 — Configurar el Nodo A (Maestro)¶
En el Nodo A, navega al directorio del proyecto Netsocs y ejecuta el script de configuración como root:
cd /opt/netsocs
sudo bash failover/start-as-master.sh
El script pedirá los valores requeridos de forma interactiva. Si prefieres definirlos antes de ejecutar, expórtalos como variables de entorno:
export NODE_A_IP="192.168.1.10"
export NODE_B_IP="192.168.1.11"
export VIP_ADDRESS="192.168.1.100"
export NETWORK_IFACE="eth0"
export AUTH_PASS="Ns3c2024"
sudo bash failover/start-as-master.sh
Qué hace el script en el Nodo A¶
- Instala y configura un servidor NFS para compartir los volúmenes de Netsocs con el Nodo B
- Crea el symlink
compose.override.ymlpara activar los volúmenes respaldados por NFS - Levanta el stack Docker (
docker compose up -d) - Instala Keepalived y genera su configuración (modo MASTER, prioridad 100)
- Inicia Keepalived y asigna la IP Virtual al Nodo A
- Coloca los scripts
notify-master.sh,notify-backup.shyhealth-check.shen/etc/keepalived/
Cuando el script finaliza, el Nodo A está activo y atendiendo tráfico en la VIP.
Paso 2 — Configurar el Nodo B (Backup)¶
En el Nodo B, navega al directorio del proyecto Netsocs y ejecuta el script de backup como root. Usa los mismos valores exactos que usaste en el Nodo A:
cd /opt/netsocs
sudo bash failover/start-as-backup.sh
Qué hace el script en el Nodo B¶
- Instala el cliente NFS y monta los 8 volúmenes compartidos desde el Nodo A (persistidos en
/etc/fstab) - Crea el symlink
compose.override.yml(igual que en el Nodo A) - Instala Keepalived y genera su configuración (modo BACKUP, prioridad 50)
- Inicia Keepalived en modo espera — el stack Docker no se inicia
- Coloca los mismos scripts de notificación y health-check en
/etc/keepalived/
Stack Docker en el Nodo B
El stack de Netsocs no corre en el Nodo B durante la operación normal. Keepalived lo iniciará automáticamente mediante notify-master.sh cuando el Nodo B tome la VIP.
Verificación¶
Una vez que ambos scripts hayan completado, realiza estas comprobaciones.
Verificar que el Nodo A tiene la VIP¶
En el Nodo A:
ip addr show eth0 | grep 192.168.1.100
# La VIP debe aparecer en la interfaz
Verificar el estado de Keepalived¶
En cualquiera de los nodos:
systemctl status keepalived
journalctl -u keepalived -f
Verificar los montajes NFS en el Nodo B¶
En el Nodo B:
df -h | grep netsocs-nfs
# Debe mostrar 8 montajes NFS
Acceder a Netsocs¶
Desde cualquier navegador en tu red, accede a la dirección VIP:
http://192.168.1.100
Comportamiento del Failover¶
El sistema sigue un modelo activo-pasivo:
Estado normal:
Nodo A → MASTER → tiene la VIP → stack corriendo → atiende tráfico
Nodo B → BACKUP → en espera → stack detenido
Nodo A falla:
Nodo B → toma la VIP → notify-master.sh → docker compose up -d
Nodo B → MASTER → stack corriendo → atiende tráfico
Nodo A se recupera:
Nodo A → recupera la VIP (preempt) → notify-master.sh → docker compose up -d
Nodo B → libera la VIP → notify-backup.sh → docker compose down
Vuelta al estado normal
El tiempo de failover es de aproximadamente 3–6 segundos.
Probar el Failover Manualmente¶
Simular la falla del Nodo A¶
En el Nodo A:
systemctl stop keepalived
En el Nodo B (en ~5 segundos):
# La VIP debe aparecer en el Nodo B
ip addr show eth0 | grep 192.168.1.100
# El stack Docker debe estar corriendo
docker compose ps
# Revisar el log del evento de failover
tail -20 /var/log/keepalived-failover.log
Restaurar el Nodo A como maestro¶
En el Nodo A:
systemctl start keepalived
# El Nodo A recupera la VIP automáticamente por preempt (~10 segundos)
En el Nodo B:
# La VIP ya no debe estar en el Nodo B
ip addr show | grep 192.168.1.100 # no debe mostrar nada
# El stack debe estar detenido
docker compose ps # no debe haber contenedores activos
Archivos de Log Útiles¶
| Archivo | Propósito |
|---|---|
/var/log/keepalived-failover.log |
Eventos de failover (VIP tomada/liberada, inicio/parada del stack) |
/var/log/keepalived-health.log |
Resultados periódicos del health check |
journalctl -u keepalived -f |
Log en tiempo real del daemon Keepalived |
Problemas Comunes¶
La VIP no aparece en el Nodo A después de la instalación¶
Verifica que el puerto 112 (VRRP) esté abierto entre los nodos:
# En el Nodo A, permitir VRRP desde el Nodo B
ufw allow from 192.168.1.11 proto vrrp
# En el Nodo B, permitir VRRP desde el Nodo A
ufw allow from 192.168.1.10 proto vrrp
Los montajes NFS fallan en el Nodo B¶
Verifica que el servidor NFS esté corriendo en el Nodo A y que el firewall permita los puertos 2049 y 111:
# En el Nodo A
showmount -e localhost # debe listar 8 exports
systemctl status nfs-kernel-server
# En el Nodo B
showmount -e 192.168.1.10 # debe ser accesible
El Nodo B toma la VIP inmediatamente después de la instalación¶
Esto es esperado si el Keepalived del Nodo A aún no estaba corriendo cuando el Nodo B inició. Una vez que ambos nodos están activos, el Nodo A recuperará la VIP automáticamente en ~10 segundos gracias a la configuración preempt.