Назад | Перейти на главную страницу

Мастер Redis Sentinel не понижен до подчиненного сразу

У меня есть архитектура с тремя экземплярами Redis (один главный и два подчиненных) и тремя экземплярами Sentinel. Перед ним находится HaProxy. Все работает хорошо, пока главный экземпляр Redis не выйдет из строя. Новый хозяин правильно выбран Sentinel. Однако старый ведущий (который сейчас не работает) не перенастроен на ведомый. В результате, когда этот экземпляр снова включается, у меня есть два мастера на короткий период времени (около 11 секунд). После этого инстанс, который был поднят, должным образом понижается до подчиненного уровня.

Разве это не должно работать так, что когда хозяин выходит из строя, его сразу же переводят в рабство? Имея это, когда он снова встанет, он немедленно станет рабом. Я знаю, что (начиная с Redis 2.8?) Существует функция CONFIG REWRITE, поэтому конфигурация не может быть изменена, когда экземпляр Redis не работает.

Наличие двух мастеров в течение некоторого времени является проблемой для меня, потому что HaProxy на этот короткий период времени вместо отправки запросов одному мастеру Redis выполняет балансировку нагрузки между этими двумя мастерами.

Есть ли способ немедленно понизить статус отказавшего ведущего до ведомого?

Очевидно, я изменил таймауты Sentinel.

Вот несколько журналов из экземпляров Sentinel и Redis после того, как мастер отключился:

Часовой

81358:X 23 Jan 22:12:03.088 # +sdown master redis-ha 127.0.0.1                       63797.0.0.1 26381 @ redis-ha 127.0.0.1 6379
81358:X 23 Jan 22:12:03.149 # +new-epoch 1
81358:X 23 Jan 22:12:03.149 # +vote-for-leader 6b5b5882443a1d738ab6849ecf4bc6b9b32ec142 1
81358:X 23 Jan 22:12:03.174 # +odown master redis-ha 127.0.0.1 6379 #quorum 3/2
81358:X 23 Jan 22:12:03.174 # Next failover delay: I will not start a failover before Sat Jan 23 22:12:09 2016
81358:X 23 Jan 22:12:04.265 # +config-update-from sentinel 127.0.0.1:26381 127.0.0.1 26381 @ redis-ha 127.0.0.1 6379
81358:X 23 Jan 22:12:04.265 # +switch-master redis-ha 127.0.0.1 6379 127.0.0.1 6381
81358:X 23 Jan 22:12:04.266 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ redis-ha 127.0.0.1 6381
81358:X 23 Jan 22:12:04.266 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ redis-ha 127.0.0.1 6381
81358:X 23 Jan 22:12:06.297 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ redis-ha 127.0.0.1 6381

Redis

81354:S 23 Jan 22:12:03.341 * MASTER <-> SLAVE sync started
81354:S 23 Jan 22:12:03.341 # Error condition on socket for SYNC: Connection refused
81354:S 23 Jan 22:12:04.265 * Discarding previously cached master state.
81354:S 23 Jan 22:12:04.265 * SLAVE OF 127.0.0.1:6381 enabled (user request from 'id=7 addr=127.0.0.1:57784 fd=10 name=sentinel-6b5b5882-cmd age=425 idle=0 flags=x db=0 sub=0 psub=0 multi=3 qbuf=14 qbuf-free=32754 obl=36 oll=0 omem=0 events=rw cmd=exec')
81354:S 23 Jan 22:12:04.265 # CONFIG REWRITE executed with success.
81354:S 23 Jan 22:12:04.371 * Connecting to MASTER 127.0.0.1:6381
81354:S 23 Jan 22:12:04.371 * MASTER <-> SLAVE sync started
81354:S 23 Jan 22:12:04.371 * Non blocking connect for SYNC fired the event.
81354:S 23 Jan 22:12:04.371 * Master replied to PING, replication can continue...
81354:S 23 Jan 22:12:04.371 * Partial resynchronization not possible (no cached master)
81354:S 23 Jan 22:12:04.372 * Full resync from master: 07b3c8f64bbb9076d7e97799a53b8b290ecf470b:1
81354:S 23 Jan 22:12:04.467 * MASTER <-> SLAVE sync: receiving 860 bytes from master
81354:S 23 Jan 22:12:04.467 * MASTER <-> SLAVE sync: Flushing old data
81354:S 23 Jan 22:12:04.467 * MASTER <-> SLAVE sync: Loading DB in memory
81354:S 23 Jan 22:12:04.467 * MASTER <-> SLAVE sync: Finished with success