6

我正在尝试设置具有两个节点的副本集:Node0 和 Node1。我从 Node0 初始化了一个名为“rs0”的副本集并将 Node1 添加到它。问题是它被添加为主节点而不是辅助节点,最终结果是具有两个主节点的副本集。

这是rs.status()从 Node0 执行命令的结果

   "set" : "rs0",
        "date" : ISODate("2012-10-23T21:03:37Z"),
        "myState" : 1,
        "members" : [
                {
                        "_id" : 0,
                        "name" : "Node0:27017",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "uptime" : 61185,
                        "optime" : Timestamp(1350967947000, 1),
                        "optimeDate" : ISODate("2012-10-23T04:52:27Z"),
                        "self" : true
                },
                {
                        "_id" : 1,
                        "name" : "Node1:27017",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "uptime" : 58270,
                        "optime" : Timestamp(1350956423000, 1),
                        "optimeDate" : ISODate("2012-10-23T01:40:23Z"),
                        "lastHeartbeat" : ISODate("2012-10-23T21:03:37Z"),
                        "pingMs" : 0
                }
        ],

如果我从 Node1 执行相同的命令,则列出的唯一节点就是它本身。请注意,pingMs 为 0。尝试添加第三个节点或仲裁器会得到类似的结果:每个节点都作为主节点添加,而 pingMS 始终为 0。

4

2 回答 2

5

您提到您rs.initiate()在两台服务器上运行。这应该只在一个上完成。

我建议您从头开始,删除每个节点的 dbpath 目录(如果 db 不为空,请备份之前的数据)。然后,启动所有 mongod 进程,登录其中一个,然后调用

  • rs.initiate()
  • rs.add(<other node 1>)

另一个节点自动通过第一个节点获取副本集配置。对要添加的每个附加节点重复 `rs.add()。

于 2012-10-25T03:13:51.623 回答
0

我遇到了同样的情况,错误地rs.initiate()在两个实例上运行。我通过关闭应该是第二个实例、删除数据目录并重新启动实例来解决这个问题。重新启动时,它被正确检测为副本集的成员,被正确同步,最重要的是只有一个主节点。

此操作不应该是危险的,因为据我所知,副本集会复制节点上的所有数据。可以肯定的是,您可以在辅助节点关闭后移动数据目录,以便在出现任何问题时保留备份。

于 2012-12-16T22:41:37.873 回答