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:
- Execute
ping 192.168.1.150de uma máquina cliente. - No servidor Mestre, pare o KeepAlived:
systemctl stop keepalived. - Observe que os pacotes de ping continuam respondendo. O VIP deve ter migrado para o servidor Backup (verifique com
ip addrno servidor Backup). - 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:
- Pare o Nginx em um dos servidores, por exemplo, em 192.168.1.110:
systemctl stop nginx. - Execute
ipvsadm -Lnno Diretor LVS. O servidor 192.168.1.110 deve ser marcado como Inactive. - Todo o tráfego HTTP para o VIP agora será direcionado apenas para 192.168.1.111.
- Reinicie o Nginx em 192.168.1.110. Após alguns segundos, o servidor será reinserido automaticamente no pool.