MongoDB oplog 包含许多 Noop

Mak*_*yuk 4 performance mongodb

我正在尝试改进 MongoDB 服务器的 oplog,因为目前它覆盖的时间比我想要的要少(我暂时不打算增加 oplog 文件大小)。我发现oplog集合中有很多noops记录 - {“op”:“n”}+“o”上的整个文档。它们可能占用大约 20%-30% 的物理 oplog 大小。

我怎样才能找到原因,因为它似乎不好?

我们使用 MongoDB 3.6 + NodeJS 10 + Mongoose

ps 它出现在许多不同的集合和用例中,因此很难理解所有这些项目背后的应用程序逻辑是什么。

Ste*_*nie 5

MongoDB 3.4+ 副本集中预计会进行无操作写入,以支持Max Staleness 规范,该规范可帮助应用程序避免从过时的辅助副本中读取数据,并提供更准确的复制延迟度量。这些无操作写入仅在主节点空闲时发生。空闲写入间隔当前不可配置(如 MongoDB 4.2 所示)。

Max Staleness 规范包括一个示例场景和更详细的理由,说明为什么主节点必须编写定期无操作以及其他设计决策。

设计原理的相关摘录:

空闲主节点必须每 10 秒执行一次无操作 (idleWritePeriodMS),以保持辅助节点的 LastWriteDate 值接近主节点的时钟。no-op 还使 opTimes 接近主数据库的操作时间,这有助于 mongos 选择一个最新的辅助数据库来在 CSRS 中读取。

当虚假延迟峰值得到解决时,像 MongoDB Cloud Manager 这样绘制复制延迟图表的监控软件也会受益。

  • @MaksimKondratyuk 很抱歉在假期期间错过了最后一条评论。我的猜测是,这是使用 findAndModify 和可重试写入的结果(类似于 https://jira.mongodb.org/browse/PHPC-1523)。对于可重试写入,“findAndModify”需要在 oplog 中写入成功更新的先前状态,以便幂等地应用该更改。 (2认同)