ServiceStack.Redis WaitBeforeForcingMasterFailover

ServiceStack.Redis WaitBeforeForcingMasterFailover

上下文:

我正在尝试了解 WaitBeforeForcingMasterFailover 属性(以及与之关联的代码)在 ServiceStack.Redis.RedisSentinel.

中存在的动机

如果我对代码的解释正确 - 属性 背后的含义似乎涵盖了以下情况:

  1. 我们连接到一个健康的哨兵,它告诉我们主机 X 上有主机
  2. 当我们尝试与主机 X 上的主服务器建立连接时 - 由于某种原因我们失败了。

因此逻辑将是 - 如果我们在 WaitBeforeForcingMasterFailover 期间连续无法创建到 X 的连接 - 启动强制故障转移。

故障转移不需要达到法定人数,只要有 1 个可用哨兵就可以选出一个新的 master。

SENTINEL FAILOVER Force a failover as if the master was not reachable, and without asking for agreement to other Sentinels (however a new version of the configuration will be published so that the other Sentinels will update their configurations).

来源:https://redis.io/topics/sentinel#sentinel-api

在我看来,此功能在某些情况下可能是有益的,而在其他情况下可能会带来麻烦。

例如,在网络分区的情况下,如果客户端仍然连接到少数哨兵(他们无法达到法定人数)并且这些哨兵指向不再可访问的主机 - 这个强制故障转移选项将在可达分区内触发故障转移,从而可能造成脑裂情况。

来自 Java 背景,我还没有在 Jedis 和 Lettuce 等流行的 Redis 客户端中看到此类功能。

这让我想知道以下问题:

  1. 是否有充分的理由默认启用此功能? (我知道如果你想通过在其中设置一个巨大的值来有效地禁用它)。他们真的值得冒干扰自然哨兵工作流程并可能引入我之前提到的问题的风险吗?

  2. 禁用此选项后库是否可以正常工作?是否有我可能错过的情况,关闭此功能会导致问题,即使有一些快乐的路径(没有网络分区,只是由于部署或突然的节点故障而导致的常规故障转移)?

如果 RedisSentinel 无法在 60 秒(默认)内建立与主客户端的连接,它将指示连接的哨兵强制进行故障转移。

配置时可以增加等待时间 RedisSentinel:

new RedisSentinel {
    WaitBeforeForcingMasterFailover = TimeSpan.FromSeconds(...)
}

不强制故障转移的替代方案是,每个尝试使用 Redis 的客户端将继续失败,直到所有哨兵达成一致认为主服务器无响应,如果默认 60s太短了,您应该将其增加到您的应用程序保持无响应的可接受的最长时间。

Will the library work fine with this option disabled?

这只是当它无法与 Redis 客户端建立连接时发生的回退,扩展它不会阻止 RedisSentinel 工作,但任何尝试使用 Redis 的东西在它能够与 Redis 建立有效连接之前都不会工作客户.

当回退确实发生时,您的 error 日志应包含模板化字符串:

"Valid master was not found at '{0}' within '{1}'. Sending SENTINEL failover..."

如果您的错误日志不包含此内容,则表明从未超过超时并且从未由 RedisSentinel 强制执行故障转移。