4

我们有一个带有两个 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 Sentinel”。

虽然我们在某些应用程序上间歇性地遇到此问题,但其他一些应用程序(例如我们编写的一些控制台应用程序)似乎一直在遇到此问题。

任何人都可以阐明这个问题是什么以及如何解决它?如果您在 Google 上搜索“没有可用的 Redis Sentinels”,您只会得到 ServiceStack.Redis GitHub 页面,该页面包含输出此消息的实际代码。

4

1 回答 1

2

当 RedisSentinel Worker在尝试连接到可用的哨兵之一时超过(默认值:5)连续错误后,将引发该错误消息。RedisSentinel.MaxFailures

Redis 客户端需要能够连接到可用的 Sentinel 以发现可用的主服务器和从服务器,并在主服务器不再响应并发生故障转移时得到通知。

您可以增加RedisSentinel.MaxFailures计数以使其继续循环并连接到可用的 Redis Sentinel。我还添加了一个提交以在它能够连接到有效的 Sentinel 时重置失败计数(因此仅针对 MaxFailures 检查连续错误),此更改可从 v4.0.47 开始,现在可在 MyGet 上使用

Redis 客户端统计信息的打印快照

为了更好地了解 Redis 连接的健康状况,您可以转储内部Redis Stats的快照,以显示客户端连接的活动和健康状况:

RedisStats.ToDictionary().PrintDump();

启用调试日志

您可以启用调试日志记录以在首选日志记录提供程序中查看更多错误详细信息:

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);
    },
};
于 2015-10-12T20:05:31.940 回答