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}

0 ответов

Другие вопросы по тегам