假设有这样一个场景,有一个MongoDB的副本集,由于故障导致只剩下两个节点可用,而这两个节点目前都是slave节点。其他的故障节点也无法再重新启动,即无法重新加入到副本集中。Q:这种情况下是否因为这个副本集就无法使用了?
2 回答
繁花不似锦
TA贡献1851条经验 获得超4个赞
这取决于你的副本集总的节点个数,副本集中可以相互联系的节点数大于总节点数一半时,可以有新的primary节点被选取出来,副本集可以正常工作,如果可以相互联系的节点小于等于总结点一半,所有节点都会变为secondary节点,此时副本集变为只读状态,所有写操作失败.
有这个现象的原因是mongodb的副本集不允许出现多个primary节点,在可以联系的节点数小于等于总节点数一半时,若依然能够选出primary,便有可能出现多个primary节点,导致整个副本集数据混乱,所有节点变为secondary,在故障节点恢复时副本集还可以正常运行.
如果遇到正常节点不足以选出primary,可以通过几种途径解决.
1) 若其他节点因数据损坏不能启动,像你说的依然有两个节点存活,可以停止一个节点,将硬盘数据导出至挂掉的节点,启动即可. 2) 若其他节点因不可恢复原因导致不能启动,你可以去掉replset选项将此节点作为单机服务启动,若要恢复为副本集模式, 可以试一下将一个正常节点的local相关的数据文件删除,重新以replset启动,初始化自身之后使用rs.add()添加新节点, 线上没有遇到过这种情况,如果实在没办法,你可以试一下.
- 2 回答
- 0 关注
- 955 浏览
添加回答
举报
0/150
提交
取消