MongoDB Replica Set 中某節點(主或從)離線超過一個月,期間已從 rs.conf() 移除,磁碟資料尚在但嚴重過期。需將其重新加入叢集並完成全量同步。本文記錄標準操作流程。
> use admin
> db.shutdownServer()
rs.add({
_id: 10,
host: "mongodb3.example.net:27017",
priority: 0,
hidden: true
})
priority: 0:不參與主節點選舉。hidden: true:不出現在 isMaster 回應中,避免客戶端讀取過期資料。rm -rf /data/db/*
務必清空,否則舊資料會干擾初始同步,甚至導致校驗和不符。
cd /home/mongodb && numactl --interleave=all ./bin/mongod -f ./conf/mongod.conf >/dev/null 2>&1 &
啟動後自動觸發 Initial Sync(全量同步),從主節點拉取最新資料。
cfg = rs.conf()
cfg.members[10].priority = 1
cfg.members[10].hidden = false
rs.reconfig(cfg)
確認 rs.status() 顯示該節點狀態為 SECONDARY、optimeDate 接近主節點即完成。
| 現象 | 原因 | 處理 |
|---|---|---|
同步卡在 STARTUP2 | Oplog 不足覆蓋離線期間 | 擴大主節點 Oplog 大小,或重新初始化該節點 |
| 同步極慢 | 網路頻寬不足 / 磁碟 IO 瓶頸 | 調整 replication.oplogWindowMinutes、啟用壓縮 net.compression.compressors=snappy |
報錯 StaleConfig | 節點本地配置版本落後 | 重新執行 rs.add 強制更新配置 |
rs.printSlaveReplicationInfo() 確保同步延遲在可接受範圍。enableMajorityReadConcern 確保讀取一致性。