为什么故障转移不能用于我的Mongo replicaset?

时间:2016-05-16 21:18:54

标签: mongodb replicaset

因此,在我们的配置中,我们共有6台Mongod服务器。其中3个我们已经运行了一段时间(版本3.0.6),我们最近从我们的新数据中心(v3.2.6)添加了3个新的,因为我们认为这将是一个很好的方法将使用率从旧的迁移到新的。这些较新的盒子已经轮换了几个星期,并且是最新的。没有任何框的从属延迟高于0。

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

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

所以今天,我们想到了所有事情,我们停止了3台原始服务器上的mongod进程。

所有新盒子都不会成为主要盒子。他们都保持中学。所以我们转回旧的主要版本,它立即重新开始。因此,考虑到问题可能是优先级问题,我们将旧的主要版本减少为1并将其中一个新框格设置为2.保存配置,新框将成为主要框架。

想到我们舔它,我们再一次关闭了旧的小学。

新盒子立即退回到中学,没有主要的。

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

因此,我们目前将旧框的优先级设置为0,并使其保持运行状态。

但我们不能坚持这样的方式。为什么没有一台新机器自动升级为主机?如果我们拆除旧箱子,它为什么会降级呢?

1 个答案:

答案 0 :(得分:1)

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

这与优先级无关,顺便说一句。除非你完全知道你在做什么,否则你不应该操纵它。

解决问题应该很容易,但是:

  

重要:在继续操作之前,确保所有“新”成员都处于辅助或主要状态

  1. 连接到主要。
  2. 使用 rs.remove() 从副本集配置中删除已停止的旧成员
  3. 如有必要(我的描述中不清楚),请使用 rs.stepDown() 将您的一台新服务器设为主服务器并连接至
  4. 再次使用 rs.remove() 删除副本集中的最后一个“旧”成员
  5. 如果您的副本集中剩余an odd number of voting members,则可以构建法定人数elect a new primary