Mongodb,所有replSet都停留在Startup2上

enz*_*ang 3 replication mongodb

我有mongodb复制集与2节点(node0,node1),其中一天(node1)崩溃.

考虑删除node1的所有数据并重新启动它需要很长时间,我将node0和rsync数据关闭到node1

之后,我启动node0和node1.replSet都停留在STARTUP2,下面是一些日志:

Sat Feb  8 13:14:22.031 [rsMgr] replSet I don't see a primary and I can't elect myself
Sat Feb  8 13:14:24.888 [rsStart] replSet initial sync pending
Sat Feb  8 13:14:24.889 [rsStart] replSet initial sync need a member to be primary or secondary to do our initial sync
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题呢?

yao*_*ing 5

编辑10/29/15:我发现实际上有一种更简单的方法可以通过使用rs.reconfig选项找回你的主要版本{force: true}.您可以在此处找到详细文档.尽管文档中提到它可能会导致回滚,但请谨慎使用.

你永远不应该构建一个2个成员的副本集,因为一旦其中一个被关闭,另一个不知道是不是因为另一个是关闭,或者它本身已经从网络中断了.作为解决方案,添加仲裁节点进行投票.

所以你的问题是,当你重新启动node0时,node1已经死了,没有其他节点投票给它.它不知道它是否适合再运行一个主节点.因此它会回到辅助,这就是你看到这个消息的原因

Sat Feb  8 13:14:24.889 [rsStart] replSet initial sync need a member to be primary or secondary to do our initial sync
Run Code Online (Sandbox Code Playgroud)

我担心,除了重建副本集之外没有其他官方方法可以解决这个问题(但你可以稍后找到一些技巧).跟着这些步骤:

  1. 停止node0
  2. 转到node0的数据文件夹(在我的机器上是/ var/lib/mongodb.在位于/etc/mongodb.conf的配置文件中找到你的)
  3. 从文件夹中删除local.*.注意
    1. 即使您备份了这些文件,这也是可撤消的.
    2. 您将丢失本地数据库中的所有用户.
  4. 启动node0,您将看到它作为独立节点运行.

然后按照mongodb手册重新创建副本集

  1. 运行rs.initiate()来初始化副本集
  2. 将node1添加到副本集:rs.add("node1 domain name");

我担心你不得不花很长时间等待同步完成.然后你很高兴.

我强烈建议添加仲裁器以再次避免这种情况.

所以,上面是解决问题的官方方法,这就是我使用MongoDB 2.4.8的方法.我没有找到任何证明它的文件,所以绝对没有保证.你自己承担风险.无论如何,如果它对你不起作用,只需回归正式方式.值得尝试;)

  1. 确保在整个过程中没有应用程序尝试修改您的数据库.否则这些修改将不会同步到辅助服务器.
  2. 在没有replSet = [set name]参数的情况下重新启动服务器,以便它作为独立运行,您可以对其进行修改.
  3. 转到本地数据库,并从db.system.replset中删除node1.例如在我的机器中最初它是这样的:

    {"_ id":"rs0","version":5,"members":[{"_ id":0,"host":"node0"},{"_ id":1,"host":"node1" }]}

你应该把它改成

{
    "_id": "rs0",
    "version": 5,
    "members": [{
        "_id": 0,
        "host": "node0"
    }]
}
Run Code Online (Sandbox Code Playgroud)
  1. 使用replSet = [set name]重新启动,您应该再次看到node0成为主节点.
  2. 使用rs.add命令将node1添加到副本集.

就这样.如果您有任何疑问,请告诉我.