Websocket-rails和redis-rb在故障转移时不恢复发布/订阅通道

时间:2016-05-24 18:07:01

标签: ruby-on-rails redis redis-sentinel websocket-rails redis-rails

我在同步群集配置中使用websocket-rails:

  • 2个Rails实例(FrontEnd)
  • 2个Redis实例,一个主要一个奴隶(后端)
  • 所有节点上的4个Sentinel实例

Websocket-rails通过查询Sentinel为当前主服务器,通过redis-rb成功创建连接。

还成功创建了Redis发布/子通道,以便在两个前端之间同步websocket事件:

$ redis-cli -h 192.168.1.202 -p 6379
192.168.1.202:6379> pubsub channels *
1) "websocket_rails.events"

故障转移时出现问题。停止主redis节点后,哨兵成功处理故障转移。几秒钟后,他们投票给一位新主人。

即使是FrontEnd客户端也可以在故障转移后成功连接到新的redis主服务器。我可以从rails中成功触发Websocket Rails频道,如:

WebsocketRails["channel-id"].trigger

然而,与其他节点的同步失败。这是因为websocket redis Pub / Sub通道仅存在于旧主服务器上,并且在新主服务器上不存在。

$ redis-cli -h 192.168.1.201 -p 6379
192.168.1.201:6379> pubsub channels *
(empty list or set)

当重启rails服务器时,当然会通过websocket-rails重新创建通道。但这不是我们的高可用性环境中的一个选项。

我想知道这是否已在类似的环境中得到解决。我一直在检查websocket-rails和redis-rb的文档,但我找不到任何有用的东西。在我看来,redis行为正确,因为无法复制通道。

我认为客户端应该在故障转移后重新创建通道,但我甚至不确定是否应该通过websocket-rails或底层的redis-rb(甚至底层驱动程序)来实现它?

使用的版本:

  • redis:3.2
  • websocket-rails:0.7.0
  • redis-rb:3.3.0

任何帮助表示感谢。

附件1:websocket rails config:

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 个答案:

没有答案