1

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

  • 2 个 Rails 实例(前端)
  • 2个Redis实例,一主一从(后端)
  • 所有节点上的 4 个 Sentinel 实例

Websocket-rails 通过向 Sentinel 查询当前 master 成功地通过 redis-rb 创建了一个连接。

还成功创建了一个 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 节点后,哨兵成功处理了故障转移。几秒钟后,他们投票选出了一位新主人。

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

WebsocketRails["channel-id"].trigger

但是,与其他节点的同步失败。这是因为 websocket redis Pub/Sub 通道只存在于旧的 master 上,不存在于新的 master 上。

$ 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(甚至底层驱动程序)实现?

使用的版本:

  • 雷迪斯: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}
4

0 回答 0