在以下版本组合中,MongoDB Atlas、Cloud Manager和Ops Manager的"滚动索引构建"功能存在一个问题:
在这些组合中,使用"滚动索引构建"功能创建的新索引在后续的复制回滚或服务器崩溃过程中可能存在索引键不一致的问题。
每个受影响的索引在collStats命令输出的indexDetails.<index name>
.creationString字段中包含"log=(enabled=true)"
。对于local
数据库之外的集合,此设置与正常副本集操作不兼容。
因此,索引可能在不一致的情况下出现:
在这些情况下,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 报告任何失败,理想的解决方案是从另一个节点重新同步受影响的节点。
如果可能,考虑受不一致影响的所有索引,并评估应用程序是否可能因查询结果不正确而引入逻辑数据不一致。识别和应对这种可能性需要特定于应用程序的知识,并且可能需要参考备份。
如果您不确定哪些索引受到不一致的影响,您可以通过以下方式防止进一步的损害: