Configuración y gestión de Keepalived para alta disponibilidad

Introducción a Keepalived y su rol en la alta disponibilidad

Keepalived es una herramienta fundamental en entornos de infraestructura crítica, diseñada para garantizar la alta disponibilidad (HA) evitando puntos únicos de fallo. Su nombre indica claramente su propósito: mantener servicios activos mediante mecanismos de conmutación automática. Este sistema se basa principalmente en el protocolo VRRP (Virtual Router Redundancy Protocol), que permite a múltiples servidores coordinarse para ofrecer una dirección IP virtual compartida, asegurando continuidad incluso si uno de ellos falla.

El fundamento: el protocolo VRRP

VRRP fue originalmente concebido para proporcionar redundancia en ruteadores de red. En lugar de depender de un único dispositivo, varios ruteadores pueden formar un grupo virtual, donde uno actúa como maestro y los demás como reserva. El maestro responde por una IP virtual común, y si deja de funcionar, otro nodo asume su rol automáticamente.

Keepalived implementa fielmente este protocolo, extendiéndolo más allá del enrutamiento tradicional hacia la supervisión de servicios como balanceadores HTTP, proxies o bases de datos. Cada grupo VRRP se identifica mediante un VRID (Virtual Router ID), que determina tanto el grupo lógico como la dirección MAC multicast asociada.

Arquitectura interna de Keepalived

Keepalived sigue un diseño modular compuesto por varios componentes clave:

  • core: gestiona el proceso principal, carga la configuración y coordina los módulos.
  • vrrp: implementa el subproceso VRRPD encargado de enviar anuncios y manejar transiciones de estado.
  • check: realiza comprobaciones activas sobre servicios (HTTP, TCP, scripts personalizados).
  • libipvs*: interactúa con el plano de datos de LVS (Linux Virtual Server) para gestionar reglas de balanceo.
  • libipfwc: facilita operaciones relacionadas con iptables cuando se integra con LVS.

Al iniciarse, Keepalived crea un proceso padre y dos hijos independientes vigilados por un watchdog del sistema:

  • Uno dedicado al manejo de VRRP.
  • Otro responsable de las verificaciones de salud (health checking).

Si el módulo de salud detecta una falla en un servicio crítico del nodo maestro, notifica al módulo VRRP para que abandone el estado MASTER, elimine la IP virtual y permita que un nodo secundario tome el control. Estructura del archivo de configuración

La configuración de Keepalived se organiza en tres bloques principales dentro de un solo archivo (/etc/keepalived/keepalived.conf):

1. Configuración global

global_defs {
    router_id lb01
    notification_email {
        admin@empresa.com
        soporte@empresa.com
    }
    notification_email_from keepalived@empresa.com
    smtp_server mail.local
    smtp_connect_timeout 60
}

  • router_id: Nombre único que identifica al nodo.
  • notification_email: Lista de destinatarios para alertas.
  • smtp_server: Servidor SMTP usado para notificaciones por correo.

2. Grupos estáticos (opcional)

Permite agrupar múltiples instancias VRRP para que cambien de estado simultáneaemnte:

vrrp_sync_group G_HTTP {
    group {
        VI_HTTP
        VI_DB
    }
    notify_master /scripts/failover_master.sh
    notify_backup /scripts/failover_backup.sh
}

Este mecanismo es útil cuando servicios interdependientes deben migrar juntos durante una conmutación.

3. Instancia VRRP

Define el comportamiento específico de cada grupo de alta disponibilidad:

vrrp_instance VI_HTTP {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 95
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass secreto123
    }
    virtual_ipaddress {
        192.168.10.100/24 dev eth0 label eth0:VIP
    }
    track_interface {
        eth0
        eth1
    }
    track_script {
        chk_nginx_weight
    }
}

  • state: Estado inicial deseado (MASTER o BACKUP), aunque el ganador final depende de la prioridad.
  • interface: Interfaz física donde se anunciará la IP virtual.
  • priority: Valor numérico que determina quién será el maestro; mayor valor = mayor preferencia.
  • virtual_ipaddress: IPs flotantes añadidas o removidas según el rol actual.
  • track_interface: Falla si alguna interfaz listada entra en estado inactivo.
  • track_script: Vincula un script externo cuyo resultado afectará la prioridad efectiva.

4. Scripts de monitoreo

Se definen fuera de las instancias y luego se referencian. Permiten evaluar condiciones dinámicas como la disponibilidad de un servicio:

vrrp_script chk_nginx_weight {
    script "/usr/local/bin/check_service nginx"
    interval 3
    weight 15
    timeout 5
}

Si el script devuelve error, la prioridad del nodo disminuye en 15 unidades, posiblemente desencadenando una transición a BACKUP si otro nodo tiene mayor puntuación.

5. Integración opcional con LVS

Aunque no obligatoria, Keepalived puede gestionar directamente reglas de balanceo IPVS:

virtual_server 192.168.10.100 80 {
    delay_loop 6
    lb_algo wlc
    lb_kind DR
    persistence_timeout 300
    protocol TCP

    real_server 192.168.10.11 80 {
        weight 100
        inhibit_on_failure
        TCP_CHECK {
            connect_port 80
            connect_timeout 4
            nb_get_retry 3
            delay_before_retry 2
        }
    }

    real_server 192.168.10.12 80 {
        weight 100
        inhibit_on_failure
        HTTP_GET {
            url {
                path /status.html
                status_code 200
            }
            connect_port 80
            connect_timeout 3
        }
    }
}

  • lb_kind: Modo de operación — NAT, DR (Direct Routing) o TUN (Tunneling).
  • inhibit_on_failure: Evita eliminar el servidor real de IPVS; solo reduce su peso a cero.
  • TCP_CHECK / HTTP_GET: Mecanismos flexibles para validar estado del backend.

Ejemplo práctico: clúster Nginx acttivo-pasivo

Nodo primario (lb-primary):

global_defs {
    router_id lb-primary
    notification_email { ops@empresa.com }
    smtp_server localhost
}

vrrp_script chk_nginx {
    script "/opt/scripts/test_nginx.sh"
    interval 2
    weight 30
}

vrrp_instance VI_NGINX {
    state MASTER
    interface ens3
    virtual_router_id 88
    priority 105
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass klave789
    }
    virtual_ipaddress {
        192.168.10.50/24 dev ens3
    }
    track_script {
        chk_nginx
    }
}

Nodo secundario (lb-backup):

vrrp_instance VI_NGINX {
    state BACKUP
    interface ens3
    virtual_router_id 88
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass klave789
    }
    virtual_ipaddress {
        192.168.10.50/24 dev ens3
    }
    track_script {
        chk_nginx
    }
}

Script de verificación /opt/scripts/test_nginx.sh:

#!/bin/bash
if ! curl -f http://localhost/health >/dev/null 2>&1; then
    exit 1
fi
exit 0

Si Nginx falla, el script devuelve error, reduciendo la prioridad efectiva del nodo en 30 puntos, lo cual desencadena una conmutación inmediata.

Etiquetas: Keepalived VRRP Alta Disponibilidad balanceo de carga LVS

Publicado el 8-28 20:56