Docs 菜单
Docs 主页
/ /

mongosync 行为

mongosync 二进制文件是 Mongosync 中使用的主节点 (primary node in the replica set)进程。mongosync 将数据从一个集群迁移到另一个集群。

有关mongosync进程的概述,请参阅关于mongosync

要开始使用 mongosync,请参阅快速入门指南

有关更多详细信息,请参阅最适合您情况的安装连接mongosync页面。

从 1.9 开始,mongosync 包含一个嵌入式验证器,用于对目标集群上的所有支持的集合执行一系列验证检查,以确认它已成功将文档从源集群传输到目标。

当您启动 mongosync进程时,它会提供以下免责声明:

Embedded verification is enabled by default. Verification checks for data
consistency between the source and destination clusters. Verification will
cause mongosync to fail if any inconsistencies are detected, but it does not
check for all possible data inconsistencies. Please see the documentation at
https://www.mongodb.com/zh-cn/docs/cluster-to-cluster-sync/current/reference/verification/embedded
for more details. Verification requires approximately 0.5 GB of memory per 1
million documents on the source cluster and will fail if insufficient memory
is available. Accepting this disclaimer indicates that you understand the
limitations and memory requirements for this tool. To skip this disclaimer
prompt, use –-acceptDisclaimer.
To disable the embedded verifier, specify 'verification: false' when starting
mongosync. Please see https://www.mongodb.com/zh-cn/docs/cluster-to-cluster-sync/current/reference/verification/
for alternative verification methods.
Do you want to continue? (y/n):

如果您已阅读并接受免责声明,则可以使用 选项启动mongosync --acceptDisclaimer,以跳过此通知。

mongosync 在源集群和目标集群之间同步集合数据。mongosync 不同步用户角色。因此,你可以在每个集群上创建具有不同访问权限的用户。

可以在 YAML 配置文件中设立mongosync的选项。 使用--config选项。 示例:

$ mongosync --config /etc/mongosync.conf

有关可用设置的信息,请参阅配置

Mongosync 支持分片的集群之间的复制。mongosync 将单个分片从源集群并行复制到目标集群。但是,mongosync 不会保留源集群的分片配置。

重要

当源集群或目标集群是分片集群时,您必须停止这两个集群上的负载均衡器,并且在迁移期间不得运行moveChunkmoveRange 命令。要停止负载均衡器,运行balancerStop 命令并等待命令完成。

mongosync 同步到分分片的目标集群时,它会为目标集群上的分分片的集合预分割数据段。对于每个分分片的集合,mongosync 创建的数据段数量是目标集群中分片数量的两倍。

重要

即使源集群是均衡的,mongosync 也无法确保目标集群的均衡。由于 mongosync 不支持在迁移期间执行分片操作,因此您必须等到可以安全接受写入操作才能重新平衡目标集群。有关如何重新平衡集群的指导,请参阅分片集群负载均衡器,有关 mongosync中分片分片集群分片集群限制。

mongosync 不保留从源到目标的数据块分布,即使有多个 mongosync 实例也是如此。 无法在目标集群上重现来自源集群的数据段的特定预分割。

mongosync 从源集群到目标集群保留的唯一分片配置是分片键。 迁移完成后,您可以启用目标集群的负载均衡器,该负载均衡器的文档分发独立于源集群的分布。

当您同步到分分片的目标集群时,mongosync 会通过循环方式向每个数据库分配一个主分片分片。

警告

movePrimary迁移期间在源集群或目标集群上运行 可能会导致致命错误,或者需要您从头开始重新启动迁移。有关更多信息,请参阅分片集群。

从 8.0 开始,MongoDB引入对配置分片集群(也称为嵌入式配置服务器集群)的支持。

mongosync 支持从专用配置服务器分片的片集群到嵌入式配置服务器分片的片集群的同步,反之亦然。此外,mongosync 支持从副本集到配置分片的集群的同步,但反之则不然。

要学习;了解有关嵌入式配置服务器的更多信息,请参阅配置分片。

要将源集群同步到多个目标集群,请为每个目标集群使用一个 mongosync 实例。有关更多信息,请参阅多集群限制

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

  • 不支持 convertToCapped。如果运行 convertToCapped,则 mongosync 会退出并显示错误。

  • cloneCollectionAsCapped 不受支持。

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

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

  • 文档数量没有上限。

  • 最大集合大小为 1PB。

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

默认下,mongosync 在目标集群上启用仅限目标的写入阻塞。 mongosync /progress 端点报告canWritetrue 之前解除对写入的阻止。您可以使用 /start 端点将enableUserWriteBlocking 设立为"destinationOnly" ,以显式启用仅目标写入阻塞。

您可以启用双重写入阻塞。 如果启用双重写入阻塞,则 mongosync 会阻止写入:

  • 在迁移期间的目标集群上。 mongosync 在将 canWrite 设置为 true 之前解除对写入的阻止

  • 在源集群 /commit

要启用双重写入阻塞,请使用 /start enableUserWriteBlocking将 设立为true

您可以使用 /startenableUserWriteBlocking 将 设立为false

同步开始后,您无法启用双重写入阻塞或禁用写入阻塞。

如果要稍后使用反向同步,则必须在启动mongosync 时启用双重写入阻塞。

要设置 enableUserWriteBlockingmongosync 用户必须有包含 setUserWriteBlockModebypassWriteBlockingMode ActionTypes 的角色。

注意

使用 enableUserWriteBlocking 时,仅对不具有 bypassWriteBlockingMode ActionType 的用户应用阻塞写入。具有此 ActionType 的用户可以执行写入。

始终允许对源集群执行读取操作。

/progress 端点报告 canWritetrue 时,源集群和目标集群上的数据是一致的。

如需查看 mongosync 所处的状态,请调用 /progress API 端点。/progress 输出包括一个布尔值 canWrite

  • canWritetrue 时,可安全地写入目标集群。

  • canWritefalse 时,不向目标集群写入。

mongosync 在同步时,您可以安全地写入源集群。除非 canWritetrue,否则不要写入目标集群。

默认情况下,mongosync 将源集群上读取的读关注级别设置为 "majority"。对于目标集群上的写入,mongosync 将写关注级别设置为 "majority",并指定 j: true

有关读关注和写关注配置和行为的更多信息,请参阅读关注写关注。

mongosync 连接到源集群和目标集群时需要 primary 读取偏好。有关更多信息,请参阅读取偏好选项。

mongosync 将传统索引值(如 0 或空字符串)重写为目标上的 1mongosync 还会删除目标上的任何无效索引选项。

mongosync 复制与副本集内数据的复制不同。mongosync 在同步期间对从源到目标集群的写入进行组合和重新排序,还临时修改了各种集合特征。

因此,在同步仍在执行时(包括同步暂停时),不能保证目标在任何点都与源集群匹配。为确保目标集群和源集群在切换前匹配,请调用提交端点。

除非您使用反向功能,否则源集群和目标集群之间的关系在提交时终止。有关中间同步约束的信息,请参阅限制条件的限制。

重要

您在 mongosync 上调用 commit 并且 canWrite 成功返回 true 之前,目标集群不能用于接受应用程序的读取或写入流量。请勿使用 mongosync 来维护灾难恢复集群。

mongosync 在同步期间临时更改以下集合特征。 原始值会在提交进程中恢复。

更改
说明

Unique Indexes

源集群上的唯一索引将作为目标集群上的非唯一索引进行同步。

TTL Indexes

同步将 expireAfterSeconds 设置为目标集群上的 MAX_INT 的值。

Hidden Indexes

同步会将隐藏索引复制为非隐藏索引。

写入阻塞

如果启用双重写入阻塞,则 mongosync 会阻止写入:

  • 在同步期间的目标集群上。

  • 在收到 commit 时的源集群上。

mongosync 默认启用仅默认写入阻塞。

要学习;了解更多信息,请参阅写入阻塞。

固定大小集合

同步会将固定大小集合设置为允许的最大大小。

虚拟索引

在某些情况下,同步可能会在目标上创建虚拟索引,以支持对分分片的或排序规则集合的写入。

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

mongosync 在迁移期间将其元数据存储在一个或多个数据库中。元数据数据库可以命名为以下任何名称:

  • mongosync_reserved_for_internal_use

  • 任何以 mongosync_internal_

  • 任何以 mongosync_reserved_for_verification_

成功迁移后,应删除所有元数据数据库。

mongosync 支持目标集群的最终一致性。在提交之前,无法保证目标集群上的读取一致性。在提交之前,源集群和目标集群可能在给定时间点不同。要学习;了解更多信息,请参阅中间同步注意事项。

mongosync进行同步时, mongosync可能会在将写入从源中继到目标时对写入进行重新排序或组合。 对于给定文档,源和目标之间的写入总数可能不同。

事务可能不会自动出现在目标集群上。 可重试写入可能无法在目标集群上重试。

如果在源数据库上启用了分析, MongoDB会创建一个名为 <db>.system.profile 的特殊集合。同步完成后,Mongosync 不会从目标中删除 <db>.system.profile集合,即使稍后删除源数据库也是如此。<db>.system.profile集合不会改变目标上用户数据的准确性。

如果将带视图的数据库拖放到源上,则目标可能会在该数据库中显示空system.views集合。空system.views集合不会改变目标上用户数据的准确性。

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

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

例如,在目标集群上:

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

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

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

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

mongosync 在目标集群上创建带有新 UUID 的集合。源集群和目标集群上的 UUID 之间没有关系。如果应用程序包含硬编码的 UUID(MongoDB 不建议这样做),则您可能需要更新这些应用程序,才能使它们与迁移的集群正常工作。

mongosync 以未定义的顺序在目标集群上插入文档,这不会保留源集群的自然排序顺序。如果应用程序依赖于文档顺序,但没有定义的排序方法,则您可能需要更新这些应用程序以指定预期的排序顺序,才能使应用程序与迁移的集群正常工作。

mongosync 具有弹性,能够处理非致命错误。包含“错误”或“故障”字样的日志并不表明 mongosync 正在发生故障或损坏数据。例如,如果发生网络错误,mongosync 日志可能会包含“错误”字样,但 mongosync 仍能完成同步。如果同步未完成,mongosync 会写入一个致命错误日志条目。

在同步期间使用 DDL 操作(在集合或数据库上执行,如 db.createCollection()db.dropDatabase()的操作)会增加迁移失败的风险,并可能对 mongosync 性能产生负面影响。为获得最佳性能,请避免在同步过程中子源集群上执行 DDL 操作。

有关 DDL 操作的更多信息,请参阅待处理 DDL 操作和事务

迁移组件之间的网络延迟或较长的物理距离可能会对同步速度产生负面影响。

mongosync 和目标分片之间的延迟
对于源集群上的每个操作,mongosync 都会两次往返目标服务器。 延迟越大,同步越慢。
目标分片之间的延迟
mongosync 在目标集群上的ACID 事务中运行操作并分批更新自己的元数据。 这可能会导致跨分片事务,如果分片相距较远,则成本可能更高。
源集群或目标集群上任何副本集的节点之间的延迟
mongosync 使用"majority" 写入和"majority" 读取,这需要副本集集中的多个节点(包括支持分片的副本集)进行确认。如果大多数节点不在同一地区,则会对性能产生负面影响。

以下注意事项与 mongosync进程期间的中断有关。

如果 mongosync 在同步过程中遇到错误或变得不可用,您也可以从停止的地方恢复 mongosync 操作。 mongosync 二进制文件是无状态的,用于存储目标集群重启所需的元数据。

要继续同步,请在 mongosync 再次可用后重新启动它,并使用与中断的同步相同的参数。 重新启动 mongosync 后,进程会从停止处恢复。

如果您的源集群或目标集群意外崩溃,您可以从 mongosync 停止运行的位置安全地重新启动它。 一旦集群再次可用,重新启动 mongosync 并使用与中断的同步相同的参数。

如果mongosync 处于 PAUSED 状态,则mongosync 不支持以下操作:

  • 升级源集群或目标集群的MongoDB版本

  • 启用然后禁用负载均衡器

您可以在 mongosync 处于 PAUSED 状态时对其升级。

后退

mongosync