我有一个包含 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。节点将自动进行初始同步。其他更快的方法(如果可以的话)是复制现有节点(可以是主节点或辅助节点)的 dbpath 的快照并启动 mongod。
这里的问题是唯一索引处已经有条目,系统尝试应用 opLog 行并因该错误而崩溃。
正如我能够从您的日志文件中看到的那样,您收到了类似
***aborting after fassert() failure
. 作为年轻的 DBA,请访问此处的博客或此处、此处和此处的MongoDB Jira 。如果没有更多信息,则很难确定问题的确切来源。正如@alernerdev在这里描述的那样, 我希望你有数据备份?关闭有故障的辅助设备,删除其中一个上的数据,然后将其备份(仅一个)——这将启动初始重新同步过程。如果一切顺利,此时您将拥有 1 个主要的和 1 个次要的。在执行此操作之前,请验证您的 oplog 窗口的大小是否足够大以完成初始同步过程。一旦这一切恢复正常,对您的第二个次级执行相同的操作。
在这里和这里供您进一步参考