我正在尝试设置一个包含两个节点的副本集:Node0和Node1。从Node0我初始化了一个名为“rs0”的副本集,并将Node1添加到它。问题是它被添加为主节点而不是辅助节点,最终结果是具有两个主节点的副本集。
这是从Node0
执行rs.status()
命令的结果
"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.
答案 0 :(得分:5)
您提到在两台服务器上运行rs.initiate()
。这应该只在一个上完成。
我建议您从头开始,删除每个节点的dbpath目录(如果db不为空,则备份数据)。然后,启动所有mongod进程,登录其中一个,然后调用
rs.initiate()
rs.add(<other node 1>)
另一个节点自动通过第一个节点获取副本集配置。对要添加的每个其他节点重复`rs.add()。
答案 1 :(得分:0)
我遇到了同样的情况,错误地在两个实例上运行rs.initiate()
。我通过关闭应该是第二个实例,删除数据目录并重新启动实例来解决这个问题。重新启动后,它被正确检测为副本集的成员,正确同步,最重要的是只有一个主要成员。
此操作不应该是危险的,因为据我所知,副本集会复制节点上的所有数据。可以肯定的是,您可以在关闭辅助节点后移动数据目录,以便在发生任何错误时保留备份。