我在同步集群配置中使用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.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}

  ask by Stephan Klein translate from so

本文未有回复,本站智能推荐: