Saltar a contenido

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-compose clonado 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

  1. Instala y configura un servidor NFS para compartir los volúmenes de Netsocs con el Nodo B
  2. Crea el symlink compose.override.yml para activar los volúmenes respaldados por NFS
  3. Levanta el stack Docker (docker compose up -d)
  4. Instala Keepalived y genera su configuración (modo MASTER, prioridad 100)
  5. Inicia Keepalived y asigna la IP Virtual al Nodo A
  6. Coloca los scripts notify-master.sh, notify-backup.sh y health-check.sh en /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

  1. Instala el cliente NFS y monta los 8 volúmenes compartidos desde el Nodo A (persistidos en /etc/fstab)
  2. Crea el symlink compose.override.yml (igual que en el Nodo A)
  3. Instala Keepalived y genera su configuración (modo BACKUP, prioridad 50)
  4. Inicia Keepalived en modo espera — el stack Docker no se inicia
  5. 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.