2

我正在尝试在 3 节点 redis 集群中设置自动故障转移系统。我在每个节点上安装了 redis-sentinel(就像这个人一样:http ://www.symantec.com/connect/blogs/configuring-redis-high-availability )。只要我有两个或三个节点,一切都很好。问题是,只要只剩下一个节点并且它是一个从节点,它就不会自动被选为主节点。quorum 设置为 1,因此最后一个节点检测到 master 的故障,但由于没有多数,因此无法投票支持故障转移。

为了克服这个(令人惊讶的)问题,我编写了一个小脚本,询问其他节点的主节点,如果他们不回答,我将当前节点设置为主节点。这个脚本在 redis-sentinel.conf 文件中被调用,作为一个通知脚本。但是……只要启动了redis-sentinel服务,这个配置就被“抹掉”了!如果我查看 /etc 中的配置文件,“sentinel notification-script”行已经消失(redis-sentinel 重写了它的配置文件,为什么不这样做)但是我写的配置不再可用:

1)  1) "name"
    2) "mymaster"
    3) "ip"
    4) "x.x.x.x"
    5) "port"
    6) "6379"
    7) "runid"
    8) "somerunid"
    9) "flags"
   10) "master"
   11) "pending-commands"
   12) "0"
   13) "last-ping-sent"
   14) "0"
   15) "last-ok-ping-reply"
   16) "395"
   17) "last-ping-reply"
   18) "395"
   19) "down-after-milliseconds"
   20) "30000"
   21) "info-refresh"
   22) "674"
   23) "role-reported"
   24) "master"
   25) "role-reported-time"
   26) "171302"
   27) "config-epoch"
   28) "0"
   29) "num-slaves"
   30) "1"
   31) "num-other-sentinels"
   32) "1"
   33) "quorum"
   34) "1"
   35) "failover-timeout"
   36) "180000"
   37) "parallel-syncs"
   38) "1"

这是 sentinel-masters 命令的结果。唯一的问题是,我之前将“毫秒后停机”设置为 5000,将“故障转移超时”设置为 10000 ...

不知道有没有人遇到过类似的情况?好吧,如果有人对正在发生的事情有一点了解,我会很高兴的;)

4

2 回答 2

3

这是将哨兵放置在 redis 实例节点上的原因。将它们视为监控代理。您不会将您的网站监视器放在运行您的网站的同一节点上,并期望捕获节点死亡。与 Sentinel 相同。

哨兵监控的正确途径是理想地从客户端运行它们,如果这不可能或不可行,那么从尽可能靠近客户端的专用节点运行。

正如 antirez 所说,您需要有足够的哨兵才能进行选举。有两种选举:1:决定新的 master 和 2:决定哪个哨兵处理升级。在您的场景中,您只有一个哨兵,但要选举一个哨兵来处理促销活动,您的哨兵需要来自法定人数的哨兵的投票。这个数字是看到的所有哨兵的大多数。在您的情况下,需要两名哨兵投票才能进行选举。此仲裁数​​不可配置且不受仲裁设置的影响。这是为了减少多个主人的机会。

我还强烈建议不要将法定人数设置为少于哨兵的一半 + 1。这可能导致你有两个主人的裂脑操作。或者在您的情况下,您可以拥有三个。如果您的主服务器和两个从服务器之间失去了连接,但客户端仍然有连接,您的设置可能会触发脑裂——从服务器被提升并且新连接与该主服务器通信,而现有连接继续与原始连接通信。因此,您在两个可能相互冲突的主控中有有效数据。

那篇赛门铁克文章的作者只考虑了 Redis 守护进程的死亡,而不是节点。因此,它确实不是 HA 设置。

于 2014-12-22T19:47:36.940 回答
2

仲裁仅用于达到触发故障转移的 ODOWN 状态。让故障转移真正发生the slave must be voted by a majority, so a single node can't get elected. 如果您有这样的要求,并且您不关心只有多数方能够在集群中继续运行(这意味着如果客户端与有主控的少数方进行分区,则少数方会丢失未绑定的数据),您也可以在您的客户端机器中添加哨兵,这样哨兵的总数是,例如,5,即使两个 Redis 节点关闭,唯一剩余的节点加上运行客户端的两个哨兵足以获得大多数3. 不幸的是,Sentinel 文档不足以解释这些内容。有所有信息可以让图片正确,但没有更快阅读/部署的示例。

于 2014-12-22T17:54:27.783 回答