mongosync
行为
在此页面上
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
不会保留源集群的分片配置。
重要
当源集群或目标集群是分片集群时,您必须停止这两个集群上的负载负载均衡器,并且在迁移期间不得运行moveChunk
或moveRange
命令。要停止负载均衡器,请运行balancerStop
命令并等待命令完成。
预分割数据块
当 mongosync
同步到分分片的目标集群时,它会为目标集群上的分分片的集合预分割数据段。对于每个分分片的集合,mongosync
创建的数据段数量是目标集群中分片数量的两倍。
数据段分布
mongosync
不保留从源到目标的数据数据块分布,即使有多个 mongosync
实例也是如此。无法在目标集群上重现来自源集群的数据段的特定预分割。
mongosync
从源集群到目标集群保留的唯一分片配置是分片键。迁移完成后,您可以启用目标集群的负载均衡器,该负载均衡器的文档分发独立于源集群的分布。
主分片
当您同步到分分片的目标集群时,mongosync
会通过循环方式向每个数据库分配一个主分片分片。
警告
movePrimary
迁移期间在源集群或目标集群上运行 可能会导致致命错误,或者需要您从头开始重新启动迁移。有关更多信息,请参阅分片集群。
多个集群
要将源集群同步到多个目标集群,请为每个目标集群使用一个 mongosync
实例。有关更多信息,请参阅多集群限制。
固定大小集合
从 1.3.0 开始,“集群到集群同步”支持固定大小集合,但有一些限制。
不支持
convertToCapped
。如果运行convertToCapped
,则mongosync
会退出并显示错误。cloneCollectionAsCapped
不受支持。
同步期间,源集群上的固定大小集合可正常工作。
同步期间,目标集群上的固定大小集合会出现临时更改:
文档数量没有上限。
最大集合大小为 1PB。
mongosync
在提交期间恢复最大文档数量和最大文档大小的原始值。
读取和写入
写入阻塞
mongosync
默认情况下不启用写入阻塞。如果启用写入阻塞,则 mongosync
会阻止写入:
在同步期间的目标集群上。
在收到
commit
时的源集群上。
要启用写入阻塞,请使用启动 API将 enableUserWriteBlocking
设置为 true
。 同步开始后,无法启用写入阻塞。
如果要稍后使用反向同步,则必须在启动 mongosync
时启用写入(write)阻止。
用户权限
要设置 enableUserWriteBlocking
,mongosync
用户必须有包含 setUserWriteBlockMode
和 bypassWriteBlockingMode
ActionTypes 的角色。
注意
使用 enableUserWriteBlocking
时,仅对不具有 bypassWriteBlockingMode
ActionType 的用户应用阻塞写入。具有此 ActionType 的用户可以执行写入。
允许的读取
始终允许对源集群执行读取操作。
当 /progress 端点报告 canWrite
为 true
时,源集群和目标集群上的数据是一致的。
允许的写入
如需查看 mongosync
所处的状态,请调用 /progress API 端点。/progress
输出包括一个布尔值 canWrite
。
当
canWrite
为true
时,可安全地写入目标集群。当
canWrite
为false
时,不向目标集群写入。
当 mongosync
在同步时,您可以安全地写入源集群。除非 canWrite
为 true
,否则不要写入目标集群。
读关注和写关注
默认情况下,mongosync
将源集群上读取的读关注级别设置为 "majority"
。对于目标集群上的写入,mongosync
将写关注级别设置为 "majority"
,并指定 j: true。
读取偏好
传统索引处理
mongosync
将传统索引值(如 0
或空字符串)重写为目标上的 1
。 mongosync
还会删除目标上的任何无效索引选项。
连续同步注意事项
对于任何使用mongosync
的连续同步用例,请确保mongosync
在从源切换到目标之前提交。
如果源集群在mongosync
提交之前关闭(例如在灾难情况下),则目标集群可能没有源数据的一致快照。 要学习;了解更多信息,请参阅一致性。
注意
对集合特征的临时更改
mongosync
在同步期间临时更改以下集合特征。 原始值会在提交进程中恢复。
更改 | 说明 |
---|---|
Unique Indexes | 源集群上的唯一索引将作为目标集群上的非唯一索引进行同步。 |
TTL Indexes | 同步将 expireAfterSeconds 设置为目标集群上的 MAX_INT 的值。 |
Hidden Indexes | 同步会将隐藏索引复制为非隐藏索引。 |
写入阻塞 | |
固定大小集合 | 同步会将固定大小集合设置为允许的最大大小。 |
虚拟索引 | 在某些情况下,同步可能会在目标上创建虚拟索引,以支持对分分片的或排序规则集合的写入。 |
滚动索引构建
mongosync
不支持迁移期间的滚动索引构建。为避免在迁移期间以滚动方式构建索引,请使用以下方法之一确保目标索引与源索引匹配:
迁移前在源上构建索引。
迁移后在目标上构建索引。
目标集群
一致性(Consistency)
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
时会删除数据库中所有用户创建的集合,但会将其系统集合留在目标集群上。
UUID
mongosync
在目标集群上创建带有新 UUID 的集合。源集群和目标集群上的 UUID 之间没有关系。如果应用程序包含硬编码的 UUID(MongoDB 不建议这样做),则您可能需要更新这些应用程序,才能使它们与迁移的集群正常工作。
排序
mongosync
以未定义的顺序在目标集群上插入文档,这不会保留源集群的自然排序顺序。如果应用程序依赖于文档顺序,但没有定义的排序方法,则您可能需要更新这些应用程序以指定预期的排序顺序,才能使应用程序与迁移的集群正常工作。
性能
恢复力
mongosync
具有弹性,能够处理非致命错误。包含“错误”或“故障”字样的日志并不表明 mongosync
正在发生故障或损坏数据。例如,如果发生网络错误,mongosync
日志可能会包含“错误”字样,但 mongosync
仍能完成同步。如果同步未完成,mongosync
会写入一个致命错误日志条目。
数据定义语言 (DDL) 操作
在同步期间使用 DDL 操作(在集合或数据库上执行,如 db.createCollection()
和 db.dropDatabase()
的操作)会增加迁移失败的风险,并可能对 mongosync
性能产生负面影响。为获得最佳性能,请避免在同步过程中子源集群上执行 DDL 操作。
有关 DDL 操作的更多信息,请参阅待处理 DDL 操作和事务。