MongoDB开源:mongosync:360 出品的支持 MongoDB 副本集间数据传输的工具

JohBEXU 3年前
   <h2>一、 简介</h2>    <p>mongosync是由Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MongoDB协议,依据mongodb同步模块代码,深度定制的一款支持MongoDB副本集间数据传输的工具。目前,该工具已经在360公司内部投入使用。</p>    <p>   主要功能:</p>    <p>       1、全量数据同步</p>    <p>       2、实时数据同步</p>    <p>       3、oplog实时传输</p>    <h2>二、 特点</h2>    <h3>1、版本兼容性 </h3>    <p>​ 版本支持情况如下(目前尚不支持mongos):</p>    <p>     后续考虑兼容3.2、3.4及更新版本 </p>    <h3>2、开发语言</h3>    <p>​ 底层采用C++语言,效率更高,速度更快</p>    <h3>3、多线程支持</h3>    <p>     多线程工作的原理如下图所示:</p>    <p style="text-align:center"><img alt="Imgur" src="https://simg.open-open.com/show/937f4111b38a2e6b1c95bed203a44e5e.png"></p>    <p> </p>    <h3>4、支持从库同步</h3>    <p>    支持从库作为复制源进行数据同步,减轻主库压力</p>    <h3>5、索引同步可配置</h3>    <p>    支持数据+索引 / 数据模式,加快数据同步速度</p>    <h2>三、使用说明</h2>    <h3>1.安装</h3>    <ul>     <li>获取源代码</li>    </ul>    <pre>  <code>   $ git clone https://github.com/jacketwoo/mongosync  </code></pre>    <ul>     <li>编译。进入mongosync目录,执行make命令</li>    </ul>    <pre>  <code>$ make  </code></pre>    <p>编译完成后,$(MONGOSYNC_ROOT)/output目录下可以发现可执行文件(mongosync)以及配置文件(mongosync.conf)</p>    <ul>     <li>清理</li>    </ul>    <pre>  <code>   $ make clean  </code></pre>    <p>说明</p>    <ul>     <li>编译过程中,如果发现缺失依赖包,请根据说明安装相应依赖包</li>     <li>请不要使用c++ 11编译</li>    </ul>    <h3>2.参数说明</h3>    <p>程序可以通过命令行及配置文件的方式运行,参数说明如下:<br> --help 获取帮助信息<br> -c conf.file 使用conf.file配置文件启动mongosync<br> --src_srv arg 源端ip及端口信息,格式:--src_srv 192.168.1.1:27017<br> --src_user arg 源端用户<br> --src_passwd arg 源端密码<br> --src_auth_db arg 源端认证库<br> --src_use_mcr 强制源端使用MONGODB-CR密码认证<br> --dst_srv arg 目的端ip及端口信息,格式:--src_srv 192.168.1.2:27018<br> --dst_user arg 目的端用户,需要具有创建数据库,集合,索引等操作权限<br> --dst_passwd arg 目的端密码<br> --dst_auth_db arg 目的端认证库<br> --dst_use_mcr 强制目的端使用MONGODB-CR密码认证<br> --db arg 源端数据库,默认同步除admin及local外的所有数据库<br> --dst_db arg 目的端数据库<br> --coll arg 源端集合,默认同步全部集合<br> --dst_coll arg 目的端集合<br> --oplog 是否同步oplog<br> --raw_oplog 是否只同步oplog<br> --op_start arg oplog同步的开始点位,格式:--op_start 1479436001,1<br> --op_end arg oplog同步的结束点位,格式:--op_start 1479436002,2<br> --dst_op_ns arg oplog同步时目的端的oplog名称,格式:--dst_op_ns sync.oplog<br> --no_index 是否同步索引<br> --filter arg 同步过滤语句,格式:--filter {"name":xxx}<br> --bg_num arg 数据同步线程数<br> --batch_size arg 数据传输块的大小(0-16M,默认是16M)</p>    <h3>3.使用样例</h3>    <p>一、集群模式同步</p>    <p>1、带索引实时同步</p>    <pre>  ./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 --bg_num 10 --oplog 2>log</pre>    <p>2、无索引实时同步</p>    <pre>  ./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 --no_index --bg_num 10  --oplog 2>log</pre>    <p>3、带索引全量同步</p>    <pre>  ./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 --bg_num 10 2>log</pre>    <p>4、无索引全量同步</p>    <pre>  ./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 --no_index --bg_num 10 2>log</pre>    <p>说明:</p>    <pre>  <code>集群同步模式下同步除admin及local外的所有数据库,同步账号需具有创建数据库、集合、索引,以及数据插入的权限。  </code></pre>    <p>​</p>    <p>二、库模式同步</p>    <p>1、实时同步</p>    <pre>  ./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 dbname --dst_db  dbname --bg_num 10 --oplog 2>log</pre>    <p>2、指定目的端库名实时同步</p>    <pre>  ./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 dbname --dst_db  newname --bg_num 10 --oplog 2>log</pre>    <p>3、全量同步</p>    <pre>  ./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 dbname --dst_db  dbname --bg_num 10  2>log</pre>    <p>4、指定目的端库名全量同步</p>    <pre>  ./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 dbname --dst_db  newname --bg_num 10 2>log</pre>    <p>说明:</p>    <p>​ --no_index参数控制是否同步索引</p>    <p>三、集合模式同步</p>    <p>1、实时同步</p>    <pre>  ./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 dbname --dst_db  dbname --coll collname --dst_coll collname --bg_num 10 --oplog 2>log</pre>    <p>2、指定目的端集合名实时同步</p>    <pre>  ./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 dbname --dst_db  dbname --coll collname --dst_coll newname --bg_num 10 --oplog 2>log</pre>    <p>3、全量同步</p>    <pre>  ./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 dbname --dst_db  dbname --coll collname --dst_coll collname --bg_num 10 2>log</pre>    <p>4、指定目的端集合名全量同步</p>    <pre>  ./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 dbname --dst_db  dbname --coll collname --dst_coll newname --bg_num 10 2>log</pre>    <p>5、指定查询条件的同步</p>    <pre>  ./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 dbname --dst_db  dbname --coll collname --dst_coll collname --filter {"name":xxx} --bg_num 10 --oplog 2>log</pre>    <p>四、oplog模式同步</p>    <p>1、实时同步</p>    <pre>  ./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 --dst_op_ns sync.oplog --bg_num 10 --oplog 2>log</pre>    <p>2、全量同步</p>    <pre>  ./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 --dst_op_ns sync.oplog --bg_num 10 2>log</pre>    <p>3、指定时间戳范围的同步</p>    <pre>  ./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 --dst_op_ns sync.oplog --bg_num 10 --op_start 1477812001,1 --op_end 1477812002,888 2>log</pre>    <h2>4.性能测试数据</h2>    <h3>测试前提</h3>    <ol>     <li> <p>ping延迟:<br> 程序执行机 ---> 源端 :约1.5ms<br> 程序执行机 ---> 目的端:约1.5ms<br> 源端 ---> 目的端:约1.5ms</p> </li>     <li> <p>文档数:36,400,000</p> </li>     <li>数据大小:1.09GB</li>    </ol>    <h3>测试结论</h3>    <p>耗时:379s<br> QPS:10w</p>    <p><em>说明:采用多线程可以增加数据同步速度,但这受限于MongoDB的写入速度</em></p>    <h2>感谢</h2>    <p>mongosync的主要用法和一些实现是参考 <a href="/misc/goto?guid=4959733731255840478" rel="nofollow,noindex">https://github.com/dumingyou/mongo-tools</a> 项目的, 在此真诚的感谢mongo-tools的作者。</p>    <p> </p>    <p> </p>    <p> </p>