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)
如何解决这个问题呢?
编辑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)
我担心,除了重建副本集之外没有其他官方方法可以解决这个问题(但你可以稍后找到一些技巧).跟着这些步骤:
然后按照mongodb手册重新创建副本集
我担心你不得不花很长时间等待同步完成.然后你很高兴.
我强烈建议添加仲裁器以再次避免这种情况.
所以,上面是解决问题的官方方法,这就是我使用MongoDB 2.4.8的方法.我没有找到任何证明它的文件,所以绝对没有保证.你自己承担风险.无论如何,如果它对你不起作用,只需回归正式方式.值得尝试;)
转到本地数据库,并从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)
就这样.如果您有任何疑问,请告诉我.
| 归档时间: |
|
| 查看次数: |
8655 次 |
| 最近记录: |