Docs 菜单
Docs 主页
/
MongoDB Cluster-to-Cluster Sync
/ /

mongosync 行为

在此页面上

  • 嵌入式验证程序免责声明
  • 设置
  • 集群独立性
  • 配置文件
  • 集群和集合类型
  • 分片集群
  • 多个集群
  • 固定大小集合
  • 读取和写入
  • 写入阻塞
  • 读关注和写关注
  • 读取偏好
  • 传统索引处理
  • 连续同步注意事项
  • 对集合特征的临时更改
  • 滚动索引构建
  • 目标集群
  • 一致性(Consistency)
  • 剖析
  • 视图
  • 系统集合
  • UUID
  • 排序
  • 性能
  • 恢复力
  • 数据定义语言 (DDL) 操作
  • 了解详情

mongosync 二进制是集群到集群同步中使用的主要进程。mongosync 可将数据从一个集群迁移到另一个集群,同时保持集群持续同步。

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

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

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

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

当您启动 mongosync进程时,它会提供免责声明,告知用户默认会启用验证程序。

Embedded verification is enabled by default for replica set to replica set migrations.
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

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

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

重要

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

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

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

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

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

警告

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

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

从 1.3.0 开始,“集群到集群同步”支持固定大小集合,但有一些限制。

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

  • cloneCollectionAsCapped 不受支持。

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

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

  • 文档数量没有上限。

  • 最大集合大小为 1PB。

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

mongosync 默认情况下不启用写入阻塞。如果启用写入阻塞,则 mongosync 会阻止写入:

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

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

要启用写入阻塞,请使用启动 APIenableUserWriteBlocking 设置为 true。 同步开始后,无法启用写入阻塞。

如果要稍后使用反向同步,则必须在启动 mongosync 时启用写入(write)阻止。

要设置 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提交之前关闭(例如在灾难情况下),则目标集群可能没有源数据的一致快照。 要学习;了解更多信息,请参阅一致性。

注意

提交后,您无法在两个集群之间恢复连续同步,因为mongosync只能同步到空的目标集群。 如果您在切换后需要使用相同的两个集群,则可以调用reverse端点以使集群保持同步。 否则,使用新的空目标集群启动新的连续同步操作。

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

更改
说明
Unique Indexes
源集群上的唯一索引将作为目标集群上的非唯一索引进行同步。
TTL Indexes
同步将 expireAfterSeconds 设置为目标集群上的 MAX_INT 的值。
Hidden Indexes
同步会将隐藏索引复制为非隐藏索引。
写入阻塞

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

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

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

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

固定大小集合
同步会将固定大小集合设置为允许的最大大小。
虚拟索引
在某些情况下,同步可能会在目标上创建虚拟索引,以支持对分分片的或排序规则集合的写入。

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

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

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

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

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

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

Cluster-to-Cluster Sync 不会将系统集合复制到目标集群。

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

例如,在目标集群上:

  • 删除操作不会影响用户创建的 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