MongoDB開源:mongosync:360 出品的支持 MongoDB 副本集間數據傳輸的工具

JohBEXU 7年前發布 | 50K 次閱讀 MongoDB NoSQL數據庫

一、 簡介

mongosync是由Qihoo 360公司Web平臺部基礎架構團隊開發維護的一個基于MongoDB協議,依據mongodb同步模塊代碼,深度定制的一款支持MongoDB副本集間數據傳輸的工具。目前,該工具已經在360公司內部投入使用。

   主要功能:

       1、全量數據同步

       2、實時數據同步

       3、oplog實時傳輸

二、 特點

1、版本兼容性 

? 版本支持情況如下(目前尚不支持mongos):

     后續考慮兼容3.2、3.4及更新版本 

2、開發語言

? 底層采用C++語言,效率更高,速度更快

3、多線程支持

     多線程工作的原理如下圖所示:

Imgur

 

4、支持從庫同步

    支持從庫作為復制源進行數據同步,減輕主庫壓力

5、索引同步可配置

    支持數據+索引 / 數據模式,加快數據同步速度

三、使用說明

1.安裝

  • 獲取源代碼
   $ git clone https://github.com/jacketwoo/mongosync
  • 編譯。進入mongosync目錄,執行make命令
$ make

編譯完成后,$(MONGOSYNC_ROOT)/output目錄下可以發現可執行文件(mongosync)以及配置文件(mongosync.conf)

  • 清理
   $ make clean

說明

  • 編譯過程中,如果發現缺失依賴包,請根據說明安裝相應依賴包
  • 請不要使用c++ 11編譯

2.參數說明

程序可以通過命令行及配置文件的方式運行,參數說明如下:
--help 獲取幫助信息
-c conf.file 使用conf.file配置文件啟動mongosync
--src_srv arg 源端ip及端口信息,格式:--src_srv 192.168.1.1:27017
--src_user arg 源端用戶
--src_passwd arg 源端密碼
--src_auth_db arg 源端認證庫
--src_use_mcr 強制源端使用MONGODB-CR密碼認證
--dst_srv arg 目的端ip及端口信息,格式:--src_srv 192.168.1.2:27018
--dst_user arg 目的端用戶,需要具有創建數據庫,集合,索引等操作權限
--dst_passwd arg 目的端密碼
--dst_auth_db arg 目的端認證庫
--dst_use_mcr 強制目的端使用MONGODB-CR密碼認證
--db arg 源端數據庫,默認同步除admin及local外的所有數據庫
--dst_db arg 目的端數據庫
--coll arg 源端集合,默認同步全部集合
--dst_coll arg 目的端集合
--oplog 是否同步oplog
--raw_oplog 是否只同步oplog
--op_start arg oplog同步的開始點位,格式:--op_start 1479436001,1
--op_end arg oplog同步的結束點位,格式:--op_start 1479436002,2
--dst_op_ns arg oplog同步時目的端的oplog名稱,格式:--dst_op_ns sync.oplog
--no_index 是否同步索引
--filter arg 同步過濾語句,格式:--filter {"name":xxx}
--bg_num arg 數據同步線程數
--batch_size arg 數據傳輸塊的大小(0-16M,默認是16M)

3.使用樣例

一、集群模式同步

1、帶索引實時同步

./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

2、無索引實時同步

./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

3、帶索引全量同步

./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

4、無索引全量同步

./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

說明:

集群同步模式下同步除admin及local外的所有數據庫,同步賬號需具有創建數據庫、集合、索引,以及數據插入的權限。

?

二、庫模式同步

1、實時同步

./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

2、指定目的端庫名實時同步

./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

3、全量同步

./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

4、指定目的端庫名全量同步

./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

說明:

? --no_index參數控制是否同步索引

三、集合模式同步

1、實時同步

./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

2、指定目的端集合名實時同步

./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

3、全量同步

./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

4、指定目的端集合名全量同步

./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

5、指定查詢條件的同步

./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

四、oplog模式同步

1、實時同步

./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

2、全量同步

./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

3、指定時間戳范圍的同步

./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

4.性能測試數據

測試前提

  1. ping延遲:
    程序執行機 ---> 源端 :約1.5ms
    程序執行機 ---> 目的端:約1.5ms
    源端 ---> 目的端:約1.5ms

  2. 文檔數:36,400,000

  3. 數據大小:1.09GB

測試結論

耗時:379s
QPS:10w

說明:采用多線程可以增加數據同步速度,但這受限于MongoDB的寫入速度

感謝

mongosync的主要用法和一些實現是參考 https://github.com/dumingyou/mongo-tools 項目的, 在此真誠的感謝mongo-tools的作者。

 

 

 

 本文由用戶 JohBEXU 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!