MongoDB单实例(A → B)之间实现自动同步方案-Cases


如果你需要在两个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 库中(重启可续传)。

⚠️ 五、常见问题与备选方案

  1. 同步中断
  2. 检查Oplog大小:若源库Oplog被覆盖,需重新全量同步。
  3. 网络闪断:MongoShake自动重试,无需干预。

  4. 备选工具

  5. py-mongo-sync(Python开发):轻量级增量同步,适合简单场景。
  6. Flink CDC:需编码,适合流处理场景。

💎 六、最佳实践建议

  • 首次同步:选择业务低峰期启动 sync_mode=all,避免DDL操作。
  • 性能优化
  • 调整 incr_sync.worker(工作线程数,建议 ≤ CPU核心数)。
  • 中间服务器与MongoDB同可用区,减少网络延迟。
  • 数据一致性:定期用 db.hash 校验关键集合的哈希值。

通过以上步骤,可实现稳定的单向自动同步。若需双向同步或分片集群支持,需提交工单申请MongoShake企业版功能。