我们在HAProxy服务器后面有两个Redis服务器。 一台服务器是主设备,这是服务器,另一台服务器是从服务器。 如果主人失败,哨兵选举另一个服务器成为主人。 那部分工作正常。 棘手的是确保HAProxy从不允许stream量同时进入两台服务器。
我最初通过添加服务器的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 (初始主设备)up和redis-02 (初始从设备)开始。 redis-01 (主)。 redis-02成为新的主人。 redis-01 (现在的奴隶,原来的主)。 redis-01认为它是主人并通过检查。 redis-01意识到它仍然是奴隶,并开始没有通过检查。 问题是HAProxy不会重置健康检查计数器。 状态页面显示redis-01已通过2/5(或3/5)健康检查。 这不起来,这是好的。 不好的是,如果另一台服务器出现故障,那么检查通过的次数就会减less,最终只有1次,从HAProxy的angular度来看,这可能会导致两台服务器都处于启动状态。
我不明白为什么HAProxy不认为redis-01没有出现,因为它在2之后停止了通过检查。似乎它不应该继续等待。 该文件说:
“rise”参数指出,在连续成功运行健康检查之后,服务器将被视为可操作。
5个中有2个,但没有5个,所以没有通过健康检查,不能再次开始计数。 它需要在0。
那么问题是以下两种情况之一:1)我需要做什么来告诉HAProxy重置连续的健康检查计数器? 2)有没有更好的方法让HAProxy同时考虑两台服务器?