Eu tive exatamente o mesmo problema, no entanto, meu problema não estava no firewall nem no meu adaptador Ethernet, mas nas configurações de "peso" do script de verificação.
Esta foi minha configuração:
MASTER:
vrrp_instance haproxy {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
BACKUP:
vrrp_instance haproxy {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
Check_script:
vrrp_script chk_haproxy {
script "python /root/ha_check.py"
interval 2 # check every 2 seconds
weight 2
rise 2
fall 2
}
O motivo pelo qual o mestre se recusou a liberar o VIP foi porque, apesar do fato de o script ter falhado, o mestre ainda estava tendo um número de prioridade mais alta do servidor BACKUP. Isso aconteceu porque a configuração "weight" em check_script não foi suficiente para cobrir o "GAP" entre o número de prioridade, o que significa aumentar o número de prioridade do servidor BACKUP para o do MASTER Server. Eu explicarei ainda mais:
De acordo com o manual de keepalived, um número positivo na configuração "weight" adicionará esse número à prioridade se a verificação for bem-sucedida.
Um número negativo subtrairá esse número do número de prioridade se a verificação falhar.
Então, de acordo com minha configuração:
Prioridades do servidor Falha anterior do script:
MESTRE: 152
BACKUP: 100
Failover_IP: MASTER
O IP de failover é corretamente "agarrado" pelo servidor mestre, já que o mestre tem prioridade mais alta em comparação ao servidor de backup (152 > 100)
Prioridades do servidor APÓS falha do script:
Servidor MASTER: 148
Servidor de BACKUP: 102
Failover_IP: AINDA EM MASTER
O IP de failover ainda está no servidor mestre, porque o Mestre novamente tem prioridade mais alta em comparação ao BACKUP (148 > 102). O servidor MASTER estava se recusando a liberar o IP e o que ele fez desde que sua prioridade foi maior do que o outro servidor.
A solução na minha situação foi:
Solução -1: Altere o número de prioridade de ambos os servidores para que eles não tenham muito "GAP".
Por exemplo:
Mestra Prioridade: 150
Prioridade de backup: 149
Peso do check_script: como é (2).
Com a configuração acima, quando o script for bem-sucedido (o que significa que está tudo bem), as prioridades serão:
Mestrado: 152
Backup: 149
IP_Location: On Master (152 > 149)
Quando o script falha:
Mestre: 150
Backup: 151
IP_Location: no backup (151 > 150)
Solução - 2: altere o número de peso do script de 2 para -60