Websocket-rails и redis-rb не восстанавливают Pub/Sub Channel при отработке отказа
Я использую websocket-rails в конфигурации синхронизированного кластера:
- 2 экземпляра Rails (FrontEnd)
- 2 экземпляра Redis, один мастер, один раб (бэкэнд)
- 4 экземпляра часового на всех узлах
Websocket-rails успешно создает соединение через redis-rb, запрашивая Sentinel для текущего мастера.
Также Redis Pub / Sub Channel успешно создан для синхронизации событий websocket между двумя внешними интерфейсами:
$ redis-cli -h 192.168.1.202 -p 6379
192.168.1.202:6379> pubsub channels *
1) "websocket_rails.events"
Проблема возникает при сбое. После остановки главного узла Redis аварийное переключение успешно обрабатывается дозорными. Через пару секунд они голосуют за нового мастера.
Даже клиенты FrontEnd могут успешно подключиться к новому ведущему Redis после Failover. Я могу успешно запустить канал Websocket Rails из таких рельсов, как:
WebsocketRails["channel-id"].trigger
Однако синхронизация с другим узлом не выполняется. это связано с тем, что канал веб-сокета Redis Pub / Sub существует только на старом мастере и не существует на новом.
$ redis-cli -h 192.168.1.201 -p 6379
192.168.1.201:6379> pubsub channels *
(empty list or set)
Конечно канал воссоздается через websocket-rails при перезапуске сервера rails. Но это не вариант в нашей высокой доступной среде.
Интересно, было ли это решено в подобных условиях? Я продолжал проверять документы на websocket-rails и redis-rb, но ничего полезного не нашел. На мой взгляд, Redis ведет себя правильно, так как каналы не могут быть реплицированы.
Я думаю, что клиент должен воссоздать канал после аварийного переключения, но я даже не уверен, должно ли это быть реализовано с помощью websocket-rails или базового redis-rb (или даже базового драйвера)?
Используемые версии:
- Redis: 3,2
- рельсы websocket: 0.7.0
- redis-rb: 3.3.0
Любая помощь приветствуется.
Приложение 1: Конфигурация направляющих веб-сокета:
config.log_internal_events = true
config.standalone = false
config.synchronize = true
config.redis_options = {
:host => "mymaster",
:sentinels => [{:host => "192.168.1.101", :port => 26379},
{:host => "192.168.1.102", :port => 26379},
{:host => "192.168.1.201", :port => 26379},
{:host => "192.168.1.202", :port => 26379}],
:role => :master}