首頁 > 軟體

使用mongoshake實現mongodb資料同步的操作方法

2022-02-17 13:01:32

前言

MongoShake是阿里雲以Golang語言編寫的通用平臺型服務工具,它通過讀取MongoDB的Oplog操作紀錄檔來複制MongoDB的資料以實現特定需求。

MongoShake還提供了紀錄檔資料的訂閱和消費功能,可通過SDK、Kafka、MetaQ等方式的靈活對接,適用於紀錄檔訂閱、資料中心同步、Cache非同步淘汰等場景。

官方地址:https://github.com/alibaba/MongoShake

使用場景

  • MongoDB叢集間資料的非同步複製,免去業務雙寫開銷(資料災備);
  • MongoDB叢集間資料的映象備份(當前1.0開源版本支援受限);
  • 紀錄檔離線分析;
  • 紀錄檔訂閱;
  • 資料路由,根據業務需求,結合紀錄檔訂閱和過濾機制,可以獲取關注的資料,達到資料路由的功能;
  • Cache同步。紀錄檔分析的結果,知道哪些Cache可以被淘汰,哪些Cache可以進行預載入,反向推動Cache的更新;
  • 基於紀錄檔的叢集監控

基於mongoshake可以衍生出很多的場景,從而提供給開發者在架構設計中更多更靈活、更豐富的選擇

搭建步驟

mongoshake本身的使用不難,這個參考官方的設定即可,主要是根據自身的業務場景做好組態檔中各個引數的設定即可達到目的,下面以mongoshake一個較為常用的場景,即使用mongoshanke完成2個mongodb複製叢集之間的資料同步

環境準備

  • 兩臺伺服器(阿里雲、騰訊雲伺服器或虛擬機器器)
  • 提前規劃相關的埠,並開放相關埠
  • 提前下載mongodb以及mongoshake安裝包,兩臺伺服器均上傳,本次mongodb版本為:mongodb-linux-x86_64-4.0.10.tgz,mongo-shake-v2.4.6.tar.gz

一、搭建mongodb複製集

選擇其中一臺伺服器搭建一個mongodb的單機版複製叢集,這裡使用埠號區分,啟動的時候啟動多個範例即可(有條件的可以採用3個不同的伺服器操作),按照下面的步驟依次執行即可:

1、建立3個目錄

mkdir replications
cd replications
mkdir myrs_27017 
mkdir myrs_27018
mkdir myrs_27019

2、在3個主目錄下,分別建立data和log目錄

mkdir data
cd data
mkdir db

在myrs_27017 ,myrs_27018 ,myrs_27019 3個目錄下分別做同樣的操作,

3、編輯mongod.conf組態檔

#資料儲存路徑
dbpath=/usr/local/soft/mongo/replications/myrs_27017/data/db
#紀錄檔儲存路徑
logpath=/usr/local/soft/mongo/replications/myrs_27017/log/mongod.log
#紀錄檔追加寫入
logappend=true
#複製集名稱
replSet=myrs
bind_ip=伺服器IP(雲伺服器建議使用內網IP)
#mongo預設埠
port=27017
#操作紀錄檔容量
oplogSize=10000
noprealloc=true
#開啟子程序
fork=true

在另外的myrs_27018 ,myrs_27019兩個目錄下做同樣的操作,只需要分別修改下組態檔中的埠號即可

4、使用下面的命令依次啟動3個不同的mongodb範例

進入mongodb的bin目錄下,依次執行下面的命令

./mongod -f /usr/local/soft/mongo/replications/myrs_27017/mongod.conf

./mongod -f /usr/local/soft/mongo/replications/myrs_27018/mongod.conf

./mongod -f /usr/local/soft/mongo/replications/myrs_27019/mongod.conf

看到下面的資訊表名啟動成功

5、建立叢集

使用mongo的shell登入到其中一個範例上,進入bin目錄下,執行下面命令

./mongo --host 伺服器IP(建議使用內網IP) --port 27017

6、執行數叢集資訊的初始化操作

使用下面的命令執行

cfg={ _id:"myrs", members:[ {_id:0,host:'伺服器IP:27017',priority:1}, {_id:1,host:'伺服器IP:27018',priority:2}, {_id:2,host:'伺服器IP:27019',arbiterOnly:true}]};

再使用:rs.initiate(cfg); 命令完成叢集初始化

執行完畢後,可以使用: rs.status() 檢視叢集各個節點資訊,列印出的資訊太長,就不放截圖了,注意,執行完畢之後,當前節點會出現短暫的 secondary ,但是過一會兒就變成 primary了

7、將另外兩個節點加入叢集

在上一步的視窗下依次執行下面的命令,將兩位2個mongo範例加入到叢集中

rs.add("伺服器IP:27018")  #加入第一個從節點
rs.add("伺服器IP:27019")  #加入第二個仲裁節點

8、主節點上建立資料

在上一步的視窗下,即主節點上,給某個庫的某個集合下插入一條資料

登入從節點,由於是複製叢集,主節點上的資料必然會同步到從節點上,我們可以登陸進去檢視是否同步成功

./mongo --host 伺服器IP --port 27018

可以發現沒有許可權,預設情況下,從節點是沒有讀寫許可權的,需要做設定才行,可以在上面從節點的視窗執行下面的命令即可

rs.slaveOk()

執行完畢後,再次查詢即可看到主節點上插入的資料了

以上就是基於單機模式下搭建一個偽複製叢集的全部過程,將同樣的操作在另外一個伺服器上執行即可

在另一個叢集上,我們在主節點上建立了下面一個test庫,並在庫下新建了一條資料

二、mongoshake設定

有了上面的兩個複製叢集,mongoshake的使用就變得非常簡單了,mongoshake實現資料同步的基本原理是通過監聽mongodb的oplog,解析其中的事件,從而完成資料的讀取與寫入

mongoshake常用的同步包括,增量同步、全量同步、增量+全量同步,下面從列舉了mongoshake內部實現資料同步的業務機制

1、解壓mongoshake包

2、進入解壓後的目錄編輯並設定 collector.conf檔案

下面列舉比較常用的幾個設定

#源資料庫地址,叢集多個地址中間用逗號分割
mongo_urls = mongodb://源mongoIP:27017,源mongoIP:27018,源mongoIP:27019

# 通道模式。直接資料庫到資料庫
tunnel = direct
# 此處設定通道的地址,格式與mongo_urls對齊。【目標同步地址】
tunnel.address = mongodb://目標mongoIP:27017,目標mongoIP:27018,目標mongoIP:27019
# all 表示全量+增量,full表示僅全量,incr表示僅增量
sync_mode = all 
# raw是預設的型別,其採用聚合的模式進行寫入和
# 讀取,但是由於攜帶了一些控制資訊,所以需要專門用receiver進行解析。
# json以json的格式寫入kafka,便於使用者直接讀取。
# bson以bson二進位制的格式寫入kafka。
tunnel.message = raw

其他更多高階設定柯參考官方詳細說明進行了解,比如可以同步到kafka等

3、啟動mongoshake服務

在主目錄下,執行下述命令啟動同步任務,並列印紀錄檔資訊

./collector.linux -conf=collector.conf -verbose

模擬測試

mongoshake服務啟動完畢後,這時可以去被同步的第一臺伺服器上檢查資料是否同步成功

由於我們設定的是全量+增量的方式,因此服務一旦啟動,資料就全部同步過去了

這時候再次去第二臺伺服器的test資料庫下再次新增一條資料

再返回到第一臺機器上檢查資料是否成功同步

可以看到,資料成功同步到第一臺機器上了

到此這篇關於mongoshake實現mongodb資料同步的文章就介紹到這了,更多相關mongodb資料同步內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com