我们有一个带有两台redis服务器的redis配置。我们还有3个哨兵来监控这两个实例并在需要时启动故障转移。
我们从一些应用程序中间歇性地得到以下问题:
ServiceStack.Redis.RedisException: No Redis Sentinels were available ---> ServiceStack.Redis.RedisException: Unable to Connect: sPort: 0
Unable to Connect: sPort: 0
部分可能表示它是ConnectTimeout问题(根据此问题:ServiceStack.Redis: Unable to Connect: sPort: 0)。但是,我不太相信这是问题,因为它说“没有Redis Sentinels可用”。
虽然我们在某些应用程序上间歇性地遇到此问题,但还有其他应用程序(例如我们编写的某些控制台应用程序)似乎一直在解决问题。
任何人都可以了解这个问题是如何解决的?如果您使用Google“No Redis Sentinels”,那么您只能获得具有输出此消息的实际代码的ServiceStack.Redis GitHub页面。
答案 0 :(得分:2)
当尝试连接到其中一个可用的标记时,RedisSentinel Worker之后的error message is thrown超过RedisSentinel.MaxFailures
(默认值:5)连续错误。
Redis客户端需要能够连接到可用的Sentinel,以发现可用的主服务器和从服务器,并在主服务器不再响应并进行故障转移时收到通知。
您可以增加RedisSentinel.MaxFailures
次,让它继续循环并连接到可用的Redis Sentinels。我还可以added a commit重置失败计数,当它能够连接到有效的Sentinel时(因此只检查连续错误对MaxFailures),此更改可从v4.0.47获得。现在available on MyGet。
为了更好地了解Redis连接的运行状况,您可以转储内部Redis Stats的快照,以显示客户端连接的活动和运行状况:
RedisStats.ToDictionary().PrintDump();
您可以启用调试日志记录,以查看preferred Logging provider中的更多错误详细信息:
LogManager.LogFactory = new ConsoleLogFactory(debugEnabled:true);
但是这也会发出Redis命令,因为它可能过于冗长,你可以使用以下命令来抑制:
RedisConfig.DisableVerboseLogging = true;
此外,RedisSentinel
提供了许多钩子,以便能够处理自定义事件,例如您可以通过分配OnWorkerError
委托来处理Sentinel Worker无法连接的时间,例如:
var sentinel = new RedisSentinel(sentinelHost, masterName)
{
OnWorkerError = ex =>
{
"Worker error: {0}".Print(ex);
},
};