У меня есть традиционная конфигурация redis-sentinel со следующей настройкой:
- Узел-1 с часовым и редисом (изначально как мастер)
- Узел-2 с дозором и редис-рабом
- Узел-3 с дозором и редис-рабом
На узле-1 я запускаю Java-приложение, которое вызывает useSentinelServers () следующим образом:
GLconfig.useSentinelServers()
.setMasterName(cluster_name)
.setScanInterval(3000)
.setReadMode(ReadMode.MASTER)
.setSubscriptionMode(SubscriptionMode.MASTER)
.addSentinelAddress(addr1)
.addSentinelAddress(addr2)
.addSentinelAddress(addr3)
GLclient = Redisson.create(GLconfig);
Я использую GLclient для настройки подписки, а также для публикации данных.
Адреса 1, 2 и 3 являются адресами: порты сторожевых серверов (соответственно, узлов 1, 2 и 3)
Что касается аварийного переключения, все работает как надо. Вот что я делаю:
- Мастер находится в узле-2
- Java-приложение на узле-1 публикует данные на канал каждый
второй.
- Это приложение также подписано на канал и, как следствие,
он также получает опубликованные данные.
- Теперь я убиваю оба процесса (redis-master + sentinel) на узле-2
с убийством -9.
- Через несколько секунд эта конфигурация восстанавливается и Java
Приложение снова получает опубликованные данные.
- Короткое отключение является допустимым и предусмотренным.
Теперь я снова делаю ту же последовательность, но вместо того, чтобы убивать процессы sentinel и redis-master на узле-2, я просто отключаю IP-кабель этого хоста (Raspberry-Pi).
Это приводит к неожиданному поведению:
- Java-приложение по-прежнему публикует данные на канале.
- Однако, это приложение не получает опубликованных данных.
больше.
- Запуск публикации с помощью redis-cli на узле-3 для того же канала, также не отображается в приложении java.
- Эта ситуация не меняется с течением времени.
При подключении IP-кабеля в Node-2 конфигурация восстанавливается; Java-приложение на узле-1 снова получает опубликованные данные.
Также он получает опубликованные данные, полученные с узла 3 с redis-cli.
Этот сценарий воспроизводим.
Мое наблюдение состоит в том, что есть четкое различие между:
- Уничтожение обоих часовых процессов в redis-master (kill -9) против
- Отключение IP-кабеля (сравнимо с отключением питания или сбоем маршрутизатора)
(отключение IP-кабеля имеет тот же эффект, что и 'ifconfig eth0 down' на узле-2)
Является ли это известной проблемой, и какие меры противодействия можно предпринять, чтобы подписка работала в случае обрыва кабеля, как я описал? например таймеры, дополнительные параметры для использованияSentinelServers () и т. д.
Спасибо и всего наилучшего.