对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。

mongosync 迁移限制

警告

Mongosync 不支持 MongoDB 9.0。如果您使用 Mongosync,请勿升级到 MongoDB 9.0。

mongosync 不会检查是否合规以下限制。在这些限制之外运行 mongosync 可能会导致目标集群出现未定义的行为。

在迁移的整个过程中,您必须遵守这些限制,包括在迁移暂停或停止期间(如果您计划恢复迁移)。

有关支持的 MongoDB Server 版本,请参阅 MongoDB Server 版本兼容性。

MongoDB不会使用社区版本测试 Mongosync,并且在大多数情况下, MongoDB不支持使用社区部署的 Mongosync。如果您想将 Mongosync 与MongoDB Community Edition一起使用,联系MongoDB销售代表,讨论要求和个性化选项。

从 mongosync 1.10 开始,mongosync 支持从运行早于 6.0 的 MongoDB 服务器版本的源集群进行迁移。有关支持的迁移路径的信息,请参阅 MongoDB Server 版本兼容性。

以下限制应用于 6.0 迁移:

  • 源集群不能有孤立文档。要清理任何孤立文档,请在其源集群的每个分片主节点 (primary node in the replica set)节点上的 mongod 实例上运行cleanupOrphaned 命令。等待此命令完成并显示状态 {ok:1},然后再开始迁移。

  • 迁移期间,源集群上不能执行会产生 DDL 事件的写入操作。以下事件不会发生:

    • collMod

    • create

    • createIndexes

    • drop

    • dropDatabase

    • dropIndexes

    • refineCollectionShardKey

    • rename

    • reshardCollection

    • shardCollection

    这包括可能创建新集合的操作,例如mapReduce 、$out 和$merge 。这还包括从插入中隐式创建的集合。 在迁移期间,只能进行会产生增删改查事件的写入操作。

    注意

    允许在命名空间过滤之外的源集合上生成 DDL 事件的写入操作。

  • geoHaystack 不支持索引。

  • 不支持 /reverse 端点。您无法在reversible /start请求中启用 选项。

  • 确保在调用 /commit 终结点后不对源集群进行任何写入。

  • 您无法启用createSupportingIndexes 分片参数。相反,应在源集群上创建索引以支持分片键。

  • 如果一个或多个分片上存在规格不一致或缺失的索引,mongosync 将返回错误。要检查索引是否存在不一致,请参阅查找分片间不一致的索引。

  • mongosync 不支持在迁移过程中更改主版本或次版本的就地服务器版本升级或降级。mongosync 确实允许补丁版本升级。要了解更多信息,请参阅服务器升级说明。

  • mongosync 不验证集群或环境是否已正确配置。

  • 当 mongosync 运行时,其他客户端不得写入目标集群。

  • 不会复制 system.* 集合。

  • 不支持字段名以美元符号 ($) 为前缀的文档。请参阅带句点和美元符号的字段名。

  • 不支持无服务器集群。

  • 不支持 MongoDB 共享层级。

  • 不支持 Atlas Infinite 集群。

  • 不支持“可查询加密”。

  • 您无法同步已在相同字段定义唯一索引和非唯一索引的集合。

  • 在尝试使用 M10+ Atlas 集群运行mongosync 之前,请禁用 Require Indexes for All Queries 选项以在源集群和目标集群上将 notablescan 设立为 false。

  • mongosync 不会同步用户或角色。

  • mongosync 不会将同步期间在源集群上进行的applyOps操作复制到目标集群。

  • mongosync 必须使用primary读取偏好从源集群读取。

  • mongosync 不支持当前正在升级或降级 MongoDB 版本的源集群或目标集群。

  • mongosync 不支持同步Atlas Search 索引。

  • mongosync 仅支持使用WiredTiger存储引擎的集群。

  • 您无法将集合与任何具有空时间戳的文档同步,例如 6.0 之前的 Timestamp(0,0) 源集群。

  • mongosync 不支持具有重复字段名称的文档。 有关详细信息,请参阅MongoDB不支持重复的字段名称。

  • mongosync 不支持将命名空间迁移到已包含冲突命名空间的目标集群。

  • mongosync 不支持没有任何预配用户的目标集群。

  • 在 8.0.20 之前的所有 MongoDB 版本中,如果 replace 操作将命名为 $v 的字段添加到文档,mongosync 将在变更事件应用期间退出,并出现无法恢复的严重错误。恢复同步总是失败,并出现同样的错误。

    要解决此问题,请从头开始重新启动同步,删除目标位置上 mongosync 的元数据数据库,或将源集群升级到 8.0.20+。

  • 不支持时间序列集合。

  • 不支持设置了 expireAfterSeconds 的集群化集合。

1.22版本新增。

在 mongosync 开始迁移之前,它会检查目标集群上可用的磁盘空间。mongosync 估算您选择迁移的源集合和索引的磁盘大小,然后将该估算值与目标文件系统上的可用空间进行比较。mongosync 将 1.25 倍的安全系数应用于估算,以考虑存储引擎压缩差异、索引构建使用的临时空间以及迁移过程中 oplog 的增长。

如果估计所需空间超过可用空间,/start 将返回 InsufficientDestinationDiskSpace 错误,并且 mongosync 不会开始迁移。要解决此错误,请在目标集群上释放磁盘空间,并再次调用 /start。

mongosync 跳过对无法检索文件系统统计信息的目标位置的检查。

重要

这项检查是一项尽力而为的安全防线。它不保证迁移能够容纳在目标集群上。迁移过程中发生的变化以及 mongosync 在目标分片之间分配磁盘空间的方式差异都会影响估算结果。

若要禁用检查,请在 /start 请求中将 skipDiskSpaceCheck 设置为 true。当目标文件系统统计信息未准确反映可用于迁移的存储空间时,使用此选项。要了解更多,请参阅 请求正文参数。

  • mongosync 不支持从分片集群同步到副本集。

  • mongosync 不支持同步到具有一个或多个仲裁节点的分分片集群拓扑结构。

  • 从副本集同步到分片集群这一操作具有以下限制:

    • mongosync 允许用户重命名同步期间sharding.shardingEntries选项包含的集合,但有一些限制。 有关详细信息,请参阅在同步期间重命名。

    • 如果使用sharding.createSupportingIndexes选项,则在同步期间会在目标集群上自动创建索引。 此后无法在源集群上创建这些索引。

    • 如果要手动创建索引以支持分分片键,则必须在mongosync启动之前或迁移完成且mongosync停止之后创建索引。

  • 在集合中,_id 字段必须在集群的所有分片中都是唯一的。请参阅分片集群和唯一索引了解详情。

  • 同步时,不能使用 movePrimary 命令重新分配主节点分片。

  • 没有用于区域配置的复制。mongosync 复制数据,但不继承区域。

  • 同步时无法添加或删除分片。

  • mongosync 只同步存在于所有分片上的索引。

  • 如果 mongosync 检测到分片之间的索引规范不一致,则会出现致命错误并退出。检查不一致时,mongosync 会忽略 ns 和 background索引字段。

    注意

    要检查索引是否存在不一致,请参阅查找分片间不一致的索引。此方法显示 ns 和 background字段差异,mongosync 在检查不一致时会忽略这些差异。

  • 如果源集群或目标集群是分片集群,并且您未运行带命名空间筛选的mongosync ,则必须通过运行balancerStop 命令并等待15 分钟让命令完成来禁用源集群的负载均衡器。

    如果源集群或目标集群是分片集群,并且您正在运行带有命名空间筛选的 mongosync,则可以全局启用源集群的负载均衡器,但必须为命名空间过滤内的所有集合禁用它。请参阅在 Filtered Sync 中禁用集合的负载均衡器。您还可以完全禁用源集群的负载均衡器。

    您必须始终使用balancerStop 分片的目标集群上的负载负载均衡器。

  • 如果您已启用源集群的负载均衡器,但对命名空间过滤内的集合禁用了它,请勿对命名空间过滤内的集合运行shardCollection。如果在迁移期间对命名空间过滤内的集合运行shardCollection,则 mongosync 会返回错误并停止,这需要您从头开始迁移。

  • mongosync 不支持在执行期间运行命令transitionFromDedicatedConfigServer。

  • 不得在源集群或目标集群上运行moveChunk和moveRange命令。

  • 同步时无法完善分片键。

  • 同步期间不支持源集群的reshardCollection操作。

  • 每个分片集合的最大索引数为 63 个,比默认限制(64 个)少一个。

  • mongosync 不支持在分片的集群上使用非默认排序规则的集合。这适用于分片的和非分片集合。

  • mongosync 在某些承载数据的分片上不一致或缺失的索引上会出现错误。

  • mongosync 如果在源集群或目标集群上配置了负载均衡窗口,则失败。

  • mongosync 不支持迁移到具有预配置的分片区域标签的目标命名空间。在开始迁移之前,从目标上 mongosync 将迁移到的任何命名空间中删除所有分片标签范围或区域。您可以在迁移达到 COMMITTED 状态后重新添加所需的区域范围。

  • 如果您未调用 /commit 终结点以完成反向同步,初始源集群将保持无法使用的中间状态。

  • 如果旧源具有唯一的索引,而且这些索引部分分布在不同的分片上,反转可能会导致失败。在反转之前,请确保所有分片上都存在唯一的索引。

  • 源集群和目标集群必须具有相同数量的分片。当集群具有不同的拓扑结构时,您无法进行反向同步。

  • 源集群和目标集群必须运行相同的MongoDB主要版本。

  • 要反转方向,mongosync 要求源集群上的所有 唯一索引(_id 除外)都没有旧版唯一索引键。
  • mongosync 不支持将多个源集群同步到一个目标集群。

  • 一个集群不能同时是一个 mongosync 实例中的源集群和另一个 mongosync 实例中的目标集群。

  • 可逆同步不支持筛选功能。

  • 除非您在调用 /start 时将 preExistingDestinationData 参数设立为 true,否则目标集群在启动前不得包含用户数据。

  • 目标集群在启动前不能包含 __mdb_internal_mongosync 系统数据库。

  • 不能修改正在使用的筛选器。如需创建新的筛选器,请参阅:“替换现有筛选器”。

  • 您只能在某些情况下重命名集合。有关更多详情,请参阅:添加和重命名集合。

  • 如果过滤器包含视图但不包含基本集合,则只有视图元数据会同步到目标集群。要包含视图文档,您还必须同步基本集合。

  • 不能在筛选器中指定系统集合或系统数据库。

  • 如需使用带有过滤功能的 $out 聚合阶段或 mapReduce 命令(当设置为创建或替换集合时),必须将过滤器配置为使用整个数据库。不能将过滤器限制在数据库内的集合上。

    有关更多信息,请参阅使用 mapReduce 和 $out 进行筛选。

从 1.3.0 开始,Mongosync 支持固定大小集合,但有一些限制。

从 1.20.0 开始,启动 mongosync 时必须传递 --enableCappedCollectionHandling 标志,启用在迁移期间创建新的固定大小集合。

同步期间,源集群上的固定大小集合可正常工作。

同步期间,目标集群上的固定大小集合会出现临时更改:

  • 文档数量没有上限。

  • 最大集合大小为 1PB。

mongosync 在提交期间恢复最大文档数量和最大文档大小的原始值。

Mongosync 不会将系统集合复制到目标集群。

如果您对源集群发出 dropDatabase 命令,此更改不会直接应用于目标集群。相反,Mongosync 会删除目标集群上数据库中的用户集合和视图,但不会删除该数据库上的系统集合。

例如,在目标集群上:

  • 删除操作不会影响用户创建的 system.js 集合。

  • 如果您启用分析,则 system.profile 集合将保留。

  • 如果您在源集群上创建视图,然后删除数据库,则复制该删除操作将删除视图,但会留下一个空的 system.views集合。

在这些情况下,复制 dropDatabase 时会删除数据库中所有用户创建的集合,但会将其系统集合留在目标集群上。

当 buildIndexes 设立为 "afterDataCopy" 时,mongosync 可能无法应用 Rename DDL 事件。如果发生这种情况,请将 buildIndexes设立为 "beforeDataCopy" 或 "never",从头开始重新启动迁移。将 buildIndexes 设置为 beforeDataCopy 会增加迁移时间,而将 buildIndexes 设置为 never 则要求您在迁移完成后手动构建索引。

mongosync 不支持迁移期间的滚动索引构建。为避免在迁移期间以滚动方式构建索引,请使用以下方法之一确保目标索引与源索引匹配:

从 1.9 开始,mongosync 可以使用嵌入式验证器来确认集合从源集群成功同步到目标集群。

内置验证器在 Mongosync 1.8 及以前版本中不可用。

有关其他验证方法,请参阅验证数据传输。

嵌入式验证程序具有以下限制:

  • mongosync 将验证者状态存储在内存中,这可能会导致大量内存开销。 要运行验证程序,mongosync 大约需要 10 GB内存,此外,每 1 万份文档需要额外 500 MB 内存。

  • 验证程序无法恢复。 如果用户停止或暂停同步,然后因任何原因再次启动 mongosync,验证进程将从头开始。 这可能会导致验证大大落后于迁移。

  • 从副本集迁移到分片集群时,您无法重命名在分片选项中指定的源集合。如果您在 CEA 阶段重命名分片选项中包含的集合,则验证程序会报告分片不匹配。

  • 如果在启用验证并将 buildIndexes设立为 never 的情况下开始同步,则当 mongosync 在源集群上找到TTL集合时,迁移将失败。 这种情况可能发生在您调用 /start 端点之后或更晚的时间,例如,用户在迁移过程中在源集群上创建了TTL索引。

    要同步TTL集合而不在目标集群上构建索引,您必须在禁用验证器的情况下开始同步。

验证程序不会检查以下命名空间:

  • 固定大小集合

  • 具有TTL索引的集合,包括在迁移过程中添加或删除的TTL索引

  • 不使用默认的集合

要验证不支持的集合,请添加其他脚本代码来检查集合。有关详细信息,请参阅验证数据传输。

注意

从版本1.10 开始,验证程序会检查 之前版本上发生的 DDL事件是否存在数据不一致。6.0迁移期间的源集群。 这是因为 6.0 迁移不支持DDL 事件。

要学习;了解更多信息,请参阅 6.0之前的迁移限制。

mongosync 不会迁移MongoDB 8.0 中引入的持久查询设置 (PQS)。如果源集群使用 PQS,则必须手动迁移。