![当某些节点发生故障时,MongoDB ReplicaSet 选举](https://linux22.com/image/585931/%E5%BD%93%E6%9F%90%E4%BA%9B%E8%8A%82%E7%82%B9%E5%8F%91%E7%94%9F%E6%95%85%E9%9A%9C%E6%97%B6%EF%BC%8CMongoDB%20ReplicaSet%20%E9%80%89%E4%B8%BE.png)
我正在尝试了解 ReplicaSet 概念,并在 mongoDB 文档中发现一些奇怪的事情:
要当选为主节点,它必须获得多数票。这是集合中所有选票的多数:如果您有一个 5 个成员的集合,并且 4 个成员失败,则集合的多数仍然是 3 个成员 (floor(5/2)+1)。集合中的每个成员都会获得一票,并且知道可用的票数总数。
如果没有节点能够达到多数,那么就无法选出主节点,也无法将数据写入该副本集(尽管仍然可以读取辅助节点)。
(取自这里)
那么,如果我理解正确的话,在上面提到的 5 个成员的情况下,仍然存在的一个节点将不会被选为主节点,并且整个集合将不会获得任何写入?即使这个单个节点是选举前的最后一个主节点,情况也是如此吗?
如果这是真的,那么可能有很多不那么激进的情况最终会形成退化集。我们如何避免这种情况?
答案1
多数规则旨在防止多个单个(孤立)节点同时声称自己是主节点。避免这种情况的策略取决于您的架构。
举几个例子 - 您可以在每一个数据中心或区域中设置备用仲裁器,这样您就可以添加它们来形成多数,您可以在发生“灾难”时重新配置集合以仅包含 3 个节点而不是 5 个节点,从而让 2 个节点形成多数等。或者,您可以重新启动唯一剩下的 mongod 实例(如果存在这样的实例)作为没有副本集选项的独立实例,并以这种方式使用它,直到您恢复您的集合。
在设计跨多个区域的灾难恢复或故障转移时,重要的是在设计时牢记多数规则。