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