HAProxy 健康检查连续计数未重置

HAProxy 健康检查连续计数未重置

我们在 HAProxy 服务器后面有两个 Redis 服务器。一个服务器是主服务器,处于运行状态,另一个是从服务器,处于停机状态。如果主服务器停机,哨兵服务器会选举另一个服务器为主服务器。这部分工作正常。棘手的是确保 HAProxy 永远不会允许流量同时流向两个服务器。

我最初通过添加服务器参数来解决这个问题,如下所示risefall

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 同时考虑两台服务器?

相关内容