公告介绍MongoDB 8.0,有史以来最快的MongoDB!阅读更多 >>介绍MongoDB 8.0,有史以来最快的MongoDB!>>
紧急警报

Atlas、Ops Manager和Cloud Manager的"滚动索引构建"功能可能导致索引不一致

问题描述和影响

在以下版本组合中,MongoDB Atlas、Cloud Manager和Ops Manager的"滚动索引构建"功能存在一个问题:

  • Atlas运行MongoDB版本4.2.19+、4.4.13+、5.0.6+(包括快速发布版本5.1-5.3)和6.0.0+。Atlas已经发布了修复,但集群可能在过去受到影响。
  • Cloud Manager运行MongoDB Agent版本从11.13.0.7438-1到12.4.0.7702-1,MongoDB版本4.2.19+、4.4.13+、5.0.6+和6.0.0+。
  • Ops Manager版本5.0.10-5.0.14和6.0.0-6.0.2运行MongoDB版本4.2.19+、4.4.13+、5.0.6+和6.0.0+。

在这些组合中,使用"滚动索引构建"功能创建的新索引在后续的复制回滚或服务器崩溃过程中可能存在索引键不一致的问题。

每个受影响的索引在collStats命令输出的indexDetails.<index name>.creationString字段中包含"log=(enabled=true)"。对于local数据库之外的集合,此设置与正常副本集操作不兼容。

因此,索引可能在不一致的情况下出现:

  • 一个次要副本集成员遇到复制回滚,且回滚的更改窗口中包括更新索引的写操作。
  • 一个主要副本集成员因其他原因崩溃,且journalCommitInterval(默认50ms)包括更新索引的写操作。

在这些情况下,MongoDB将文档回滚到正确的数据版本。但由于无效的索引配置,受影响的索引无法正确回滚。这可能导致以下形式的索引不一致:

  • 额外的索引条目,导致针对覆盖查询的错误查询结果。
  • 过时的或缺失的索引条目,这会导致使用索引的查询结果不完整。

注意:在许多情况下,由于写入关注多数而失败的操作在重试后会立即纠正由此问题导致的索引不一致。

不正确的查询结果可能导致应用程序引入逻辑数据不一致。请参阅下面的“解决方案”和“补救措施”部分。

注意:唯一索引(包括 _id 索引)不会受到影响,因为唯一索引不是使用“滚动索引构建”过程创建的。

解决方案

针对此问题的解决方案涉及避免或纠正使用“滚动索引构建”功能构建的索引上的无效表日志设置。有关修复在复制回滚或崩溃期间引入的索引不一致的信息,请参阅下面的“补救措施”部分。

针对 Atlas 用户

2023年8月22日,在 Atlas 上部署了一个修复程序,使得“滚动索引构建”对所有 MongoDB 版本都安全。然而,一些集群在过去可能受到影响。MongoDB 正在进行验证,并在需要采取行动时直接通知您。

但是,如果您以前在 Atlas 上执行了“滚动索引构建”并且希望立即采取行动,请打开一个支持案例开始聊天,请求协助确保集群不受此问题的影响。

针对云和 Ops Manager 用户

如上所述的版本组合中,Cloud Manager 和 Ops Manager 的“滚动索引构建”目前受到影响。唯一索引(包括 _id 索引)以及使用在副本集中构建滚动索引的手动过程创建的索引不受影响。

MongoDB Agent 版本 11.0.20.7105-1+(用于 Ops Manager 5.0)、12.0.11.7605-1+(用于 Ops Manager 6.0)和 12.4.0.7703-1+(用于 Cloud Manager)可纠正此问题。在您的集群由运行修复版本的 MongoDB Agent 管理之前,请避免使用“滚动索引构建”功能。

如果索引构建至关重要,并且您无法升级 MongoDB Agent 版本,请参阅下面的“解决方案”部分以获取更多信息。如果您有任何疑问,请打开一个支持案例

补救措施

可以通过执行逻辑初始同步来修复节点上的索引不一致。上述解决方案可以防止引入新的不一致,但不能纠正现有不一致。

针对 Atlas 用户

如果您的集群托管在 MongoDB Atlas 上,我们正在进行验证,如果您需要采取行动,我们会联系您。目前无需采取任何行动。

针对云和 Ops Manager 用户

在查看validate 命令文档中重要注意事项后,请在您的副本集每个节点的每个集合上运行 validate 命令。如果 validate 报告任何失败,理想的解决方案是从另一个节点重新同步受影响的节点。

如果可能,考虑受不一致影响的所有索引,并评估应用程序是否可能因查询结果不正确而引入逻辑数据不一致。识别和应对这种可能性需要特定于应用程序的知识,并且可能需要参考备份。

如果您不确定哪些索引受到不一致的影响,您可以通过以下方式防止进一步的损害:

  • 从另一个节点重新同步受影响的节点,或者
  • 按照文档中记录的流程以滚动方式重建索引,适用于副本集滚动索引构建
  • (MongoDB 4.4+) 使用非阻塞的优化构建过程重建索引。这可能不适合无法容忍由于索引构建导致性能下降的工作负载。

文档

© . All rights reserved.