为什么故障转移在我的 Mongo 副本集上不起作用?

Why isn't failover working on my Mongo replicaset?

所以在我们的配置中,我们总共有 6 个 Mongod 服务器。其中 3 个我们已经 运行 一段时间了(版本 3.0.6),我们最近从我们的新数据中心(v3.2.6)添加了 3 个新的,因为我们认为这将是迁移使用的好方法从旧到新。这些较新的盒子已经轮换使用了几周,并且会是最新的。 None 个盒子的从延迟大于 0。

其中一个原始服务器的优先级为 2,而其他 5 个服务器的优先级为 1。否则,每个服务器的配置都是相同的。我们没有额外的服务器用于投票等目的

我们的应用程序使用所有 6 个地址,因此它们将自行进行故障转移。

所以今天,以为我们已经想到了一切,我们停止了 3 个原始服务器上的 mongod 进程。

并且 none 个新框将成为主要框。他们都留在中学。所以我们重新打开旧的主节点,它立即再次成为主节点。因此,考虑到问题可能与优先级有关,我们将旧的主框减少为 1,并将其中一个新框设置为 2。保存配置,新框成为主框。

以为我们成功了,我们又一次关闭了旧的主节点。

并且新盒子立即降级为次要盒子,没有留下主要盒子。

所以我们开始备份旧的主服务器,新盒子立即再次成为主服务器。

因此,我们目前将旧框的优先级设置为 0,并保留它 运行。

但我们不能一直这样 运行。为什么其中一台新机器没有自动提升为主要机器?如果我们移除旧盒子,为什么它会下台?

很容易回答:6 - 3 = 3,比 4 小,您需要用它来建立法定人数。只有 3 台服务器启动,其余 运行 成员无法建立法定人数(计算副本集配置定义的服务器数量)。它们恢复到次要状态,因为无法可靠地确定主要状态 - 它可能只是正在进行的网络分区。允许选举在少于法定人数的情况下成功将使可怕的脑裂情况成为可能。

这与优先级无关,顺便说一句。你不应该 fiddle 除非你 确切地 知道你在做什么。

不过,解决您的问题应该很简单:

Important: Make sure all "new" members are either in secondary or primary state before proceeding

  1. 连接到主服务器。
  2. 使用rs.remove()从副本集配置中删除停止的旧成员
  3. 如有必要(从你的描述中我不清楚),请使用 rs.stepDown() 将你的一个新服务器设为主服务器并连接到它
  4. 再次使用rs.remove()从副本集中删除最后一个"old"成员

an odd number of voting members remaining in your replica set, they are able to build a quorum and elect a new primary.