如果你需要在两个MongoDB单实例(A → B)之间实现自动同步,使用MongoShake是最成熟且灵活的开源方案。它通过抓取源库的Oplog实现数据复制,支持全量+增量同步。以下是完整操作指南:
🔧 一、工具选型:MongoShake核心优势
- 适用场景:单实例→单实例、副本集→副本集、混合云同步。
- 原理:读取源库(A)的Oplog,重放到目标库(B)。
- 支持同步模式:
all
:全量+增量同步(推荐初次使用)。incr
:仅增量同步(适用于持续备份)。full
:仅全量同步。
⚙️ 二、同步前准备
1. 环境要求
- 源库(A)与目标库(B):
- 启用Oplog:单实例需初始化为副本集(执行
rs.initiate()
)。 - MongoDB版本 ≥ 3.0(推荐 ≥ 3.6)。
- 中间执行节点:
- 一台Linux服务器(ECS或物理机),需能连通A与B。
- 安装Python 2.7(用于监控)。
2. 权限配置
数据库 | 所需权限 | 说明 |
---|---|---|
源库(A) | readAnyDatabase + local 库读权限 |
用于读取Oplog |
目标库(B) | readWriteAnyDatabase |
用于写入数据 |
3. 网络与白名单
- 将中间服务器的内网IP添加到A和B的防火墙白名单中。
- 若跨网络,可使用公网地址(性能较差)。
📥 三、配置与操作步骤
1. 安装MongoShake
# 下载并解压(以v2.4.16为例)
wget http://docs-aliyun.oss-cn-hangzhou.aliyuncs.com/assets/attach/196977/mongo-shake-v2.4.16.tar.gz -O mongoshake.tar.gz
tar zxvf mongoshake.tar.gz
cd mongo-shake-v2.4.16
2. 修改配置文件 collector.conf
# 源库A的连接地址(单实例)
mongo_urls = mongodb://用户名:密码@A的IP:27017
# 目标库B的连接地址
tunnel.address = mongodb://用户名:密码@B的IP:27017
# 同步模式:全量+增量
sync_mode = all
# 其他关键参数
id = sync_task # 任务ID(自定义)
tunnel = direct # 直连目标库
💡 注意:密码中不能包含
@
字符,否则连接失败。
3. 启动同步
./collector.linux -conf=collector.conf -verbose
- 观察日志:出现
finish full sync, start incr sync
表示全量同步完成,进入增量同步。
📊 四、监控与管理
- 实时监控:
bash ./mongoshake-stat --port=9100 # 查看同步延迟、Oplog吞吐量
- 关键指标:
logs_get/sec
:每秒获取的Oplog数量。lsn_ack.time
:目标库写入确认时间(判断延迟)。- 停止任务:直接终止进程,增量断点自动保存到源库的
mongoshake
库中(重启可续传)。
⚠️ 五、常见问题与备选方案
- 同步中断:
- 检查Oplog大小:若源库Oplog被覆盖,需重新全量同步。
-
网络闪断:MongoShake自动重试,无需干预。
-
备选工具:
- py-mongo-sync(Python开发):轻量级增量同步,适合简单场景。
- Flink CDC:需编码,适合流处理场景。
💎 六、最佳实践建议
- 首次同步:选择业务低峰期启动
sync_mode=all
,避免DDL操作。 - 性能优化:
- 调整
incr_sync.worker
(工作线程数,建议 ≤ CPU核心数)。 - 中间服务器与MongoDB同可用区,减少网络延迟。
- 数据一致性:定期用
db.hash
校验关键集合的哈希值。
通过以上步骤,可实现稳定的单向自动同步。若需双向同步或分片集群支持,需提交工单申请MongoShake企业版功能。