如何使用ConnectionMultiplexer处理Redis群集中的故障转移?

时间:2017-10-24 14:41:59

标签: .net redis stackexchange.redis redis-cluster

我有一个6节点的Redis群集正在运行,正如您所料,有3个从站和3个主站。
从Redis服务器的角度来看,一切看起来都很糟糕,我可以在服务器上调用cluster failoverdebug segfault,并且相应的slave成为主服务器。

从.net方面来看,我一直在关注StackExchange Redis文档,所以我有一个静态IConnectionMultiplexer,我从中获得IDatabase,从那里我可以存储和检索值。

我使用的连接字符串如:srv1:7001,srv2:7001,srv3:7001,srv1:7002,srv2:7002,srv3:7002

到目前为止,非常好。

但是,我正在尝试弄清楚如何在使用连接多路复用器时处理群集中的主故障。目前,我能想到的最好的方法是捕获异常,丢弃当前的连接多路复用器并创建一个全新的,感觉有点icky。

鉴于我在连接时告诉多路复用器所有潜在的端点,我希望它能够密切关注这样的事情并开始自动与新的主设备通话。 the documentation中的一些人也提到了这一点:

  

同样,当配置发生变化时(尤其是主/从配置),连接实例必须让自己了解新情况(通过INFO,CONFIG等 - 如果可用的话)。 StackExchange.Redis自动执行此操作...

如果我杀掉srv1:7001并且什么也不做,则连接永远不会恢复,并且每次设置新值的调用都会引发RedisConnectionException

我尝试附加到事件ConfigurationChangedConfigurationChangedBroadcastConnectionFailed并订阅各种频道,希望在主人关闭时看到广播。如果我在集群中更改主服务器,这些似乎都不会触发。

所以我想知道我是否遗漏了这件事?

干杯,
克雷格。

1 个答案:

答案 0 :(得分:0)

经过一番游戏,我注意到多路复用器最终确实重新配置了自己。最初我注意到这一点,当我在调试模式下停止检查某些东西时,当我继续进行时,它意外地再次开始工作。

如果我在连接字符串中设置configCheckSeconds=1而不是默认值60,那么重新配置会更加迅速,所以我假设这是罪魁祸首。

我不确定这个设置如此大幅度改变会有多大的开销。我想在一般情况下,群集节点失败可能不太可能,因此不必经常重新配置。我刚刚通过测试创建了一个极端的场景。