我在同步群集配置中使用websocket-rails:
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(甚至底层驱动程序)来实现它?
使用的版本:
任何帮助表示感谢。
附件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}