【问题标题】:Why is it recommended to create clusters with odd number of nodes为什么建议创建节点数为奇数的集群
【发布时间】:2023-03-11 03:47:02
【问题描述】:

有几个关于分布式系统的资源,例如推荐集群中奇数节点的mongo db documentation

奇数节点有什么好处?

【问题讨论】:

    标签: cluster-computing distributed leader-election


    【解决方案1】:

    简短回答:在 MongoDB 的这种情况下,奇数节点会增加集群系统的可用性(正常运行时间)。

    查看您链接的 MongoDB 文档中的表格:

    +-------------------+------------------------------------------+-----------------+
    | Number of Members | Majority Required to Elect a New Primary | Fault Tolerance |
    +-------------------+------------------------------------------+-----------------+
    |         3         |                    2                     |        1        |
    +-------------------+------------------------------------------+-----------------+
    |         4         |                    3                     |        1        |
    +-------------------+------------------------------------------+-----------------+
    |         5         |                    3                     |        2        |
    +-------------------+------------------------------------------+-----------------+
    |         6         |                    4                     |        2        |
    +-------------------+------------------------------------------+-----------------+
    

    请注意,当您拥有奇数个成员并再添加一个(变为偶数)时,您的容错能力不会提高! (意思是,您的集群不能容忍比原来更多的失败成员)

    这是因为 MongoDB 要求大多数成员都处于启动状态才能选举主节点。此属性并非特定于 MongoDB,而是任何需要大多数成员启动的集群系统(例如,另请参阅 etcd)。

    当节点数增加到偶数时,您的系统可用性实际上会下降,因为尽管您的容错能力保持不变,但仍有更多节点可能发生故障,因此发生故障的概率会上升.

    此外,具有偶数个成员会降低如果存在网络分区,那么您的某些节点子集将能够继续运行的可能性。例如,如果您有一个 6 节点集群,那么它打开了网络分区可以将您的节点划分为 2 个 3 节点分区的可能性。在这种情况下,两个分区都无法与大多数成员通信,您的集群将变得不可用。

    反直觉的结论是,如果您有一个偶数成员集群,那么(从高可用性的角度来看)删除其中一个成员实际上是有益的。

    【讨论】:

      【解决方案2】:

      奇数节点帮助 - 而不是必要 - 选举集群中的领导者。必须避免多种领导者所选的,一种称为分裂脑问题的条件。共识算法使用投票来选举领导者。即,以 多数 票选出节点。

      考虑一个由 5 个节点组成的集群。所需的最低多数为 3(5/2 或 2 + 2 + 1- 交易破坏者)。

      重要的是要注意,即使在失败的情况下,大多数集群投票都是领导选举所必需的。

      认为 5 个节点中有 1 个失败。我们仍然可以用大多数选票选出一个领导者3.好吧,如果其中4个节点,两位领导者会在2票中选择2个领导者?这留给共识算法来解决争用(也许,只需重新启动选举)

      假设 5 个节点中有 2 个发生故障。我们仍然可以以 3 票的多数票选出领导者,即当所有 3 个可用节点都投票给同一个节点时。

      当奇数节点之一发生故障时,人们通常会对获得多数感到困惑,从而使它们的数量保持偶数。现在应该很清楚,选举领导者需要初始集群大小的大部分(最好是奇数)。

      我们已经看到奇数集群如何在节点故障时提供帮助。 这里要补充的另一点是,这在网络分区的情况下有何帮助。 在最坏的情况下,网络分区可以将集群分成恰好相等的两半,这在奇数集群中是不可能发生的。

      只要集群的组成部分或运行节点的数量大于等于 floor(n/2)+1,以对初始集群规模的多数达成共识,集群就可以继续操作

      【讨论】:

        【解决方案3】:

        简答:更高的容错性。

        这是适用于许多其他使用 RAFT 类似领导选举算法的集群的一般原则,例如 Kubernetes ETCD 集群。

        如果它使用 RAFT 进行领导者选择,则集群需要大多数节点(即法定人数)来就领导者达成一致。对于有 n 个成员的集群,quorum 为 (n/2)+1。

        在容错方面,向奇数大小的集群添加额外的节点会降低容错能力。如何?我们仍然有相同数量的节点可能会失败而不会失去仲裁,但是我们有更多的节点可能会失败,这意味着失去仲裁的可能性实际上比以前更高。

        关于容错请查看this官方etcd文档了解更多信息。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-03-19
          • 2018-04-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-25
          • 2020-01-17
          相关资源
          最近更新 更多