我们在 HAProxy 服务器后面有两个 Redis 服务器。一个服务器是主服务器,处于运行状态,另一个是从服务器,处于停机状态。如果主服务器停机,哨兵服务器会选举另一个服务器为主服务器。这部分工作正常。棘手的是确保 HAProxy 永远不会允许流量同时流向两个服务器。
我最初通过添加服务器参数来解决这个问题,如下所示rise
:fall
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
我们正在处理以下序列之后的一个奇怪案例:
- 从
redis-01
(初始主) 启动和redis-02
(初始从) 停止开始。 - 殺掉
redis-01
(主人)。 - 哨兵选举
redis-02
成为新的主人。 - 重新启动 redis
redis-01
(现在是从属,原来的主)。 - 进行两到三次 HAProxy 健康检查后,
redis-01
认为它是主服务器并通过检查。 - 最终,
redis-01
意识到它仍然是从属并开始检查失败。
问题是 HAProxy 不会重置健康检查计数器。状态页面显示redis-01
已通过 2/5(或 3/5)健康检查。它没有启动,这很好。不好的是,如果另一台服务器发生故障,它需要通过的检查会更少,最终只有 1 个,从 HAProxy 的角度来看,这可能导致两台服务器都启动的情况。
我不明白为什么 HAProxy 不认为redis-01
启动失败,因为它在 2 之后就停止通过检查了。它似乎不应该继续等待。文档中写道:
“rise”参数表示服务器在连续成功的健康检查后将被视为可运行。
它得到了 5 分中的 2 分,但没有得到 5 分,所以它没有启动,下次通过健康检查时它不应该从 2 开始重新计数。它需要从 0 开始。
那么问题就是以下任一问题:1) 我需要做什么来告诉 HAProxy 重置连续健康检查计数器?2) 有没有更好的方法可以防止 HAProxy 同时考虑两台服务器?