為什麼 Mongo 卡在 STARTUP2 中?
我有一個
Mongo
帶有幾個輔助節點的副本集。一個承載輔助實例的盒子崩潰並失去了數據庫。我再次啟動了輔助
Mongo
實例,現在它在 STARTUP2 中停留了 12 多個小時。是否有意義 ?文件說Mongo
在進入 RECOVERING 狀態之前應該在 STARTUP2 中短暫停留STARTUP2 到底是什麼意思?它是從主數據庫複製數據庫嗎?如何驗證它(假設 Mongo 在 Linux 中執行)?
eoinbrazil 的答案部分不正確。一個新的節點可以在 STARTUP2 中很長時間。發布的連結說:
mongod 完成載入該成員的配置後,副本集的每個成員都會進入 STARTUP2 狀態,此時它成為副本集的活動成員。然後成員決定是否進行初始同步。如果成員開始初始同步,則該成員將保留在 STARTUP2 中,直到複製所有數據並建構所有索引。之後,該成員轉換為 RECOVERING。
我正在管理一個 700 GB 的集合,當我添加一個新節點時,STARTUP2 狀態保持超過 24 小時。但是您仍然可以通過觀察數據庫是否增長來查看是否發生了某些事情。您可以使用以下命令查看新節點上的數據庫大小
show databases
或者你也可以觀察數據目錄,看看它是否還在增長。(在 Linux 上使用命令 ls、df、du、iotop 等……)
STARTUP2 狀態表示“成員已加入集合併正在執行初始同步。有資格投票。” 一旦 MongoD 程序完成載入其配置,RS 的成員就會進入此狀態。在這種狀態下,成員已創建執行緒來處理內部複製操作,但它尚未將狀態更改為 Recovering 並從該狀態繼續更改為 Secondary(請參閱 $$ state and their details in the docs $$) .
如果您的節點處於這種狀態的時間超過了很短的時間,那麼您將遇到一些奇怪的行為。如果沒有日誌來確定卡住的原因,這幾乎是不可能分析的。執行 rs.status() 和 db.printSlaveReplicationInfo() 將為您提供有關節點上本地圖片的一些詳細資訊。
解決此問題的正常方法是關閉節點,擦除其數據文件(dbpath 中的那些文件),然後重新啟動它。這將重新啟動初始同步過程,它應該移動到 SECONDARY。如果它再次卡在 STARTUP2 中,您需要查看日誌以收集有關原因的更多資訊 - 原因有很多,但可能發生的原因是網路不穩定或某些本地資源爭用。
需要注意的一點是,在進行初始同步時,節點將保持在 STARTUP2 中,因此根據同步的數據量,這可能需要相當長的時間(可能是幾天)。