我有2个节点(node0,node1)的mongodb复制集,其中一天(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
如何解决这个问题?
答案 0 :(得分:5)
编辑10/29/15:我发现使用带有rs.reconfig
选项的{force: true}
实际上可以更轻松地找回主要版本。您可以找到详细信息文档here。尽管文档中提到它可能会导致回滚,但请谨慎使用。
你永远不应该构建一个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
我担心,因为我知道除了重建副本集之外没有其他官方方法可以解决这个问题(但你可以稍后找到一些技巧)。请按照以下步骤操作:
然后按照mongodb manual重新创建副本集
我担心你不得不花很长时间等待同步完成。然后你很高兴。
我强烈建议添加仲裁器以避免再次发生这种情况。
所以,以上是解决问题的官方方法,这就是我使用MongoDB 2.4.8的方法。我没有找到任何证明它的文件,所以绝对是 NO 保证。你自己承担风险。无论如何,如果它对你不起作用,只需回归正式方式。值得尝试;)
转到本地数据库,并从db.system.replset中删除node1。例如在我的机器中最初它就像:
{ “_id”:“rs0”, “版本”:5, “成员”:[{ “_id”:0, “host”:“node0” },{ “_id”:1, “host”:“node1” }] }
您应该将其更改为
{
"_id": "rs0",
"version": 5,
"members": [{
"_id": 0,
"host": "node0"
}]
}
这就是全部。如果您有任何问题,请告诉我。
答案 1 :(得分:0)
使用彩信时遇到了同样的问题。我创建了一个由3台机器组成的新ReplicaSet(2个数据+ 1个仲裁器,这在MMS btw上设置很棘手)并且它们都处于STARTUP2 "初始同步需要一个成员作为主要或次要来做我们的初始同步"
myReplicaSet:STARTUP2> rs.status()
{
"set" : "myReplicaSet",
"date" : ISODate("2015-01-17T21:20:12Z"),
"myState" : 5,
"members" : [
{
"_id" : 0,
"name" : "server1.mydomain.com:27000",
"health" : 1,
"state" : 5,
"stateStr" : "STARTUP2",
"uptime" : 142,
"optime" : Timestamp(0, 0),
"optimeDate" : ISODate("1970-01-01T00:00:00Z"),
"lastHeartbeat" : ISODate("2015-01-17T21:20:12Z"),
"lastHeartbeatRecv" : ISODate("2015-01-17T21:20:11Z"),
"pingMs" : 0,
"lastHeartbeatMessage" : "initial sync need a member to be primary or secondary to do our initial sync"
},
{
"_id" : 1,
"name" : "server2.mydomain.com:27000",
"health" : 1,
"state" : 5,
"stateStr" : "STARTUP2",
"uptime" : 142,
"optime" : Timestamp(0, 0),
"optimeDate" : ISODate("1970-01-01T00:00:00Z"),
"infoMessage" : "initial sync need a member to be primary or secondary to do our initial sync",
"self" : true
},
{
"_id" : 3,
"name" : "server3.mydomain.com:27000",
"health" : 1,
"state" : 5,
"stateStr" : "STARTUP2",
"uptime" : 140,
"lastHeartbeat" : ISODate("2015-01-17T21:20:12Z"),
"lastHeartbeatRecv" : ISODate("2015-01-17T21:20:10Z"),
"pingMs" : 0
}
],
"ok" : 1
}
为了解决这个问题,我使用了yaoxing的答案。我不得不在MMS上关闭ReplicaSet,并等待所有成员关闭。花了一段时间...... 然后,在所有这些上,我删除了数据目录的内容:
sudo rm -Rf /var/data/*
在此之后,我将ReplicaSet打开,一切都很好。