Implementación de Alta Disponibilidad y Balanceo de Carga con LVS y Keepalived

Fundamentos Tecnológicos

Linux Virtual Server (LVS)

  • Opera en la capa de transporte (Capa 4 del modelo OSI), distribuyendo el tráfico de red basándose en direcciones IP y puertos TCP/UDP.
  • Integra múltiples algoritmos de programación, incluyendo Round Robin, Weighted Round Robin, Least Connection y Weighted Least Connection.
  • Soporta tres topologías principales de enrutamiento: NAT (Network Address Translation), DR (Direct Routing) y TUN (IP Tunneling).

Keepalived

  • Proporciona alta disponibilidad mediante la implementación del protocolo VRRP (Virtual Router Redundancy Protocol).
  • Ejecuta chequeos de salud continuos sobre los nodos de balanceo y los servidores backend, realizando conmutaciones por error automáticas.
  • Gestiona la asignación y migración (failover) de la Dirección IP Virtual (VIP) entre los nodos del clúster.

Diseño de la Arquitectura (Modo Direct Routing)

En el modo DR, las peticiones de los clientes llegan al balanceador a través de la VIP. El balenceador reescribe la dirección MAC de destino para enviar los paquetes directamente a los servidores reales (Real Servers). Las respuestas de los servidores reales se envía directamente al cliente, evitando que el tráfico de retorno pase por el balanceador, lo que optimiza significativamente el rendimiento de la red.

Preparación del Entorno

  • Nodos de Balanceo: Dos servidores LVS (Principal y Respaldo), configurados con una interfaz de red para el tráfico de datos y otra dedicada para la comunicación de latidos (heartbeat).
  • Servidores Reales (Backend): Dos o más servidores web (ej. Nginx o Apache) que procesarán las peticiones.
  • Red: Todos los nodos deben estar conectados al mismo segmento de red de capa 2 (broadcast domain) para que el modo DR funcione correctamente.

Configuración de los Nodos de Balanceo

Instale las herramientas necesarias en ambos nodos LVS:

sudo dnf install ipvsadm keepalived -y

Configuración del Nodo Principal (Master)

Edite el archivo /etc/keepalived/keepalived.conf en el nodo primario:

global_defs {
   router_id LVS_NODE_PRIMARY
}

vrrp_instance VI_PRIMARY {
    state MASTER
    interface eth0
    lvs_sync_daemon_interface eth1      # Interfaz dedicada para sincronización
    virtual_router_id 61
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass SecretKey99
    }
    virtual_ipaddress {
        10.20.30.100
    }
}

virtual_server 10.20.30.100 80 {
    delay_loop 5
    lb_algo wrr           # Algoritmo: Weighted Round Robin
    lb_kind DR            # Modo: Direct Routing
    protocol TCP

    real_server 10.20.30.10 80 {
        weight 3
        TCP_CHECK {
            connect_timeout 5
            retry 2
            delay_before_retry 2
            connect_port 80
        }
    }

    real_server 10.20.30.11 80 {
        weight 2
        TCP_CHECK {
            connect_timeout 5
            retry 2
            delay_before_retry 2
            connect_port 80
        }
    }
}

Configuración del Nodo de Respaldo (Backup)

En el nodo secundario, la configuración es casi idéntica, modificando el router_id, el estado, la prioridad y el nombre de la instancia VRRP:

global_defs {
   router_id LVS_NODE_SECONDARY
}

vrrp_instance VI_SECONDARY {
    state BACKUP
    interface eth0
    lvs_sync_daemon_interface eth1
    virtual_router_id 61
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass SecretKey99
    }
    virtual_ipaddress {
        10.20.30.100
    }
}

virtual_server 10.20.30.100 80 {
    delay_loop 5
    lb_algo wrr
    lb_kind DR
    protocol TCP

    real_server 10.20.30.10 80 {
        weight 3
        TCP_CHECK {
            connect_timeout 5
            retry 2
            delay_before_retry 2
            connect_port 80
        }
    }

    real_server 10.20.30.11 80 {
        weight 2
        TCP_CHECK {
            connect_timeout 5
            retry 2
            delay_before_retry 2
            connect_port 80
        }
    }
}

Configuración de los Servidores Backend (Real Servers)

Los servidores reales deben configurar la VIP en su interfaz de loopback y suprimir las respuestas ARP para evitar conflictos de red. A continuación, se presenta un script de inicialización modernizado utilizando la suite iproute2 y sysctl.

Guarde el siguiente código como /usr/local/bin/lvs_dr_setup.sh y otorgue permisos de ejecución:

#!/bin/bash
# Script para configurar el nodo Real Server en modo LVS-DR

VIRTUAL_IP="10.20.30.100"
LOOPBACK_ALIAS="lo:1"
LOCK_FILE="/var/run/lvs_dr.lock"
NET_IFACE="eth0"

configure_arp() {
    local val_ignore=$1
    local val_announce=$2

    for iface in lo $NET_IFACE all; do
        sysctl -q -w "net.ipv4.conf.${iface}.arp_ignore=${val_ignore}"
        sysctl -q -w "net.ipv4.conf.${iface}.arp_announce=${val_announce}"
    done
}

start_service() {
    if [ -f "$LOCK_FILE" ]; then
        echo "El servicio LVS-DR ya está activo."
        exit 1
    fi

    ip addr add ${VIRTUAL_IP}/32 dev $LOOPBACK_ALIAS
    ip route add local ${VIRTUAL_IP}/32 dev $LOOPBACK_ALIAS
    
    # Ignorar peticiones ARP en interfaces que no sean la de la IP, y anunciar solo desde la IP principal
    configure_arp 1 2
    
    touch "$LOCK_FILE"
    echo "Configuración de LVS-DR completada exitosamente."
}

stop_service() {
    if [ ! -f "$LOCK_FILE" ]; then
        echo "El servicio LVS-DR no está en ejecución."
        exit 1
    fi

    ip route del local ${VIRTUAL_IP}/32 dev $LOOPBACK_ALIAS
    ip addr del ${VIRTUAL_IP}/32 dev $LOOPBACK_ALIAS
    
    # Restaurar comportamiento ARP por defecto
    configure_arp 0 0
    
    rm -f "$LOCK_FILE"
    echo "Configuración de LVS-DR eliminada correctamente."
}

check_status() {
    if [ -f "$LOCK_FILE" ]; then
        echo "Estado: ACTIVO"
    else
        echo "Estado: INACTIVO"
    fi
}

case "$1" in
    start)   start_service ;;
    stop)    stop_service ;;
    restart) stop_service; start_service ;;
    status)  check_status ;;
    *)       echo "Uso: $0 {start|stop|restart|status}"; exit 1 ;;
esac

Ejecute el script en todos los servidores backend:

sudo /usr/local/bin/lvs_dr_setup.sh start

Despliegue y Pruebas de Validación

1. Iniciar los servicios de balanceo

Ejecute los siguientes comandos en ambos nodos LVS para iniciar y habilitar el demonio:

sudo systemctl start keepalived
sudo systemctl enable keepalived

2. Verificación de la VIP

En el nodo que actúa como MASTER, verifique que la dirección IP virtual esté correctamente enlazada a la interfaz de red:

ip addr show eth0 | grep 10.20.30.100

3. Prueba de Conmutación por Error (Failover)

Detenga el servicio Keepalived en el nodo principal para simular una caída:

sudo systemctl stop keepalived

Inmediatamente, compruebe la interfaz de red en el nodo BACKUP. La VIP 10.20.30.100 debería haber migrado automáticamente a este nodo.

4. Validación de la Distribución de Carga

Realice múltiples peticiones HTTP hacia la VIP desde un cliente externo y analice los registros de acceso (access logs) en los servidores backend para confirmar que el tráfico se está distribuyendo según los pesos configurados (Weighted Round Robin):

for i in {1..20}; do curl -s http://10.20.30.100 > /dev/null; done

Etiquetas: LVS Keepalived load-balancing high-availability VRRP

Publicado el 7-20 01:55