假設有這樣一個場景,有一個MongoDB的副本集,由於故障導致只剩下兩個節點可用,而這兩個節點目前都是slave
節點。其他的故障節點也無法再重新啟動,也就是無法重新加入到副本集中。
Q:這種情況下是否因為這個副本集就無法使用了?
PHP中文网2017-04-24 09:13:00
當大部分節點都宕掉了,剩餘可以互相連接的節點數不超過一半時,可以參考一下文件來重新配置這個副本集:
- http://docs.mongodb.org/manual/tutorial/reconfigure-replica-set-with-unavailable-members/
文件中提到兩種方法:
迷茫2017-04-24 09:13:00
這取決於你的副本集總的節點個數,副本集中可以相互聯繫的節點數大於總節點數一半時,可以有新的primary節點被選取出來,副本集可以正常工作,如果可以相互聯繫的節點小於等於總結點一半,所有節點都會變成secondary節點,此時副本集變成唯讀狀態,所有寫入操作失敗.
有這個現象的原因是mongodb的副本集不允許出現多個primary節點,在可以聯繫的節點數小於等於總節點數一半時,若依然能夠選出primary,便有可能出現多個primary節點,導致整個副本集資料混亂,所有節點變為secondary,在故障節點復原時副本集還可以正常運作.
如果遇到正常節點不足以選出primary,可以透過幾種途徑解決.
1) 若其他节点因数据损坏不能启动,像你说的依然有两个节点存活,可以停止一个节点,将硬盘数据导出至挂掉的节点,启动即可.
2) 若其他节点因不可恢复原因导致不能启动,你可以去掉replset选项将此节点作为单机服务启动,若要恢复为副本集模式,可以试一下将一个正常节点的local相关的数据文件删除,重新以replset启动,初始化自身之后使用rs.add()添加新节点,线上没有遇到过这种情况,如果实在没办法,你可以试一下.