Configuração e Utilização do Keepalived para Alta Disponibilidade

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

Tags: Keepalived high-availability vrrp Linux load-balancing

Publicado em 7-6 07:04