搜索

首页  >  问答  >  正文

MongoDB副本集问题

假设有这样一个场景,有一个MongoDB的副本集,由于故障导致只剩下两个节点可用,而这两个节点目前都是slave节点。其他的故障节点也无法再重新启动,即无法重新加入到副本集中。
Q:这种情况下是否因为这个副本集就无法使用了?

PHPzPHPz2765 天前800

全部回复(2)我来回复

  • PHP中文网

    PHP中文网2017-04-24 09:13:00

    当大部分节点都宕掉了,剩余可以互相连接的节点数不超过一半时,可以参考一下文档来重新配置这个副本集:
    - http://docs.mongodb.org/manual/tutorial/reconfigure-replica-set-with-unavailable-members/

    文档中提到两种办法:

    1. 一种是强制重新配置这个副本集,把宕机的节点从这个副本集中删掉,只由剩余的还在运行的节点组成新的副本集,这样就可以选举出一个新的主节点(primary)了。如果MongoDB的版本是2.0或以上,可以使用这个办法。
    2. 另一种办法就是替换这个副本集。如果你的MongoDB版本是2.0以下,可以使用这个办法。

    回复
    0
  • 迷茫

    迷茫2017-04-24 09:13:00

    这取决于你的副本集总的节点个数,副本集中可以相互联系的节点数大于总节点数一半时,可以有新的primary节点被选取出来,副本集可以正常工作,如果可以相互联系的节点小于等于总结点一半,所有节点都会变为secondary节点,此时副本集变为只读状态,所有写操作失败.

    有这个现象的原因是mongodb的副本集不允许出现多个primary节点,在可以联系的节点数小于等于总节点数一半时,若依然能够选出primary,便有可能出现多个primary节点,导致整个副本集数据混乱,所有节点变为secondary,在故障节点恢复时副本集还可以正常运行.

    如果遇到正常节点不足以选出primary,可以通过几种途径解决.

    1) 若其他节点因数据损坏不能启动,像你说的依然有两个节点存活,可以停止一个节点,将硬盘数据导出至挂掉的节点,启动即可.
    
    2) 若其他节点因不可恢复原因导致不能启动,你可以去掉replset选项将此节点作为单机服务启动,若要恢复为副本集模式,可以试一下将一个正常节点的local相关的数据文件删除,重新以replset启动,初始化自身之后使用rs.add()添加新节点,线上没有遇到过这种情况,如果实在没办法,你可以试一下.
    

    回复
    0
  • 取消回复