我们有一个带有两个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:无法连接: sPort: 0)。然而,我不太相信这就是问题所在,因为上面写着“没有红色哨兵可用”。
虽然我们在一些应用程序上断断续续地遇到了这个问题,但有些应用程序(例如,我们编写的一些控制台应用程序)似乎一直在解决这个问题。
谁能弄清楚这个问题是怎样解决的呢?如果您在谷歌上搜索“ServiceStack.Redis是可用的”,那么您只会得到ServiceStack.Redis GitHub页面,该页面具有输出此消息的实际代码。
发布于 2015-10-12 12:05:31
当试图连接到一个可用的哨兵时,抛出错误消息。在RedisSentinel工作人员之后超过RedisSentinel.MaxFailures
(缺省值: 5)持续错误。
Redis客户端需要能够连接到一个可用的哨兵,以发现可用的主程序和从站,并在主程序不再响应和失败时得到通知。
您可以增加RedisSentinel.MaxFailures
计数,让它继续循环并连接到可用的Redis。我还使用增加了一个提交来重置故障计数,当它能够连接到有效的哨兵时(因此只有连续的错误才会针对MaxFailures进行检查),此更改可从v4.0.47即现在的可在MyGet上获得中获得。
Redis Client Stats的打印快照
要更好地了解Redis连接的健康情况,可以转储内部Redis统计的快照,以显示客户端连接的活动和健康状况:
RedisStats.ToDictionary().PrintDump();
启用调试日志记录
您可以启用调试日志记录,以便在首选日志提供程序中查看更多错误详细信息:
LogManager.LogFactory = new ConsoleLogFactory(debugEnabled:true);
但是,这也会发出Redis命令,因为这些命令可能过于冗长,所以可以使用以下方法进行抑制:
RedisConfig.DisableVerboseLogging = true;
句柄错误回调
此外,RedisSentinel
还提供了许多钩子来处理自定义事件,例如,当哨兵工作人员通过分配OnWorkerError
委托无法连接时,您可以处理这些事件,例如:
var sentinel = new RedisSentinel(sentinelHost, masterName)
{
OnWorkerError = ex =>
{
"Worker error: {0}".Print(ex);
},
};
https://stackoverflow.com/questions/33040280
复制相似问题