mongodb通过MongoShake实现数据同步
MongoShake 是一个以 Golang 编写的通用平台服务。它的核心原理是充当一个智能“搬运工”从源MongoDB抓取oplog操作日志再将这些操作在目标MongoDB上“重放”一遍从而实现数据同步。因为它基于oplog所以能实现准实时的同步延迟通常在毫秒级。核心功能与能力MongoShake的强大之处在于其丰富的功能和灵活的架构。灵活的同步模式通过sync_mode参数你可以选择三种模式all全量 增量最常用。它会先同步所有已有数据然后持续同步新的变更。full仅全量同步一次后任务就会结束。incr仅增量只同步任务启动后的新操作不同步历史数据。高性能的并发复制支持并行处理以提升速度。你可以通过shard_key参数控制并行粒度id文档级并发以每行数据的_id为键并行度高但要求集合不能有唯一索引。collection集合级并发以整个集合为键能保证集合内的顺序但并发度相对较低。auto自动模式系统会自动检测。如果集合有唯一索引则降级为collection模式否则使用id模式。丰富的传输通道 (Tunnel)数据不仅可以直接写入另一MongoDB还可以发送到多种中间件实现日志订阅等高级功能。主要通道类型包括direct直接写入目标MongoDB最常用。kafka写入Kafka消息队列。file写入本地文件。rpc/tcp通过RPC或TCP协议发送。数据过滤与转换过滤通过配置白名单 (filter.namespace.white) 和黑名单 (filter.namespace.black)可以精确控制要同步或忽略的数据库和集合。转换支持transform.namespace参数可以在同步时动态地更改数据库或集合的名称如将admin库的数据同步到newDB库。高可用与断点续传MongoShake支持主备模式 (master_quorum)。它会定期将同步进度Checkpoint持久化到数据库。一旦主进程挂了备机可以接管并从断点处继续同步避免了从头开始。DDL与事务支持从v1.5版本开始MongoShake支持同步DDL操作如建索引、删表。它通过全局“屏障”Barrier机制确保DDL操作前后的数据顺序正确。同时对MongoDB 4.0开始支持的事务操作也能良好同步。监控与运维提供内置的RESTful API可以通过HTTP接口默认端口9100用于增量9101用于全量实时查看同步延迟、QPS等内部状态。此外还提供mongoshake-stat脚本进行便捷监控。️ 快速上手与核心配置1. 环境准备与启动# 1. 下载以v2.8.7为例建议去GitHub releases找最新版 目前支持Mongodb7及以下的版本wget https://github.com/alibaba/MongoShake/releases/download/release-v2.8.7-20251218/mongo-shake-v2.8.7.tgz -O mongoshake.tar.gz# 2. 解压tar zxvf mongoshake.tar.gzcd mongo-shake-v2.8.7# 3. 修改核心配置文件vi collector.conf# 4. 启动同步任务./collector.linux -verbose2. 核心配置参数详解核心配置文件是collector.conf你需要重点关注以下几个参数参数分类参数名 (示例)说明与建议值同步模式sync_mode all生产环境首次同步建议用all后续重启可改为incr。源端地址mongo_urls mongodb://user:passhost1:3717,host2:3717/admin强烈建议填写从节点Secondary的地址避免给主库造成压力。目标端地址tunnel.address mongodb://user:passtarget-host:3717/admin可以填写主节点Primary或Mongos地址。通道类型tunnel direct用于MongoDB到MongoDB的同步最常用。并发控制worker 8reader.collection_parallel 6worker控制全局并发线程数默认为8。可根据CPU和负载调整。高可用master_quorum false单实例运行设为false。如果部署多个进程做HA需将主节点设为true。过滤规则filter.namespace.black system.profile, mydb.tempfilter.namespace.white mydb黑名单内的库表不会被同步。白名单之外的库表不会被同步。同时配置时黑名单优先级更高-1。命名空间转换transform.namespace admin:newDB将源端admin库的数据同步到目标端的newDB库。延迟同步incr_sync.target_delay 3600让目标端数据滞后源端指定秒数可用于“延迟从库”防止误操作。权限要求源端账号需要readAnyDatabase、local库的read权限目标端账号需要readWriteAnyDatabase权限。3. 监控命令示例任务启动后可以用下面的命令查看同步状态# 需要Python环境 ./mongoshake-stat --port9100输出的关键指标包括logs_get/sec每秒从源端拉取的oplog数。logs_repl/sec每秒向目标端写入的oplog数。lsn_ack.time与now.time的差值代表了当前的同步延迟。 重要注意事项源端必须是副本集或分片集群因为MongoShake依赖oplog所以源端不能是单节点。如果当前是单节点需要先将其转换为副本集架构参考MongoDB Docker 单节点转副本集完整指南。网络延迟同步的实时性高度依赖于MongoShake服务器与源、目标数据库之间的网络质量。将它们部署在同一个专有网络VPC中能获得最佳性能。全量同步期间的DDL操作在全量数据同步完成前请避免对源库进行DDL操作如增减字段、删表否则可能导致同步失败或数据不一致。总的来说MongoShake 是一个功能强大且久经考验的开源方案。无论是简单的数据备份、复杂的异地多活还是将数据变更流式传输到Kafka供下游消费它都能胜任。