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