使用ServiceStack.Redis客户端版本4.0.44从远程服务器访问redis时获取“No Redis Sentinels”

时间:2015-10-09 14:02:17

标签: redis servicestack.redis redis-sentinel

我们有一个带有两台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页面。

1 个答案:

答案 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连接的运行状况,您可以转储内部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);
    },
};