作者 | 吴守阳
审校 | 重楼
速览
1、主要特点
2、使用场景
3、限制
4、注意事项
5、连接方式
6、使用方法
7、参数详解
8、总结
MongoSync 是引入 MongoDB 6.0 的一个新的迁移工具,用于在不同 MongoDB 部署之间进行数据迁移。它取代了之前的 mongoexport 和mongoimport,以及mongodump 和mongorestore 的部分功能,提供了更为高效和安全的数据迁移体验。
1、主要特点
- 实时数据迁移:MongoSync 支持实时数据迁移,可以在源和目标数据库之间同步数据更改,确保数据的一致性和实时性。
- 增量迁移:它能够进行增量数据迁移,这意味着在初次迁移完成后,只迁移自上次迁移以来的更改,减少了数据传输量和迁移时间。
- 断点续传:MongoSync 具备断点续传功能。如果迁移过程中出现中断,可以从中断的地方继续迁移,避免了完全重新开始的需要。
- 数据验证:在迁移过程中,MongoSync 会进行数据验证,确保迁移后的数据与源数据一致。
- 多线程和并发处理:MongoSync 支持多线程和并发处理,可以利用多核CPU并行处理数据,提高迁移效率。
- 安全性和加密:在数据迁移过程中,MongoSync 可以使用加密通道,保护数据在传输过程中的安全。
2、使用场景
- 数据中心迁移:当需要将数据从一个数据中心迁移到另一个数据中心时。
- 云迁移:将本地部署的 MongoDB 数据迁移到云服务提供商(如 MongoDB Atlas)。
- 数据库升级:在进行版本升级或架构调整时,将数据从旧部署迁移到新部署。
- 数据备份和恢复:作为数据备份策略的一部分,定期将数据迁移到备用数据库。
3、限制
- 目标集群必须为空。
- MongoSync 不验证集群或环境是否正确配置。
- 在 MongoSync 运行期间,其他客户端不应向目标集群写入数据。
- 如果禁用了写入阻塞,用户在开始提交过程前必须阻止对源集群的写入。
- 不复制 system.* 类型的集合。
- 不支持字段名以美元符号 ($) 开头的文档。
- 不支持 MongoDB 无服务器(Serverless)集群。
- 不支持 MongoDB 共享层(Shared Tier)。
- 不支持可查询加密(Queryable Encryption)。
- 无法同步在相同字段上同时定义了唯一索引和非唯一索引的集合。
- 在尝试使用 MongoDB Atlas 集群前,应禁用“所有查询都需要索引”选项(M10+)。
- MongoSync 不同步用户或角色。
- MongoSync 不复制在源集群上进行的 applyOps 操作至目标集群。
- MongoSync 必须使用主读取偏好从源集群读取数据。
- MongoSync 不支持同步 Atlas Search 索引。
- MongoSync 仅支持使用 WiredTiger 存储引擎的集群。
MongoDB 社区版
MongoDB 不测试社区版的集群间同步,并且在大多数情况下,不为社区部署提供集群间同步的支持。若想在 MongoDB 社区版中使用集群间同步,需联系 MongoDB 销售代表讨论需求和定制化选项。
不支持的集合类型
- 时间序列集合不受支持。
- 设置了 expireAfterSeconds 的聚类集合不受支持。
分片集群
- MongoSync 不支持从分片集群到复制集的同步。
- 从复制集到分片集群的同步有以下限制:
- 在同步过程中,MongoSync 允许用户重命名 sharding.shardingEntriesStart 命令选项中包含的集合。
- 在同步过程中使用 sharding.createSupportingIndexes 选项创建支持分片键的索引后,不能在源集群上创建这些索引。
- 在一个集合内,_id 字段在集群所有分片上必须是唯一的。
- 同步期间不能使用 movePrimary 命令重新分配主分片。
- 区域配置不会被复制,MongoSync 只复制数据,不继承区域。
- 同步过程中不能添加或移除分片。
- MongoSync 仅同步所有分片上存在的索引。
- MongoSync 仅同步所有分片上具有一致索引规范的索引。
- 必须在整个迁移期间停止源和目标分片集群的平衡器。
- 同步过程中不得在源或目标集群上运行 moveChunk 或 moveRange 命令。
- 同步期间不能细化分片键或使用 reshardCollection 修改分片键。
反向同步
- 若旧源集群上的唯一索引部分分布在分片上,反向同步可能会导致失败,确保反向前所有分片上有唯一索引。
- 源和目标集群的分片数量必须相同,不同拓扑或主要版本的集群无法反向同步。
多个集群
- MongoSync 不支持将多个源集群同步到单一目标集群。
- 一个集群不能同时作为 MongoSync 的源集群和目标集群。
过滤同步
- 过滤不支持反向同步。
- 开始前目标集群中不应包含用户数据。
- 开始前目标集群中不应包含系统数据库。
- 不能修改正在使用的过滤器,要创建新过滤器,参考替换现有过滤器。
- 只能在特定情况下重命名集合。
- 如果过滤器包含视图但不包含基础集合,只有视图元数据会被同步到目标集群。
- 过滤器中不能指定系统集合或系统数据库。
- 使用 $out 聚合阶段或 mapReduce 命令(设置为创建或替换集合)时,必须配置过滤器以使用整个数据库,不能限制过滤器到数据库内的集合。
限制集合
- 自1.3.0版本起,集群间同步支持限制集合,但有一些限制。
- convertToCapped 和 cloneCollectionAsCapped 不受支持。
- 源集群上的限制集合在同步期间正常工作。
- 目标集群上的限制集合在同步期间会有临时变化,没有文档数量的最大限制,最大集合大小为1PB,MongoSync 在提交时恢复原始的最大文档数量和最大文档大小。
4、注意事项
当源集群或目标集群为分片集群时,停止 balancer,并且不要在整个生命周期内运行 moveChunk 或 moveRange 命令 迁移。要停止均衡器,请运行 balancerStop 命令并等待命令完成。
5、连接方式
SRV 连接方案的形式为:
mongodb+srv://[username:password@][host.domain.TLD][:port][/defaultauthdb][?options]
标准 URI 连接方案的格式为:
mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[defaultauthdb][?options]]
在使用MongoSync 进行集群间同步时,正确的连接字符串是至关重要的。无论是使用 SRV 还是标准 URI 方案,你都需要确保提供足够的信息来准确地连接到源和目标集群。对于复制集,直接指定 mongod 实例;而对于分片集群,则应指定mongos 实例。通过遵循这些指南,你可以确保MongoSync 正确地初始化并执行数据同步。
6、使用方法
MongoSync 集群到集群:
shard01迁移
mongosync \
--cluster0 "mongodb://clusterAdmin:superSecret@clusterOne01.fancyCorp.com:27500,clusterOne02.fancyCorp.com:27500,clusterOne03.fancyCorp.com:27500" \
--cluster1 "mongodb://clusterAdmin:superSecret@clusterTwo01.fancyCorp.com:27500,clusterTwo02.fancyCorp.com:27500,clusterTwo03.fancyCorp.com:27500" \
--id shard01 --port 27181
shard02迁移
mongosync \
--cluster0 "mongodb://clusterAdmin:superSecret@clusterOne01.fancyCorp.com:27500,clusterOne02.fancyCorp.com:27500,clusterOne03.fancyCorp.com:27500" \
--cluster1 "mongodb://clusterAdmin:superSecret@clusterTwo01.fancyCorp.com:27500,clusterTwo02.fancyCorp.com:27500,clusterTwo03.fancyCorp.com:27500" \
--id shard02 --port 27182
shard03迁移
mongosync \
--cluster0 "mongodb://clusterAdmin:superSecret@clusterOne01.fancyCorp.com:27500,clusterOne02.fancyCorp.com:27500,clusterOne03.fancyCorp.com:27500" \
--cluster1 "mongodb://clusterAdmin:superSecret@clusterTwo01.fancyCorp.com:27500,clusterTwo02.fancyCorp.com:27500,clusterTwo03.fancyCorp.com:27500" \
--id shard03 --port 27183
检查进度
curl mongosync01Host:27181/api/v1/progress -XGET
暂停实例MongoSync
curl mongosync01Host:27181/api/v1/pause -XPOST --data '{}'
恢复同步
curl mongosync01Host:27181/api/v1/resume -XPOST --data '{}'
mongosync01Host为创建mongosync的实例地址
7、参数详解
--cluster0 value
用于指定第一个集群的URI,该集群可以作为数据源或目标。
--cluster1 value
用于指定第二个集群的URI,同样可以作为数据源或目标。
--verbosity value
设置日志的详细程度级别,可选值包括:TRACE, DEBUG, INFO, WARN, ERROR, FATAL, PANIC(默认值为 DEBUG)。
--logPath DIRECTORY
指定日志输出的目录路径。
--port value
设置HTTP API服务器的端口号(默认值为 27182)。
--id value
当使用多个 mongosync 实例时,该标志应设置为 mongosync 将负责追踪的源分片ID。如果仅使用单个 mongosync 实例,则不应设置此标志。
--config value
指定配置文件的路径。
--version, -v
打印 mongosync 的版本信息。
--disableTelemetry
如果设置,将禁用遥测跟踪(默认值为 false)。
--loadLevel value
控制内部并行度参数的数字,范围从 1(最小并行度)到 4(最大并行度)(默认值为 3)。
总结
MongoSync 是 MongoDB 6.0 提供的一种强大且灵活的数据迁移工具,它简化了数据迁移的过程,提高了迁移的效率和安全性,是进行数据库迁移项目的理想选择。如果你正计划进行数据迁移,MongoSync 值得考虑。不过,在使用之前,建议先在测试环境中试验,以熟悉其操作流程并评估其性能影响。
作者介绍
吴守阳,51CTO社区编辑,拥有8年DBA工作经验,熟练管理MySQL、Redis、MongoDB等开源数据库。精通性能优化、备份恢复和高可用性架构设计。善于故障排除和自动化运维,保障系统稳定可靠。具备良好的团队合作和沟通能力,致力于为企业提供高效可靠的数据库解决方案。