mongosync介绍
mongosync是由Qihoo 360公司DBA团队与Web平台部基础架构合作开发的一个基于MongoDB协议、mongodb同步模块代码、深度定制的一款支持MongoDB副本集间的数据传输工具。目前该工具已在360公司内部投入使用。
工具代码和wiki已上传至公司github账户:https://github.com/qihoo360/mongosync 。
在此需要特别感谢Mongosync第一版作者,从他那我们借鉴了很多独特的想法和思路并在此基础上进行了深度改进和创新。
原作者网站及微博地址如下:
网站:nosqldb.org
微博:http://weibo.com/239723123
1 功能
目前mongosync支持的功能主要包括:
1.1 全量数据同步
主要用于MongoDB节点间的数据拷贝,支持集群、数据库、集合及带查询条件四个模式。
如下是一个以集合粒度的全量数据同步命令:
$ ./mongosync --src_srv 192.168.1.1:27017 --src_user user --src_passwd 123456 --src_auth_db admin --dst_srv 192.168.1.2:27018 --dst_user user --dst_passwd 123456 --dst_auth_db admin --db src_db --dst_db dst_db --coll src_coll --dst_coll dst_coll --bg_num 10 --no-index
该命令将192.168.1.1:27017节点的src_db.src_coll集合下的数据传输到192.168.1.2:27018节点的dst_db.dst_coll的集合内,并且不传输索引(—no-index表明不同步索引、通常用于mongodb数据备份场景)。
—bg_num参数用于指定启动多少个线程往目标数据库写入数据。经大量测试发现全量同步整个数据传输过程中,往目标端的写入速度是mongosync最大的瓶颈。因此这里我们采用多线程(每个线程与目的端建立一个连接)并发写入机制来提升数据传输速度,具体原理见下图:


1.2 实时数据同步
实时同步=全量同步+oplog实时传输
同样实时同步也分别支持集群、数据库、集合以及基于查询条件四个粒度。
以集合同步模式为例:
./mongosync --src_srv 192.168.1.1:27017 --src_user user --src_passwd 123456 --src_auth_db admin --dst_srv 192.168.1.2:27018 --dst_user user --dst_passwd 123456 --dst_auth_db admin --db src_db --dst_db dst_db --coll src_coll --dst_coll dst_coll --oplog
—oplog 表示完成全量数据同步后需进行oplog实时传输。
该命令表明在完成从192.168.1.1:27017节点src_db.src_coll集合到192.168.1.2:27018节点dst_db.dst_coll集合的全量数据同步后,继续保持源节点和目的节点上这两个集合的实时数据同步。
另外,如果因网络中断、源或目标集群切换导致同步中断,此时我们依然可以通过添加参数—op_start xxx,xxx(即同步输出日志中记录中断时的时间戳)并重启同步进程即可实现断点续传。
1.3 oplog实时传输
该功能将某个MongoDB集群的oplog实时的传输到另一个MongoDB集群并存储。
oplog实时传输只支持集群、数据库、集合三个粒度,当然启动oplog实时同步时可显示指定起始和截止时间戳。
2 优势和特点
2.1 版本兼容性
允许多版本间的数据拷贝和同步,目前支持的版本有:
2.4
2.6
3.0
注意: 3.2及3.4两个版本暂时没经过详细测试,不保证兼容性。
2.2 多线程及批量写入
a. 在全量同步模式下通过指定—bg_num参数与目的节点建立N个连接用以并行写入数据。
鉴于mongodb 2.x版本都是库级锁故目标端mongodb版本为3.x版本时多线程才能真正发挥作用。
b. 从源端获取数据后写入本地buffer 之后再批量写入目标端,减少单条数据传输的平均成本。
2.3 功能齐全
mongosync支持的命令行选项比较的多,可以支持各种同步模式具体使用参见wiki介绍。
ps: 因为mongosync参数较多,故除可命令行启动外,也同样支持指定配置文件的方式启动。
3 性能
3.1 全量同步
测试配置:
ping延迟:
mongosync<——>源端: 约0.15ms mongosync<—— >目的端:约1.23ms源端和目的端分别处于不同机器
测试时源端和目的端都处于空闲状态
千兆网卡
测试结果:
| 数据记录数(条) | 数据大小(GB) | 耗时(S) | 平均Qps | 平均网络速度(MB/s) |
|---|---|---|---|---|
| 13,588,980 | 9.9 | 147 | 9.2w | 67 |
3.2 oplog同步
ping延迟:
mongosync<——>源端: 约10.8ms mongosync<—— >目的端:约10.8ms源端和目的端分别处于不同机器
测试时源端和目的端都处于空闲状态
| 数据条数(条) | 耗时(S) | 平均Qps |
|---|---|---|
| 6,197,597 | 366 | 1.7w |
4. 下一步
a. 更多mongo版本的支持(如3.2和3.4)
b. 支持单节点到副本集、单节点到mongs、副本集到mongos、
mongos到副本集、mongos到mongos的同步及mongos下oplog的实时传输
c. 全量同步中对索引创建进行优化,进一步加快全量同步速度




