使用 ServiceStack.Redis 客户端版本 4.0.44 从远程服务器访问 redis 时获取 "No Redis Sentinels were available"
Getting "No Redis Sentinels were available" when access redis from remote server using ServiceStack.Redis client version 4.0.44
我们有一个带有两个 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)。但是,我不太确定这是问题所在,因为它说 "No Redis Sentinels were available".
虽然我们在某些应用程序上间歇性地遇到这个问题,但其他应用程序(例如我们编写的一些控制台应用程序)似乎一直在遇到这个问题。
任何人都可以阐明这个问题是什么以及如何解决它吗?如果你 Google "No Redis Sentinels were available" 你只会得到 ServiceStack.Redis GitHub 页面,其中包含输出此消息的实际代码。
在 RedisSentinel Worker 超过 RedisSentinel.MaxFailures
(默认值:5)后尝试连接到其中一个可用哨兵时出现 error message is thrown 连续错误。
Redis 客户端需要能够连接到一个可用的 Sentinels 以发现可用的主站和从站,并在主站不再响应并进行故障转移时收到通知。
您可以增加 RedisSentinel.MaxFailures
计数以使其继续循环并连接到可用的 Redis Sentinels。我也 added a commit to reset the failure count when it was able to connect to a valid Sentinel (so only continuous errors are checked against MaxFailures), this change is available from v4.0.47 that's now available on MyGet.
打印 Redis 客户端统计信息的快照
为了更好地了解 Redis 连接的健康状况,您可以转储内部 Redis Stats 的快照以显示 activity 和客户端连接的健康状况:
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);
},
};
我们有一个带有两个 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)。但是,我不太确定这是问题所在,因为它说 "No Redis Sentinels were available".
虽然我们在某些应用程序上间歇性地遇到这个问题,但其他应用程序(例如我们编写的一些控制台应用程序)似乎一直在遇到这个问题。
任何人都可以阐明这个问题是什么以及如何解决它吗?如果你 Google "No Redis Sentinels were available" 你只会得到 ServiceStack.Redis GitHub 页面,其中包含输出此消息的实际代码。
在 RedisSentinel Worker 超过 RedisSentinel.MaxFailures
(默认值:5)后尝试连接到其中一个可用哨兵时出现 error message is thrown 连续错误。
Redis 客户端需要能够连接到一个可用的 Sentinels 以发现可用的主站和从站,并在主站不再响应并进行故障转移时收到通知。
您可以增加 RedisSentinel.MaxFailures
计数以使其继续循环并连接到可用的 Redis Sentinels。我也 added a commit to reset the failure count when it was able to connect to a valid Sentinel (so only continuous errors are checked against MaxFailures), this change is available from v4.0.47 that's now available on MyGet.
打印 Redis 客户端统计信息的快照
为了更好地了解 Redis 连接的健康状况,您可以转储内部 Redis Stats 的快照以显示 activity 和客户端连接的健康状况:
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);
},
};