Durante o ano passado, estivemos trabalhando com alta disponibilidade para aplicativos da web, e minha maneira favorita de conseguir isso foi com um pequeno grupo de servidores da web, sentados atrás de um par de balanceadores de carga, que ficam atrás de um endereço IP virtual:
Os servidores da web seriam executados em qualquer coisa que já capacite seu aplicativo: PHP, Ruby, Node etc.
Os “balanceadores de carga” em nosso caso são servidores Ubuntu baunilha, com um proxy reverso nginx para os servidores da web e (esta é a parte crÃtica) keepalived para lidar com falhas no IP virtual, caso o balanceador de carga ativo pare de responder.
Aqui está o problema
Alguns meses depois, estamos usando essa configuração para vários aplicativos de baixo a médio tráfego sem incidente … até que movemos um aplicativo de alto tráfego para ele. Tudo correu bem por cerca de uma semana, e então começamos a ver o próprio VIP parar de responder.
Durante essas interrupções, os próprios servidores permanecem ativos e os estados ativo / em espera dos balanceadores de carga não mudam – o ativo simplesmente para de responder no VIP, sem perder sua associação com ele:
ubuntu@lb1:~$ ip addr show | grep inet
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
inet 10.1.2.11/22 brd 10.1.2.255 scope global eth0
inet 10.1.2.10/32 scope global eth0
Reiniciar o serviço keepalived nos faz responder ao VIP novamente … até a próxima falha (aparentemente aleatória).
Arrancando a causa
Ainda não estou certo sobre o motivo exato dessas falhas, mas parece ter relação com o congestionamento da rede e (ao habilitar o registro detalhado do keepalive) é acompanhado por este tipo de mensagens no syslog:
Nov 12 12:05:06 localhost Keepalived_vrrp[1031]: VRRP_Instance(VI_1) Received lower prio advert, forcing new election
Nov 12 12:05:06 localhost Keepalived_vrrp[1031]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 10.1.2.10
Nov 12 12:11:40 localhost Keepalived_vrrp[1031]: VRRP_Instance(VI_1) Received lower prio advert, forcing new election
Nov 12 12:11:40 localhost Keepalived_vrrp[1031]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 10.1.2.10
Uma pesquisa extensiva no Google encontrou um punhado de pessoas com problemas semelhantes , mas nenhuma causa ou solução definida.
Até este ponto, estávamos usando o Ubuntu 14.04 e a versão padrão do keepalived que ele fornece (1.2.7), que tem cerca de três anos.
Um tiro no escuro
Em grande parte por capricho, decidi tentar um pacote launchpad que fornece uma versão muito mais recente do 1.2.13.
Estou executando esta versão mais recente com um ping contÃnuo por alguns dias e ainda não vi a queda do VIP como antes.
Não sei exatamente por que, mas estou chamando isso de sucesso qualificado. ¯ \ (ツ) / ¯