У нас есть два сервера Redis за сервером HAProxy. Один сервер является ведущим, который работает, а другой - ведомым, который не работает. Если мастер выходит из строя, часовые выбирают другой сервер в качестве мастера. Эта часть работает нормально. Что сложно, так это убедиться, что 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-01
(теперь раб, первоначальный хозяин).redis-01
думает, что это хозяин и проходит проверки.redis-01
понимает, что он все еще раб, и начинает проваливать проверки.Проблема в том, что HAProxy не сбрасывает счетчик проверки работоспособности. На странице состояния показано, что redis-01
прошел 2/5 (или 3/5) проверок здоровья. Это не так, и это хорошо. Что не хорошо, так это то, что если другой сервер выходит из строя, ему нужно пройти меньше проверок, в конечном итоге только 1, что с точки зрения HAProxy может привести к тому, что оба сервера будут работать.
Я не понимаю, почему HAProxy не рассматривает redis-01
не смог подойти, так как он перестал проходить проверки после 2. Не похоже, что он должен ждать. В документации говорится:
Параметр «rise» указывает, что сервер будет считаться работающим после последовательных успешных проверок работоспособности.
Он получил 2 из 5, но не получил 5, поэтому он не работает и не должен снова начинать отсчет на 2 при следующем прохождении проверки работоспособности. Он должен быть равен 0.
Тогда возникает один из следующих вопросов: 1) Что мне нужно сделать, чтобы HAProxy сбросил счетчик последовательной проверки работоспособности? 2) Есть ли лучший способ уберечь HAProxy от одновременного включения обоих серверов?