Replication

Mongo DB Replica set Stuck at RECOVERING 狀態

  • October 23, 2018

我們已經創建了一個副本集,現在問題是副本集的 2 個成員

$$ 3 members set $$48 小時後處於恢復模式。最初恢復節點的大小正在增加,現在甚至停止了。因此,在恢復節點時,它們會在 90 GB 數據和 60+ GB 本地數據後卡住。 如何擺脫這種模式?

簡單但有點不安全的方法

  1. 停止第一個二級
  2. 刪除它的內容dbpath
  3. 重啟二級
  4. 等待它趕上初級
  5. 對第二個輔助重複過程

這有點不安全,因為不知道輔助節點為何進入 Recovering 狀態。

更安全,但也更具侵入性的方式

如上所述,但在此過程中停止您的應用程序。這可以防止您的應用程序插入的數據多於輔助節點能夠複製的數據。但是,在生產過程中可能會出現問題。

最安全,但也最具侵入性的方式

  1. 關閉整個副本集
  2. 刪除兩個輔助節點dbpath上的內容
  3. 將 的內容複製dbpath到兩個輔助節點dbpath
  4. 啟動舊的主節點。
  5. 啟動其中一個舊的輔助節點。
  6. 等到選出一個新的主節點。
  7. 啟動剩餘的輔助。

一些注意事項:

使用彩信。它是免費的,易於設置,它為您提供了有關您的副本集的良好資訊。嘗試將“複製滯後”的值保持在 0 左右,並採取一切必要的措施使您的複制滯後永遠不會大於“複製 oplog 視窗”。

始終確保你有一個 1Gb 的網路和一個(對不起)大容量的 RAM。越多越好。額外的經驗法則:RAM 和 SSD 的一半而不是 RAM 和 SSD 的兩倍(RAM 保持在合理的範圍內)。

免責聲明: 在擺弄之前,請務必備份生產數據。

即使您從輔助節點上的新 dbpath 開始,複製過程也會失敗。所以問題是在 oplog 中進行一些更改。oplog 的大小必須設置為最佳值,以便它應該能夠處理所有應用程序寫入其中。

增加 oplog 大小:

關閉主伺服器

use admin

db.shutdownServer()

以獨立方式啟動主要並在不同的埠上執行,例如 37017

在 37017 埠登錄 mongo

mongo --port 37017

刪除本地數據庫中的舊內容

為了安全起見,在刪除之前備份舊的 oplog

mongodump --db local --collection 'oplog.rs' --port 37017

刪除本地數據庫中的舊內容

use local

db.oplog.rs.drop()

db.me.drop()

db.replset.election.drop()

db.replset.minvalid.drop()

db.startup_log.drop()

無法刪除 Replset 集合,因此請使用所需的 id 將其刪除:

db.system.replset.remove({ "_id" : "your_replsetname"})

創建一個所需大小的新 oplog,例如 50 GB

db.runCommand( { create: "oplog.rs", capped: true, size: (50 * 1024 * 1024 * 1024) } )

您還可以在 mongod.conf 文件中以 MB 為單位指定 oplog 大小,例如 50 GB 其 429496 MB

replication:
  oplogSizeMB: 429496

希望這可以幫助 !!!

編輯:

正如 Nicholas Tolley Cottrell 在評論中提到的那樣。在 MongoDB版本 3.6中,我們可以在執行時更改 oplog 大小而無需重新啟動。

檢查目前 oplog 大小

use local
db.oplog.rs.stats().maxSize

將 oplog 大小更改為 10 GB

db.adminCommand({replSetResizeOplog: 1, size: 10000})

引用自:https://dba.stackexchange.com/questions/77881