Replication

MongoDB 副本集成員由於“索引中已存在 84 個鍵/值”而無法啟動

  • April 7, 2018

我有一個包含 3 個成員(1 個主節點和 2 個輔助節點)的副本集,其中一個輔助節點工作正常並引發以下錯誤

> 2018-03-12T11:03:54.868-0400 E REPL [repl writer worker 13] writer
> worker caught exception: :: caused by :: 84 key/value already in index
> on: { ts: Timestamp 1520867034000|8, h: 287037468373256260, v: 2, op:
> "u", ns: "Sitecore_analytics_PROD.Interactions", o2:
> 
> { _id: BinData(3, EFC3DD1A15B75442986344FDE9CC71EB) } , o: { $set:
> 
> { ContactVisitIndex: 2 } } } 2018-03-12T11:03:54.868-0400 I - [repl
> writer worker 13] Fatal Assertion 16360 2018-03-12T11:03:54.868-0400 I
> - [repl writer worker 13] 
> ***aborting after fassert() failure

之後 MongoDB 無法啟動,並繼續拋出相同的錯誤!

如何確定它的根本原因?有沒有辦法預防?如何解決?

對有問題的輔助節點進行初始同步。只需從 dbpath 中刪除文件並啟動 mongod。Node 會自動進行初始同步。其他更快的方法(如果可以的話)是複制現有節點(可以是主節點或輔助節點)的 dbpath 快照並啟動 mongod。

這裡的問題是唯一索引處已經有條目,系統嘗試應用 opLog 行並崩潰到該錯誤。

正如我從您的日誌文件中看到的那樣,您收到了類似的錯誤***aborting after fassert() failure。作為年輕的 DBA 部落格或 MongoDB Jira這裡這里這裡。如果沒有更多資訊,很難確定問題的確切來源。

正如@alernerdev在這裡描述的那樣, 我希望你有數據備份?關閉有故障的輔助設備,刪除其中一個上的數據,然後將其恢復(只有一個)——這將啟動初始的重新同步過程。如果一切順利,此時您將擁有 1 個小學和 1 個中學。在執行此操作之前,請驗證您的 oplog 視窗的大小是否足以完成初始同步過程。一旦這一切恢復正常,對您的第二個輔助節點執行相同的操作。

供您進一步參考這里這裡

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