Keepalived representa uma solução open source desenvolvida em linguagem C, que implementa mecanismos semelhantes às camadas 3, 4 e 7 de comunicação em switches. Esta ferramenta oferece funcionalidades de balanceamento de carga e alta disponibilidade, onde o balanceamento depende do módulo IPVS (IP Virtual Server) do kernel Linux, enquanto a alta disponibilidade é implementada através do protocolo VRRP para failover entre múltiplos servidores.
Esta solução destaca-se por diversas características técnicas relevantes:
O Keepalived oferece suporte nativo para balanceamento de carga na camada de transporte (layer 4), utilizando a tecnologia de módulo do kernel Linux denominada IPVS. O sistema incorpora mecanismos abrangentes de verificação de saúde que monitorizam continuamente o estado dos servidores backend, aplicando estratégias predefinidas para garantir a estabilidade dos serviços.
A implementação do protocolo VRRP (Virtual Router Redundancy Protocol) permite a transferência automática de serviços entre servidores primário e secundário em caso de falha. Adicionalmente, o sistema suporta BFD (Bidirectional Forwarding Detection) para detecção rápida de falhas de rede, permitindo transições de estado VRRP mais ágeis e recoveries mais eficientes.
A arquitetura modular proporciona flexibilidade significativa, permitindo que os módulos funcionem de forma independente ou combinada conforme as necessidades específicas de cada ambiente. O sistema também oferece mecanismos de hooks que possibilitam a personalização através de scripts自定义izados para estender o comportamento do VRRP.
Instalação
O Keepalived pode ser instalado através de código fonte ou utilizando as ferramentas de package management de cada sistema operacional.
Instalação Online (yum)
Para sistemas baseados em CentOS, a instalação pode ser realizada através do yum:
yum install -y keepalived
Instalação Offline (compilação)
O processo de instalação por compilação envolve várias etapas sequenciais. Primeiramente, deve-se obter o pacote de instalação no site oficial do Keepalived, seguido da extração e configuração. O diretório extraído deve ser acedido e o configure executado com os parâmetros apropriados para especificar o diretório de instalação e a localização dos ficheiros de configuração principais.
# Extração do pacote para o diretório HOME do utilizador
tar -zxvf $HOME/keepalived-2.0.18.tar.gz
# Configuração da instalação
cd $HOME/keepalived-2.0.18/
./configure --prefix=/usr/local/keepalived --sysconf=/etc
# Caso出现的avisos sobre libnl/libnl-3, instalar primeiro:
# yum -y install libnl libnl-devel
# Depois executar configure novamente
# Compilação e instalação
make && make install
# Configuração como serviço do sistema
cp $HOME/keepalived-2.0.18/keepalived/etc/init.d/keepalived /etc/init.d/
cp $HOME/keepalived-2.0.18/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
# Recarregar serviços do sistema
sudo systemctl daemon-reload
Configuração
O ficheiro de configuração principal /etc/keepalived/keepalived.conf é composto por três secções fundamentais: definições globais, instâncias VRRP e scripts personalizados.
Configuração Global (global_defs)
Esta secção permite definir informações globais como notificações por email e parâmetros críticos, devendo ser consistente entre os nós primário e secundário.
! Configuração Keepalived
global_defs {
notification_email {
admin@empresa.local
infraestrutura@empresa.local
suporte@empresa.local
}
notification_email_from keepalived@empresa.local
smtp_server 192.168.31.1
smtp_connect_timeout 30
router_id SRV_LB_01
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}
O parâmetro vrrp_strict merece atenção especial. Quando ativado, força a conformidade estrita com o protocolo VRRP, o que pode resultar em indisponibilidade do VIP em certas configurações. Recomenda-se manter este parâmetro comentado ou desativado.
Configuração de Instância VRRP (vrrp_instance)
Esta secção define a configuração específica do serviço, incluindo o estado do nó, interface de rede, prioridade, método de autenticação e informações do VIP.
vrrp_instance APP_CLUSTER {
state MASTER
interface eth0
virtual_router_id 55
priority 120
advert_int 1
authentication {
auth_type PASS
auth_pass s3cr3t2024
}
virtual_ipaddress {
192.168.31.200
192.168.31.201/24 dev eth1
}
track_script {
check_backend
}
preempt_delay 5
notify_master "/usr/local/bin/notify-master.sh"
notify_backup "/usr/local/bin/notify-backup.sh"
notify_fault "/usr/local/bin/notify-fault.sh"
}
A configuração de priority deve respeitar a regra onde o nó primário possui valor superior ao secundário. A diferença entre as prioridades deve ser superior ao valor absoluto de weight definido nos scripts de monitoring para garantir o funcionamento correto do failover.
O fenómeno de "split-brain" ocorre quando múltiplos routers declaram simultaneamente serem a instância principal do router virtual, resultando em competição pelo controlo do VIP e potenciais interrupções de rede.
Script de Monitorização Personalizado (vrrp_script)
Por defeito, o Keepalived only executa failover quando o nó fica inacessível ou o processo é终止ado. Para cenários onde o serviço de aplicação falha mas o Keepalived permanece ativo, podem ser definidos scripts de verificação personalizados.
vrrp_script check_backend {
script "/usr/bin/killall -0 nginx"
interval 4
fall 2
rise 2
timeout 2
weight -15
}
O comando killall com parâmetro -0 verifica apenas se o processo existe, sem enviar sinais destrutivos. O script retorna código 0 quando o processo está em execução.
Configuração de Logs Separados
Por defeito, os logs do Keepalived são armazenados em /var/log/messages. Para separar os logs, é necessário configurar o rsyslog.
Primeiro, modificar o ficheiro /etc/sysconfig/keepalived:
sudo sed -i '/KEEPALIVED_OPTIONS/c\KEEPALIVED_OPTIONS="-D -S 4"' /etc/sysconfig/keepalived
Depois, adicionar a regra de logging no rsyslog:
echo 'local4.* /var/log/keepalived.log' |sudo tee /etc/rsyslog.d/keepalived.conf
Parâmetros de logging importantes:
- -D: Ativa logging detalhado
- -S: Define a facilidade de logging (0-7)
- local4: Facility recomendada para equipamentos de rede
Reinicie os serviços para aplicar as alterações:
sudo systemctl restart keepalived rsyslog
tail -f /var/log/keepalived.log
Includes de Ficheiros de Configuração
Para ambientes de produção complexos, é possível dividir a configuração em múltiplos ficheiros:
global_defs {
router_id SRV_LB_01
}
vrrp_script check_service {
script "/usr/bin/killall -0 apache2"
interval 5
weight -20
}
vrrp_instance WEB_CLUSTER {
state MASTER
interface eth0
virtual_router_id 55
priority 110
advert_int 1
authentication {
auth_type PASS
auth_pass s3cr3t2024
}
virtual_ipaddress {
192.168.31.200
}
track_script {
check_service
}
}
include /etc/keepalived/conf.d/*.conf
Criar diretório e ficheiros adicionais:
mkdir -p /etc/keepalived/conf.d
touch /etc/keepalived/conf.d/api-cluster.conf
Exemplos Práticos
Preparação do Ambiente
# Desativar SElinux e firewall
sudo sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config
sudo setenforce 0
sudo systemctl disable --now firewalld
# Configurar sincronização de tempo
sudo yum -y install chrony
sudo systemctl enable --now chronyd
# Ativar multicast na interface de rede
ip link show eth0
ip link set multicast on dev eth0
Configuração High Availability Master-Slave
Configuração do nó primário:
! Configuração Keepalived - Servidor Primário
global_defs {
router_id LB_MASTER_01
}
vrrp_script check_nginx {
script "/usr/bin/killall -0 nginx"
interval 3
fall 3
rise 1
timeout 2
weight -12
}
vrrp_instance WEB_SERVICE {
state MASTER
interface eth0
virtual_router_id 55
priority 110
advert_int 1
authentication {
auth_type PASS
auth_pass s3cr3t2024
}
virtual_ipaddress {
192.168.31.250
}
track_script {
check_nginx
}
}
Configuração do nó secundário:
! Configuração Keepalived - Servidor Secundário
global_defs {
router_id LB_BACKUP_01
}
vrrp_script check_nginx {
script "/usr/bin/killall -0 nginx"
interval 3
fall 3
rise 1
timeout 2
weight -12
}
vrrp_instance WEB_SERVICE {
state BACKUP
interface ens33
virtual_router_id 55
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass s3cr3t2024
}
virtual_ipaddress {
192.168.31.250
}
track_script {
check_nginx
}
}
Validação do Failover
O failover pode ser testado através de vários métodos. Primeiro, verificando a migração do VIP quando o serviço Keepalived é parado no servidor primário:
# Verificar interface no servidor primário
ip addr show eth0
# Parar serviço Keepalived no primário
sudo systemctl stop keepalived
# Verificar se o VIP migrou para o secundário
ip addr show ens33
Também é possível testar parando o serviço de aplicação monitorizado:
# Parar serviço nginx no servidor primário
sudo systemctl stop nginx
# O VIP deve migrar automaticamente para o secundário
ip addr show ens33
Para verificação com serviços web:
# Script de verificação para porta específica
vrrp_script check_webapp {
script "wget -q --spider 127.0.0.1:8080/health.html"
interval 3
fall 3
rise 1
weight -12
}
# Testar acesso ao VIP
curl http://192.168.31.250:8080/
# Após falha do servidor primário, o acesso continua pelo secundário
O comando wget com parâmetros -q e --spider efetua uma verificação silenciosa da disponibilidade do recurso sem transferência de dados.
Referências
- Documentação oficial do Keepalived
- RFC 3768 - Virtual Router Redundancy Protocol (VRRP)
- Documentação IPVS Kernel Community