公告介绍MongoDB 8.0,史上最快的MongoDB!阅读更多 >>介绍MongoDB 8.0,史上最快的MongoDB!>>
MONGODB 系统警报

分片多文档事务可能会使用不一致的分片元数据执行操作

我们发现了一些可能导致分片多文档事务返回不正确数据并可能遗漏写入的问题。这些问题可能在以下任一情况下出现:

  • 可查询加密
  • 分片多文档事务

同时执行以下任一操作时:

  • moveChunkmoveRangemovePrimaryrenameCollectiondropreshardCollection
    • moveChunk / moveRange 命令由分片集群平衡器自动调用。
    • movePrimary 命令可能在删除分片时由 Atlas 或 Ops Manager 自动化调用。

MongoDB 4.4.29,5.0.25,6.0.14,7.0.8 和 Rapid Release 7.3.1 包含这些问题的修复。

问题描述和影响

如果所引用的数据受到同时执行并修改分片元数据的命令的影响,则分片多文档事务可能会错过读取和写入。由于可查询加密隐式地利用多文档事务,因此此功能在分片环境中容易受到影响。

以下条件是这些问题的必要前提(所有条件都必须满足):

  • 具有 2 个或更多分片的分片集群;
  • 使用以下任一:
  • 使用修改分片元数据的操作(请参阅下表中的特定命令);以及
  • 与上述命令同时执行的特定操作顺序。

因此,这些问题会导致以下情况:

  • 多文档事务内的读取操作将成功完成,但如果被查询的文档在其分片元数据在事务过程中被修改,则可能会返回不完整的结果。
  • 多文档事务内的写入操作将成功完成,但如果这些写入发生在在其分片元数据在事务过程中被修改的文档上,则可能不会更新所有应该更新的文档。

问题

请参阅下文以获取有关可以修改分片元数据的特定命令的更多信息

问题受影响版本命令
读取关注点
需要在多个集合上执行事务
问题
SERVER-77506
SERVER-84723SERVER-87061
SERVER-82353
受影响版本
  • 4.4.0 - 4.4.27
  • 5.0.0 - 5.0.23
  • 6.0.0 - 6.0.12
  • 7.0.0 - 7.0.2
  • 7.1.0 - 7.1.1
  • 7.0.0 - 7.0.6
  • 7.1.0 - 7.2.1
  • 4.4.0 - 4.4.28
  • 5.0.0 - 5.0.24
  • 6.0.0 - 6.0.13
  • 7.0.0 - 7.0.5
  • 7.1.0 - 7.2.0
命令

移动数据块,
移动范围

注意:除非已禁用平衡器,否则将自动发布。

删除,
重命名集合,重新分配集合
移动主节点
读取关注点
  • 本地
  • 多数
  • 本地
  • 多数
  • 快照
  • 本地
  • 多数
  • 快照
需要在多个集合上执行事务

MongoDB 4.4.29,5.0.25,6.0.14,7.0.8 和 Rapid Release 7.3.1 包含这些问题的修复。

缓解措施

如果您的作业在满足上述条件的分片集群上使用多文档事务,我们建议您升级到 MongoDB 版本 4.4.29、5.0.25、6.0.14、7.0.8 或快速发布 7.3.1(或更高版本)。

如果您使用 MongoDB Atlas,您的集群已升级。

如果您无法立即升级

  1. 避免在多文档事务与修改分片元数据的同时发布命令。具体来说,请避免使用以下命令

    • 删除
    • 重命名集合
    • 重新分配集合
    • 移动主节点
    • 移动数据块/移动范围

  2. 通过使用 sh.stopBalancer() 命令禁用分片集群平衡器。

  3. 尽快升级到 MongoDB 版本 4.4.29、5.0.25、6.0.14、7.0.8 或快速发布 7.3.1(或更高版本)。

  4. 使用 sh.startBalancer() 重新启用平衡器。

  5. 请参阅下面的修复部分。

详细影响 & 诊断/修复

以下部分提供了特定功能使用的指南。所有涉及的命令都在配置数据库的 更改日志集合 中记录条目。可以通过检查更改日志集合来确定这些命令可能发布的时间。此集合默认限制为 200MB;用户可以查阅备份以获取更多历史记录。请查阅与您的环境相关的部分,并在需要时检查更改日志集合。

可查询加密

可查询加密 可受 SERVER-84723SERVER-87061SERVER-82353 的影响。

如果以下所有条件都满足,则使用 可查询加密 的环境可能会受到影响

  • 一个分片集群
    • 包含 2 个或更多分片,并且
    • 运行 MongoDB 7.0.0 到 7.0.5;
  • 一个环境
    • 字段使用 可查询加密 加密,并且
    • 执行了一个修改这些集合之一或其旁路集合的分片元数据的操作。
      • 具体来说
        • drop(),
        • renameCollection(),
        • reshardCollection() 或
        • movePrimary()
      • 可以通过检查配置数据库中的 更改日志集合 来确定这些命令可能发布的时间。此集合默认限制为 200MB;用户可以查阅备份以获取更多历史记录。

如果您是 可查询加密 的用户并且符合上述标准,请联系 MongoDB 支持 以获取进一步的帮助。

分片多文档事务使用

显式利用分片多文档事务的客户可能会受到以下任何一项的影响:SERVER-77506SERVER-84723SERVER-87061SERVER-82353

如果一个环境的工作负载显式利用了多文档事务,那么只有当以下所有条件都满足时才可能会受到影响:

  • 一个分片集群
    • 包含 2 个或更多分片,并且
    • 运行版本
      • 4.4.0 - 4.4.28,
      • 5.0.0 - 5.0.24,
      • 6.0.0 - 6.0.13,或
      • 7.0.0 - 7.0.6
  • 使用多文档事务的工作负载,其中
    • 事务(使用本地(默认为读取)或大多数读取关注点)与 moveChunk()moveRange() 命令并发访问分片集合(这包括平衡活动)。
      • 使用快照读取关注点的事务不受影响。
      • 有关更多信息,请参阅 SERVER-77506
    • 使用任何读取关注点的事务与并发访问分片或非分片集合的 drop()renameCollection()reshardCollection()
    • 使用任何读取关注点的事务与并发访问非分片集合的 movePrimary() 命令。

如果您的环境和工作负载符合这些标准,我们建议您

  1. 审查您的应用程序,重点关注事务中遗漏的读取或写入如何影响您的应用程序。请参阅附录中链接的特定票据,以更好地了解这些问题如何体现。

  2. 确定上述任何元数据修改操作是在这些多文档事务引用的集合上发出的时间。请参阅以下附录以获取关于上述问题如何体现的更多详细信息。

    • 配置数据库中的 更改日志集合 可以检查以确定上述命令在过去可能何时发出。此集合默认为 200mb;用户可以咨询备份以获取更多信息。
  3. 咨询您的应用程序日志以评估哪些文档可能受到影响。

  4. 审查这些文档的内容以评估它们是否从您应用程序的角度看是逻辑上一致的。您还可能希望考虑如果读取或写入可能没有正确应用,其他集合/文档可能受到的影响。

附录

有关本节总结的问题的更多信息,请参阅以下单独的票据

© . All rights reserved.