Implementação de Cluster de Alta Disponibilidade com LVS, KeepAlived e Nginx

Conceitos Fundamentais

LVS (Linux Virtual Server)

O LVS é um sistema de balanceamento de carga baseado no kernel do Linux, projetado para distribuir tráfego de rede entre múltiplos servidores reais. Ele opera na camada 3 e 4 do modelo OSI, realizando balanceamento de IP e portas. As três principais técnicas de encaminhamento são:

  • VS/NAT: Utiliza Network Address Translation. O diretor de balanceamento (load balancer) modifica os endereços IP dos pacotes, atuando como um gateway.
  • VS/TUN: Usa encapsulamento IP (tunneling). Os pacotes de resposta dos servidores reais retornam diretamente ao cliente, reduzindo a carga no diretor.
  • VS/DR: Via Roteamento Direto. Os pacotes são encaminhados alterando-se apenas o endereço MAC de destino no quadro Ethernet. Esta é a técnica mais escalável e de menor latência.

KeepAlived

O KeepAlived é um daemon para servidores Linux que fornece balanceamento de carga de alto nível e alta disponibilidade para serviços baseados em LVS. Seu principal papel é:

  • Monitoramento de Saúde (Health Checking): Monitora os servidores reais em múltiplas camadas (ICMP, TCP, HTTP) e remove automaticamente nós com falha do cluster.
  • Failover de HA: Gerencia a flutuação (failover) de um endereço IP virtual (VIP) entre um servidor mestre (Master) e um de backup (Backup), utilizando o protocolo VRRP.

Arquitetura da Solução

A combinação LVS + KeepAlived cria uma camada robusta de balanceamento de carga e alta disponibilidade. O Nginx, funcionando como servidor web real (RealServer), é protegido por este cluster. Se um servidor Nginx falhar, o LVS (gerenciado pelo KeepAlived) redireciona o tráfego. Se o próprio servidor de balanceamento (diretor LVS) mestre falhar, o VIP flutua automaticamente para o servidor de backup.

Ambiente de Implementação

Para este guia, consideramos um ambiente de teste com quatro máquinas virtuais CentOS 7:

Função Endereço IP Descrição
Diretor LVS (Mestre) 192.168.1.100 Executa KeepAlived no modo MASTER.
Diretor LVS (Backup) 192.168.1.101 Executa KeepAlived no modo BACKUP.
Real Server 1 192.168.1.110 Executa Nginx.
Real Server 2 192.168.1.111 Executa Nginx.

Endereço IP Virtual (VIP): 192.168.1.150 (Este é o endereço que os clientes utilizarão para acessar o serviço).

Passo 1: Instalação dos Componentes Base

Nos Diretores LVS (192.168.1.100 e 192.168.1.101):

# Instalar dependências e o ipvsadm
yum install -y keepalived ipvsadm

# Habilitar e iniciar o firewalld
systemctl enable firewalld --now

Nos Servidores Nginx/Real Servers (192.168.1.110 e 192.168.1.111):

# Instalar Nginx
yum install -y nginx

# Habilitar e iniciar o Nginx
systemctl enable nginx --now

Passo 2: Configuração do Real Server (Loopback e ARP)

Para que o modo VS/DR funcione, cada servidor Nginx precisa ser configurado para responder ao ARP do VIP. Crie o script /usr/local/bin/realserver_setup.sh em ambos os servidores Nginx:

#!/bin/bash
VIRTUAL_IP="192.168.1.150"
MASK="255.255.255.255"

case "$1" in
start)
    # Configurar a interface de loopback
    ip addr add ${VIRTUAL_IP}/${MASK} dev lo
    # Desabilitar a resposta ARP para o VIP na interface principal
    echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo "Configuração do RealServer aplicada."
    ;;
stop)
    ip addr del ${VIRTUAL_IP}/${MASK} dev lo
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo "Configuração do RealServer removida."
    ;;
*)
    echo "Uso: $0 {start|stop}"
    exit 1
esac
exit 0

Dê permissão de execução e execute o script com start:

chmod +x /usr/local/bin/realserver_setup.sh
/usr/local/bin/realserver_setup.sh start

Para tornar a configuração persistente após a reinicialização, adicione o comando de start ao /etc/rc.local.

Passo 3: Configuração do Firewall (Firewalld)

Nos Diretores LVS:

# Permitir tráfego VRRP (essencial para o heartbeat do KeepAlived)
firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent
# Permitir tráfego de entrada para o serviço na porta 80 via VIP
firewall-cmd --add-rich-rule='rule family="ipv4" destination address="192.168.1.150" port protocol="tcp" port="80" accept' --permanent
firewall-cmd --reload

Nos Servidores Nginx:

# Permitir tráfego de entrada na porta 80
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --reload

Passo 4: Configuração do KeepAlived

No Diretor Mestre (192.168.1.100):

Edite o arquivo /etc/keepalived/keepalived.conf:

global_defs {
    notification_email {
        admin@example.com
    }
    notification_email_from keepalived@example.com
    smtp_server 127.0.0.1
    smtp_connect_timeout 30
    router_id LB_MASTER
}

vrrp_instance VI_WEBSERVICE {
    state MASTER
    interface eth0                # Interface de rede do servidor
    virtual_router_id 51          # ID único para este par VRRP
    priority 100                  # Prioridade alta para o Mestre
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass SenhaForte123   # Deve ser idêntica no Backup
    }
    virtual_ipaddress {
        192.168.1.150/24 dev eth0 # O VIP
    }
}

virtual_server 192.168.1.150 80 {
    delay_loop 10
    lb_algo rr                    # Algoritmo de balanceamento (Round Robin)
    lb_kind DR                    # Modo de encaminhamento (Direct Routing)
    persistence_timeout 50
    protocol TCP

    real_server 192.168.1.110 80 {
        weight 1
        HTTP_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 3
            retry 3
            delay_before_retry 2
        }
    }
    real_server 192.168.1.111 80 {
        weight 1
        HTTP_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 3
            retry 3
            delay_before_retry 2
        }
    }
}

No Diretor Backup (192.168.1.101):

Edite o arquivo /etc/keepalived/keepalived.conf com as seguintes alterações em relação ao mestre:

vrrp_instance VI_WEBSERVICE {
    state BACKUP                  # Altere para BACKUP
    ...
    priority 90                   # Prioridade menor que a do Mestre
    ...
}
# A seção virtual_server pode ser idêntica à do Mestre.

Iniciando o Serviço:

systemctl enable keepalived --now

Passo 5: Verificação e Testes

Verificar o VIP e o Balanceamento:

No servidor Mestre, verifique se o VIP está ativo na interface:

ip addr show eth0
# Procure por "inet 192.168.1.150/24"

Use o ipvsadm para inspecionar o estado do LVS:

ipvsadm -Ln    # Lista as regras de balanceamento e servidores reais ativos
ipvsadm -Lnc   # Mostra as conexões atuais

Teste de Failover do VIP:

  1. Execute ping 192.168.1.150 de uma máquina cliente.
  2. No servidor Mestre, pare o KeepAlived: systemctl stop keepalived.
  3. Observe que os pacotes de ping continuam respondendo. O VIP deve ter migrado para o servidor Backup (verifique com ip addr no servidor Backup).
  4. Reinicie o KeepAlived no servidor Mestre. O VIP deve retornar para ele após o tempo de prioridade.

Teste de Remoção de um Real Server:

  1. Pare o Nginx em um dos servidores, por exemplo, em 192.168.1.110: systemctl stop nginx.
  2. Execute ipvsadm -Ln no Diretor LVS. O servidor 192.168.1.110 deve ser marcado como Inactive.
  3. Todo o tráfego HTTP para o VIP agora será direcionado apenas para 192.168.1.111.
  4. Reinicie o Nginx em 192.168.1.110. Após alguns segundos, o servidor será reinserido automaticamente no pool.

Tags: lvs Keepalived nginx ipvs DR-Mode

Publicado em 7-12 08:30