有几个关于分布式系统的资源,比如推荐集群中奇数节点的mongo db 文档。
拥有奇数个节点有什么好处?
有几个关于分布式系统的资源,比如推荐集群中奇数节点的mongo db 文档。
拥有奇数个节点有什么好处?
简短的回答:在 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 节点分区的可能性。在这种情况下,两个分区都无法与大多数成员通信,并且您的集群将变得不可用。
违反直觉的结论是,如果您有一个偶数成员集群,那么删除其中一个成员实际上是有益的(从高可用性的角度来看) 。
奇数个节点有助于- 而不是必需的 - 选举集群中的领导者。It is essential to avoid multiple leaders getting elected, a condition known as split-brain problem. 共识算法使用投票来选举领导者。即,以多数票选出节点。
考虑一个由 5 个节点组成的集群。所需的最低多数为 3(5/2 或 2 + 2 + 1- 交易破坏者)。
重要的是要注意,即使在失败的情况下,大多数集群投票都是领导选举所必需的。
考虑 5 个节点中有 1 个失败。we can still elect a leader with majority votes of 3. well, what if out of the 4 nodes, two leaders get elected with equal votes of 2? 这留给共识算法来解决争用(也许,只需重新启动选举)
假设 5 个节点中有 2 个发生故障。我们仍然可以以 3 票的多数票选出领导者,即当所有 3 个可用节点都投票给同一个节点时。
当奇数节点之一发生故障时,人们通常会对获得多数感到困惑,从而使它们的数量偶数。现在应该很清楚,选举领导者需要初始集群大小的大部分(最好是奇数)。
我们已经看到奇数集群如何在节点故障的情况下提供帮助。这里要补充的另一点是,这在网络分区的情况下有何帮助。在最坏的情况下,网络分区可以将集群分成恰好相等的两半,这在奇数集群中是不可能发生的。
只要集群的部分或运行节点的数量大于等于 floor(n/2)+1,以初始集群大小为基础达成多数共识,集群就可以继续运行