【问题标题】:Why does a mongodb replica set need an odd number of voting members?为什么一个 mongodb 副本集需要奇数个投票成员?
【发布时间】:2015-04-15 15:48:02
【问题描述】:

如果发现副本集要求有点混乱,我可能遗漏了一些明显的东西(比如在什么条件下有选举)。

我知道,在正常操作中,您需要法定人数,并且会进行投票并获得您需要的多数票和奇数台机器。

但是由于我们使用副本集进行故障转移,如果主节点死了,那么我们将剩下偶数个投票成员,根据我有限的经验,这会延长选举主节点的时间。

此外,根据文档,添加投票成员不会启动选举,似乎启动(引导)具有偶数个节点的副本集更有意义?

因此,如果我们开始说副本集中有 4 台机器,而其中一台机器死亡,则需要 3 台机器进行重新选举,快速仲裁。我们重新添加一台机器以恢复正常运行状态,无需重新选举,我们恢复正常运行状态。

有人能解释一下吗?

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    TL;DR:对于单主系统,即使是分区也无法确定哪个剩余部分仍占多数,从而导致两个系统都关闭。

    设 N 是一个由四台机器组成的集群:

    • 一台机器死机,其他机器恢复运行。很好。
    • 两台机器死机,我们处于离线状态,因为我们不再获得多数。不好。

    设 M 为三台机器的集群:

    • 一台机器死机,其他机器恢复运行。很好。
    • 两台机器死机,我们处于离线状态,因为我们不再获得多数。不好。

    => 以 3/4 的成本获得相同的结果。

    现在,让我们添加一两个假设:

    • 我们还将操作某种使用数据库的服务器应用程序
    • 网络可以分区

    假设您有两个数据中心,一个有两个数据库实例和后端服务器机器。如果与备份中心(有一个 MongoDB 实例)的连接失败,您仍然在线。

    现在,如果您在备份数据中心添加第二个 MongoDB 实例,网络分区虽然看起来更高的冗余,但会产生较低的可用性,因为在网络分区的情况下我们会失去大部分并且无法继续运行。

    => 较少可用性较高。但这还不能回答问题。

    假设您真的很担心可用性:您有两个数据中心,后端服务器位于两个数据中心,任播 IP,整个交易。现在两个数据中心之间的网络是分区的,但是一些客户端连接到数据中心 A,而另一些连接到数据中心 B。您现在如何确定哪个数据中心可以接受写入?这是不可能的——这就是为什么奇数是必要的

    您实际上并不需要 Anycast IP、BGP 或任何花哨的东西才能使问题成为现实,任何编写应用程序(如工作人员、陈旧的请求等)都需要稍后合并不同writes,这是一个完全不同的并发方案。

    【讨论】:

    • 我不确定我是否理解您使用 3 台和 4 台机器的示例。如果我们从 4 台机器开始,如果 2 台死亡(所以我们只剩下 2 台),你说这很糟糕。如果我们从 3 台机器开始一个骰子(所以我们还剩下 2 台),你说这很好。投票是否考虑到每个节点,甚至是那些不再参与投票的节点?
    • 3台机器,1台机器宕机,系统保持启动状态,2台机器不行。4台机器也一样,因为2/4不是多数,所以不能选出一个主人,所以加机器没有任何好处,但有额外的成本。然而,更有趣的问题是网络分区,但同样适用:如果网络将机器分成两台机器,你会更糟糕,因为即使所有机器都在运行,也没有可以接受写入。
    • 啊,你编辑了你的评论。是的,2/3 是多数,2/4 不是多数。更重要的是:想想网络分区:所有节点都可以“参与投票”,但另一半看不到。由于无法区分节点故障和分区,因此必须始终选择所有投票成员中的大多数,而不仅仅是可用的成员(猫咬尾巴)
    • 现在这是有道理的,但是如果您要在一台机器上执行维护,并且您要先将其从副本集中删除,这是否意味着您最好说明那么有 4 台机器呢?
    • 如果您的机器容易出错或需要如此长的维护间隔,我宁愿担心这一点。无论如何,不​​:四台机器对分区的弹性较少。如果您非常担心集群会启动,只需使用 5 个成员即可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 2023-04-01
    • 2022-01-26
    • 1970-01-01
    相关资源
    最近更新 更多