通過阿里云自主研發(fā)的MongoShake開源工具,您可以實(shí)現(xiàn)MongoDB數(shù)據(jù)庫間數(shù)據(jù)的遷移與同步。本文介紹使用MongoShake遷移MongoDB Serverless實(shí)例中的數(shù)據(jù)至MongoDB副本集實(shí)例或分片集群實(shí)例的方法。

影響

  • 遷移任務(wù)會(huì)消耗源端的部分讀寫吞吐量CU。關(guān)于讀寫吞吐量CU的更多信息,請(qǐng)參見讀寫吞吐量CU
  • 遷移過程中對(duì)源端進(jìn)行讀取或?qū)懭氩僮鳎赡軙?huì)出現(xiàn)讀取或?qū)懭氩豁憫?yīng)的現(xiàn)象。

數(shù)據(jù)庫賬號(hào)的權(quán)限要求

實(shí)例 權(quán)限
源端MongoDB Serverless實(shí)例 readWrite權(quán)限。
目標(biāo)端MongoDB副本集實(shí)例或分片集群實(shí)例 readWrite權(quán)限。

數(shù)據(jù)庫賬號(hào)創(chuàng)建及授權(quán)方法請(qǐng)參見使用DMS管理MongoDB數(shù)據(jù)庫用戶

準(zhǔn)備工作

  1. 為達(dá)到最理想的同步性能,請(qǐng)確保源端MongoDB Serverless實(shí)例的網(wǎng)絡(luò)類型為專有網(wǎng)絡(luò)VPC,如果是經(jīng)典網(wǎng)絡(luò),請(qǐng)切換成專有網(wǎng)絡(luò)VPC。更多信息,請(qǐng)參見經(jīng)典網(wǎng)絡(luò)切換為專有網(wǎng)絡(luò)
  2. 創(chuàng)建作為同步目標(biāo)端的MongoDB副本集實(shí)例或分片集群實(shí)例,在創(chuàng)建的時(shí)候請(qǐng)選擇與源端MongoDB Serverless實(shí)例相同的專有網(wǎng)絡(luò)VPC,以獲取最低的網(wǎng)絡(luò)延遲。更多信息,請(qǐng)參見創(chuàng)建副本集實(shí)例創(chuàng)建分片集群實(shí)例
    說明 如果目標(biāo)端為分片集群實(shí)例,您需要為目標(biāo)端數(shù)據(jù)庫開啟分片功能并對(duì)集合設(shè)置片鍵(shardkey),設(shè)置方法請(qǐng)參見設(shè)置數(shù)據(jù)分片以充分利用Shard性能
  3. 創(chuàng)建用于運(yùn)行MongoShakeECS實(shí)例,在創(chuàng)建的時(shí)候請(qǐng)選擇與源端MongoDB Serverless實(shí)例相同的專有網(wǎng)絡(luò)VPC,以獲取最低的網(wǎng)絡(luò)延遲。更多信息,請(qǐng)參見創(chuàng)建ECS實(shí)例
  4. ECS的內(nèi)網(wǎng)IP地址加入至源端和目標(biāo)端MongoDB實(shí)例的白名單中,并確保ECS可以連接源端和目標(biāo)端MongoDB實(shí)例。 更多信息,請(qǐng)參見設(shè)置白名單
說明 如果您沒有達(dá)到上述網(wǎng)絡(luò)類型的要求,可以分別申請(qǐng)?jiān)炊撕湍繕?biāo)端MongoDB實(shí)例的公網(wǎng)連接地址,并將ECS的公網(wǎng)地址加入至源端和目標(biāo)端MongoDB實(shí)例的白名單中,通過公網(wǎng)地址進(jìn)行同步操作。更多信息,請(qǐng)參見申請(qǐng)公網(wǎng)連接地址設(shè)置白名單

操作步驟

下面以使用私網(wǎng)登錄ECS服務(wù)器(Alibaba Cloud Linux操作系統(tǒng))為例介紹遷移步驟。

  1. 登錄ECS實(shí)例,具體方法請(qǐng)參見通過密碼或密鑰認(rèn)證登錄Linux實(shí)例
  2. 執(zhí)行如下命令,下載最新版本的MongoShake程序。
    wget 最新版本MongoShake包下載地址
    示例:
    wget https://github.com/alibaba/MongoShake/releases/download/release-v2.6.4-20210414/mongo-shake-v2.6.4_2.tar.gz
    說明 示例提供的下載地址是MongoShake 2.6.4_2版本,最新版MongoShake下載地址,請(qǐng)參見MongoShake releases
  3. 執(zhí)行如下命令,解壓MongoShake程序。
    tar xvf mongoshake包文件名
    示例:
    tar xvf mongo-shake-v2.6.4_2.tar.gz
  4. 執(zhí)行如下命令,進(jìn)入collector.conf所在目錄。
    cd 配置文件collector.conf所在目錄
    示例:
    cd mongo-shake-v2.6.4
  5. 執(zhí)行如下命令,修改MongoShake的配置文件collector.conf
    vi collector.conf

    進(jìn)入vi編輯器后,輸入i。根據(jù)業(yè)務(wù)需求,參考配置文件中的字段說明修改對(duì)應(yīng)字段的值。

    關(guān)于配置文件中的如下字段,建議您按照以下內(nèi)容進(jìn)行配置。
    參數(shù) 說明 示例
    sync_mode 數(shù)據(jù)同步的方式,默認(rèn)值為incr,請(qǐng)配置為all。
    • all:執(zhí)行全量數(shù)據(jù)同步和增量數(shù)據(jù)同步。
    • full:僅執(zhí)行全量數(shù)據(jù)同步。
    • incr:僅執(zhí)行增量數(shù)據(jù)同步。
    sync_mode = all
    mongo_urls 源端MongoDB ServerLess實(shí)例的ConnectionStringURI格式連接地址。
    說明
    • 建議通過專有網(wǎng)絡(luò)地址進(jìn)行互連,以獲取最低的網(wǎng)絡(luò)延遲。
    • 關(guān)于ConnectionStringURI格式詳情請(qǐng)參見Serverless實(shí)例連接說明
    mongo_urls = mongodb://user46436397:********@dds-bpxxxxxxxx.mongodb.rds.aliyuncs.com:3717/admin
    說明 密碼中不得包含艾特(@)字符,否則會(huì)導(dǎo)致連接失敗。
    tunnel.address 目標(biāo)端MongoDB實(shí)例的ConnectionStringURI格式連接地址。
    說明
    tunnel.address = mongodb://root:****@dds-bpxxxxxxx.mongodb.rds.aliyuncs.com:3717,dds-bpxxxxxxxx.mongodb.rds.aliyuncs.com:3717/admin?replicaSet=mgset-xxxxxx
    說明 密碼中不得包含艾特(@)字符,否則會(huì)導(dǎo)致連接失敗。
    filter.ddl_enable 是否開啟DDL同步,默認(rèn)值為false,請(qǐng)配置為true。
    • true:開啟
    • false:關(guān)閉
    filter.ddl_enable = true
    full_sync.reader.collection_parallel 設(shè)置MongoShake單次最多并發(fā)拉取多少個(gè)集合,默認(rèn)值為6,請(qǐng)配置為1。 full_sync.reader.collection_parallel = 1
    full_sync.reader.write_document_parallel 設(shè)置MongoShake對(duì)單個(gè)集合寫入的并發(fā)線程數(shù),默認(rèn)值為8,請(qǐng)配置為4。 full_sync.reader.write_document_parallel = 4
    full_sync.create_index 完成同步后是否創(chuàng)建索引,請(qǐng)配置為foreground。
    • foreground:創(chuàng)建前臺(tái)索引
    • background:創(chuàng)建后臺(tái)索引
    • none:不創(chuàng)建索引
    full_sync.create_index = foreground
    incr_sync.mongo_fetch_method 配置數(shù)據(jù)庫的拉取方法,默認(rèn)值為oplog,請(qǐng)配置為change_stream。
    • oplog:從源端中拉取oplog。
    • change_stream:從源端中拉取change事件(僅支持MongoDB 4.0及以上版本,對(duì)于部分DDL的同步,僅支持庫表的創(chuàng)建、刪除和重命名)。
    incr_sync.mongo_fetch_method = change_stream
    special.source.db.flag 特殊形態(tài)支持。請(qǐng)配置為aliyun_serverless。 special.source.db.flag = aliyun_serverless

    修改完成后,按Esc鍵,輸入:wq!并按Enter。

  6. 執(zhí)行如下命令,啟動(dòng)遷移任務(wù)。
    ./collector.linux -conf=collector.conf &
    說明 由于MongoDB Serverless實(shí)例受到讀寫吞吐量CU的限制,遷移速度較慢,請(qǐng)您耐心等待。
  7. 執(zhí)行如下命令,進(jìn)入日志文件collector.log所在目錄。查看日志信息。
    cd logs
  8. 執(zhí)行如下命令,查看日志信息。
    vi collector.log
    當(dāng)日志信息中出現(xiàn)如下信息時(shí),說明全量數(shù)據(jù)遷移已完成。
    說明 如果您開啟了增量遷移,說明全量數(shù)據(jù)遷移已完成并進(jìn)入增量遷移模式。
    [2021/04/30 14:20:38 CST] [INFO] ------------------------full sync done!------------------------

    查看完成后,按Esc鍵,輸入:q并按Enter。

  9. 查看增量數(shù)據(jù)是否完成遷移。
    1. 執(zhí)行如下命令,進(jìn)入MongoShake程序的安裝目錄。
      cd MongoShake程序的安裝目錄
      示例:
      cd mongo-shake-v2.6.4
    2. 執(zhí)行如下命令,查看lsn_ckptnowtime值。
      curl -s http://127.0.0.1:9100/repl | python -m json.tool
      回顯類似如下信息,部分參數(shù)說明請(qǐng)參見字段說明
      {
          "log_size_avg": "320.00B",
          "log_size_max": "332.00B",
          "logs_get": 5,
          "logs_repl": 5,
          "logs_success": 5,
          "lsn": {
              "time": "2021-05-21 14:18:37",
              "ts": "6964624121430802437",
              "unix": 1621577917
          },
          "lsn_ack": {
              "time": "2021-05-21 14:18:37",
              "ts": "6964624121430802437",
              "unix": 1621577917
          },
          "lsn_ckpt": {
              "time": "2021-05-21 14:19:19",
              "ts": "0",
              "unix": 0
          },
          "now": {
              "time": "2021-05-21 14:19:19",
              "unix": 1621577959
          },
          "replset": "default-0",
          "tag": "$",
          "tps": 0,
          "who": "mongoshake"
      }

      當(dāng)lsn_ckptnowtime值基本相同時(shí),說明增量數(shù)據(jù)遷移已完成。

字段說明

字段 字段說明
logs_get 拉取的oplog總數(shù)。
logs_repl 嘗試寫入目標(biāo)庫的oplog總數(shù)。
logs_success 成功寫入目標(biāo)庫的oplog總數(shù)。
lsn 拉取數(shù)據(jù)的Checkpoint時(shí)間,即初始時(shí)間,當(dāng)前沒有數(shù)據(jù)寫入。
lsn_ack 成功寫入目標(biāo)庫的Checkpoint時(shí)間,該時(shí)間會(huì)隨著數(shù)據(jù)寫入變化。
lsn_ckpt 成功寫入目標(biāo)庫的Checkpoint時(shí)間,該時(shí)間已經(jīng)穩(wěn)定持久。
now 當(dāng)前時(shí)間。
replset 源端名稱。