MongoDB如何将单个数据库定向复制到另一台服务器?
问题解答
首先给出核心结论:MongoDB官方标准副本集(Replication)无法满足你的单库定向复制需求。
原生副本集是为实例高可用设计的,同步粒度为整个MongoDB实例:加入副本集的从节点会全量同步主节点除local库外的所有数据库数据,既不支持仅同步单个指定数据库,也不支持在同步过程中对数据库重命名(将源端database 3a映射为目标端database 3b)。
可落地的实现方案
根据你对同步实时性的要求,可以选择以下两种常用方案:
方案1:mongodump + mongorestore 离线同步
适合对数据同步延迟容忍度高、不需要实时增量同步的场景,操作成本最低:
- 在可连接Server A的机器上执行导出命令,备份
database 3a的全量数据:mongodump --host <ServerA连接地址> --port <MongoDB端口> --authenticationDatabase admin -u <有读权限的账号> -p <密码> --db "database 3a" --archive=./db3a_backup.archive - 将导出的归档文件传输到可连接Server B的机器,执行导入命令,导入时直接将库名映射为目标端的
database 3b:mongorestore --host <ServerB连接地址> --port <MongoDB端口> --authenticationDatabase admin -u <有写权限的账号> -p <密码> --nsFrom "database 3a.*" --nsTo "database 3b.*" --archive=./db3a_backup.archive - 如果需要定期更新同步数据,可以将上述逻辑写成shell脚本,配合crontab等定时任务工具按需要的周期执行即可,注意如果目标端
database 3b已有存量数据,同步前按需做清理避免数据冲突。
方案2:基于Change Stream的实时同步
适合要求源端数据变更近实时同步到目标端的场景:
- 先将Server A上的MongoDB配置为单节点副本集模式(Change Stream依赖副本集oplog机制,普通单机实例无法直接使用),配置完成后不需要新增其他从节点,不影响现有业务使用。
- 可以自行开发简单的同步服务:监听
database 3a上的所有变更事件(包括文档增删改、集合创建/删除、索引变更等),在接收到变更后,对应在Server B的database 3b上重放所有操作即可。如果不想自行开发,也可以使用官方配套的同步工具配置命名空间过滤规则,指定仅同步database 3a并重定向映射到目标端database 3b。
注意:单节点副本集需要根据业务写入量合理设置oplog大小,避免同步服务停机维护时间过长时oplog被覆盖,导致增量同步断裂需要重新做全量同步。
内容的提问来源于stack exchange,提问作者Christian01
相关产品推荐
相关产品推荐

