Temos dois servidores Redis atrás de um servidor HAProxy. Um servidor é o mestre, que está ativo, e o outro é o escravo, que está inativo. Se o mestre cair, as sentinelas elegem o outro servidor para ser o mestre. Essa parte está funcionando bem. O que é complicado é garantir que o HAProxy nunca permita que o tráfego vá para os dois servidores ao mesmo tempo.
Inicialmente, consertei isso adicionando rise
e fall
argumentos para os servidores, conforme abaixo:
backend Backend:Redis
bind-process 1
timeout server 3h
timeout tunnel 3h
option tcp-check
tcp-check connect
tcp-check send PING\r\n
tcp-check expect string +PONG
tcp-check send info\ replication\r\n
tcp-check expect string role:master
tcp-check send QUIT\r\n
tcp-check expect string +OK
server redis-01.vbox 10.10.0.10:6279 check inter 5s rise 5 fall 2 maxconn 600 weight 1
server redis-02.vbox 10.10.0.11:6279 check inter 5s rise 5 fall 2 maxconn 600 weight 1
Estamos lidando com um caso estranho após a seguinte sequência:
redis-01
(mestre inicial) e redis-02
(escravo inicial) para baixo. redis-01
(mestre). redis-02
como novo mestre. redis-01
(agora escravo, mestre original). redis-01
acha que é mestre e passa nas verificações. redis-01
percebe que ainda é o escravo e começa a falhar nas verificações. O problema é que o HAProxy não redefine o contador de verificação de integridade. A página de status mostra que redis-01
passou em 2/5 (ou 3/5) verificações de integridade. Não está em alta, o que é bom. O que não é bom é que, se o outro servidor ficar inativo, ele terá menos verificações para passar, eventualmente apenas 1, o que pode levar ao caso de ambos os servidores estarem ativos, do ponto de vista do HAProxy.
Eu não entendo porque o HAProxy não considera redis-01
não ter conseguido, já que parou de passar verificações depois de 2. Parece que não deveria continuar esperando. A documentação diz:
The "rise" parameter states that a server will be considered as operational after consecutive successful health checks.
Recebeu 2 das 5, mas não obteve 5, então não está ativo e não deve começar a contar novamente às 2 da próxima vez que passar na verificação de saúde. Precisa estar em 0.
A pergunta então é uma das seguintes: 1) O que eu preciso fazer para dizer ao HAProxy para redefinir o contador de verificação de saúde consecutiva? 2) Existe uma maneira melhor de evitar que o HAProxy considere ambos os servidores ao mesmo tempo?