Docs 主页 → MongoDB Cluster-to-Cluster Sync
mongosync
说明
mongosync
二进制是集群到集群同步中使用的主要进程。mongosync
可将数据从一个集群迁移到另一个集群,同时保持集群持续同步。
本文档将全面概述 mongosync
命令行选项。
注意
源集群和目标集群都必须使用 MongoDB 6.0 或更高版本。
mongosync
支持副本集和分片集群。不支持独立运行的 MongoDB 实例。 在使用 Cluster-to-Cluster Sync 之前,将独立实例转换为副本集。
mongosync
不支持 Atlas 共享集群或无服务器实例。有关限制的完整列表,请参阅 Cluster-to-Cluster Sync 限制。
选项
全局选项
--cluster0 <URI>
设置第一个集群的连接 URI 。在同步过程中,第一个集群既可以作为源,也可以作为目标。在对
start
API 端点的调用中指定源集群和目标集群。有关连接
mongosync
的更多信息,请参阅连接。要通过配置文件设置
--cluster0
选项,请参阅cluster0
设置。
--cluster1 <URI>
设置第二个集群的连接 URI 。在同步过程中,第二个集群既可以作为源,也可以作为目标。在对
start
API 端点的调用中指定源集群和目标集群。有关连接
mongosync
的更多信息,请参阅连接。要通过配置文件设置
--cluster1
选项,请参阅cluster1
设置。
--config <filename>
设置配置文件的路径。
有关更多信息,请参阅集群独立性。
--disableTelemetry
版本 1.4.0 中的新增功能。
禁用收集
mongosync
遥测数据。默认情况下,
mongosync
收集匿名的汇总使用数据以改进 MongoDB 产品。当您运行mongosync
时,您可以禁用此遥测数据的收集。要通过配置文件设置
--disableTelemetry
选项,请参阅disableTelemetry
设置。有关更多信息,请参阅用户数据集合。
--id <ID>
为
mongosync
实例设置标识符。在分片集群上运行多个
mongosync
实例时,使用此选项单独同步分片。此选项的标识符值必须与其同步的分片的分片 ID 相对应。要查找分片 ID,请使用
listShards
命令。要通过配置文件设置
--id
选项,请参阅id
设置。
--loadLevel <level>
类型:整型
默认值:
3
设置在源集群和目标集群之间同步数据的集群工作负载级别:
4
,这是最高设置,最大限度地提高集群工作负载,数据同步的速度最快。1
,这是最低设置,最大限度地减少了集群工作负载,数据同步的速度最慢。
要通过配置文件设置
--loadLevel
选项,请参阅loadLevel
设置。警告
将
loadLevel
设置为高于默认值3
可能会对目标集群性能产生负面影响。
--logPath <DIR>
设置日志目录的路径。集群到集群同步会将日志写入该目录下的文件。
有关更多信息,请参阅日志记录。
要通过配置文件设置
--logPath
选项,请参阅logPath
设置。
--port
默认值:
27182
设置 HTTP 服务器用于集群到集群同步 HTTP API 的端口。
要通过配置文件设置
--port
选项,请参阅port
设置。
--verbosity <level>
默认值:
DEBUG
设置要在日志消息中使用的详细程度。 Cluster-to-Cluster Sync 记录指定级别的所有消息和较低级别的所有消息。
--verbosity
选项支持以下各值:TRACE
DEBUG
INFO
WARN
ERROR
FATAL
PANIC
要通过配置文件设置
--verbosity
选项,请参阅verbosity
设置。
行为
集群独立性
mongosync
在源集群和目标集群之间同步集合数据。 mongosync
不会同步用户或角色。因此,您可以在每个集群上创建具有不同访问权限的用户。
配置文件
可以在 YAML 配置文件中设置mongosync
的选项。使用--config
选项。例如:
$ mongosync --config /etc/mongosync.conf
有关可用设置的信息,请参阅配置。
一致性(Consistency)
mongosync
支持目标集群上的最终一致性。不保证目标集群上的读取一致性,且源集群和目标集群在给定时间点可能不同。但是,如果对源集群的新写入停止,则源集群和目标集群最终将保存相同的数据。
单个写入在从源中继到目标时,可以重新排序或组合。 对于给定文档, 源和目标之间的写入总数可能不同。
事务可能以非原子方式出现在目标集群上。 可重试写入可能无法在目标集群上重试。
剖析
如果对源数据库启用了分析,MongoDB 则会创建一个名为 <db>.system.profile
的特殊集合。同步完成后,Cluster-to-Cluster Sync 不会从目标中删除 <db>.system.profile
集合,即使后续删除源数据库也是如此。<db>.system.profile
集合不会改变目标上用户数据的准确性。
分片集群
Cluster-to-Cluster Sync 支持分片集群之间的复制。单个分片会从源集群并行复制到目标集群,但在复制过程中,数据段迁移或类似的源更新可能会将文档移动到新的源分片。
即使文档在复制过程中在源分片之间移动,集群到集群同步也能保持目标集群上的最终一致性保证。
视图
如果将带视图的数据库拖放到源上,则目标可能会在该数据库中显示空system.views
集合。空system.views
集合不会改变目标上用户数据的准确性。
写入阻塞
mongosync
默认情况下不启用写入阻塞。如果启用写入阻塞,则 mongosync
会阻止写入:
在同步期间的目标集群上。
在源集群上,当收到
commit
时。
要启用写入阻塞,请使用启动 API将 enableUserWriteBlocking
设置为 true
。 同步开始后,无法启用写入阻塞。
如果要稍后使用反向同步,则必须在启动 mongosync
时启用写入(write)阻止。
用户权限
要设置enableUserWriteBlocking
, mongosync
用户必须具有包含setUserWriteBlockMode
和bypassWriteBlockingMode
ActionType 的角色。
注意
使用enableUserWriteBlocking
时,仅对没有bypassWriteBlockingMode
ActionType 的用户阻止写入。具有此 ActionType 的用户能够执行写入。
允许的读取
始终允许对源集群执行读取操作。
当 /progress 端点报告 canWrite
为 true
时,源集群和目标集群上的数据是一致的。
允许的写入
如需查看 mongosync
所处的状态,请调用 /progress API 端点。/progress
输出包括一个布尔值 canWrite
。
当
canWrite
为true
时,可安全地写入目标集群。当
canWrite
为false
时,不向目标集群写入。
当 mongosync
在同步时,您可以安全地写入源集群。除非 canWrite
为 true
,否则不要写入目标集群。
提交
要停止同步,请在目标集群上使用commit命令来转换索引并完成更改。如果启用写入阻塞:
commit
阻止源集群上的写入。commit
阻止对目标集群的写入,直到mongosync
开始索引验证。
要监控 commit
进程,请使用 progress 命令:
当
canWrite
为 true 时,可对目标集群进行写入。当
mongosync
进入COMMITTED
状态时,索引转换完成。
读关注和写关注
默认情况下, mongosync
将源集群上读取的读关注级别设置为"majority"
。对于目标集群上的写入, mongosync
将写关注级别设置为"majority"
,其中j: true。
读取偏好
固定大小集合
从1开始。 3 。 0 ,Cluster-to-Cluster Sync 支持固定大小集合,但有一些限制。
不支持
convertToCapped
。如果运行convertToCapped
,则mongosync
会退出并显示错误。cloneCollectionAsCapped
不受支持。
同步期间,源集群上的固定大小集合可正常工作。
同步期间,目标集群上的固定大小集合会出现临时更改:
文档数量没有上限。
最大集合大小为 1PB。
mongosync
在提交期间恢复最大文档数量和最大文档大小的原始值。
系统集合
Cluster-to-Cluster Sync 不会将系统集合复制到目标集群。
如果您对源集群发出dropDatabase
命令,此更改不会直接应用于目标集群。相反,Cluster-to-Cluster Sync 会删除目标集群上数据库中的用户集合和视图,但不会删除该数据库上的系统集合。
例如,在目标集群上:
删除操作不会影响用户创建的
system.js
集合。如果启用分析,则保留
system.profile
集合。如果在源集群上创建视图,然后删除数据库,复制删除操作会删除视图,但会留下空的
system.views
集合。
在这些情况下,复制 dropDatabase
时会删除数据库中所有用户创建的集合,但会将其系统集合留在目标集群上。
恢复力
mongosync
具有弹性,能够处理非致命错误。包含“错误”或“故障”字样的日志并不表明 mongosync
正在发生故障或损坏数据。例如,如果发生网络错误,mongosync
日志可能会包含“错误”字样,但 mongosync
仍能完成同步。如果同步未完成,mongosync
会写入一个致命错误日志条目。
UUID
mongosync
在目标集群上创建带有新 UUID 的集合。源集群和目标集群上的 UUID 之间没有关系。如果应用程序包含硬编码的 UUID(MongoDB 不建议这样做),则您可能需要更新这些应用程序,才能使它们与迁移的集群正常工作。
排序
mongosync
以未定义的顺序在目标集群上插入文档,这不会保留源集群的自然排序顺序。如果应用程序依赖于文档顺序,但没有定义的排序方法,则您可能需要更新这些应用程序以指定预期的排序顺序,才能使应用程序与迁移的集群正常工作。
多个集群
要将源集群同步到多个目标集群,请为每个目标集群使用一个mongosync
实例。有关更多信息,请参阅多个集群限制。
举例
部署源集群和目标集群。
初始化 Cluster-to-Cluster Sync:
mongosync \ --cluster0 "mongodb://192.0.2.10:27017,192.0.2.11:27017,192.0.2.12:27017" \ --cluster1 "mongodb://192.0.2.20:27017,192.0.2.21:27017,192.0.2.22:27017" 为
--cluster0
和--cluster1
选项使用适当的连接字符串,以便它们可以连接到您的副本集。要启动同步进程,请使用 HTTP 客户端(例如 cURL)将
start
命令发送到mongosync
:curl localhost:27182/api/v1/start -X POST \ --data '{ "source": "cluster0", "destination": "cluster1" }' 示例输出:
{ "success": true }