實時數據同步服務(canal+kafka)的架構設計

 

  1. 移山是禧雲自研的數據遷移平臺,包含異構數據源的遷移、實時數據同步等服務。有興趣的能夠看這裏:瞭解在移山中怎麼實現異構數據源的遷移前端

  2. 本文主要介紹移山實時數據同步服務產生的背景以及總體架構設計。java

  3. 能夠訪問 這裏 查看更多關於大數據平臺建設的原創文章。

一. 移山實時數據同步服務產生背景

  • 禧雲各個子公司業務系統基本都是以 MySQL 爲主;node

  • 作爲數據支持部門,須要訂閱這些業務數據作爲數據倉庫的數據源,來進行下游的數據分析。好比:git

    • 各類離線數據 T+1 報表展現;github

    • 實時數據大屏展現等。spring

微信小程序實時數據指標展現數據庫

像這種常見的實時數據指標大屏展現,背後可能就用到實時數據同步服務技術棧。小程序

二. 移山實時數據同步服務使用canal中間件

1. 使用場景符合

它能夠對 MySQL 數據庫增量日誌解析,提供增量數據訂閱和消費,徹底符合咱們的使用場景。後端

2. 支持將訂閱到的數據投遞到kafka

canal 1.1.1版本以後,server端能夠經過簡單的配置就能將訂閱到的數據投遞到MQ中,目前支持的MQ有kafka、RocketMQ,替代老版本中必須經過手動編碼投遞的方式。微信小程序

移山的實時數據同步服務使用的MQ爲kafka,如下爲主要配置:

修改canal.properties中配置
# 這裏寫上當前canal server所在機器的ip
canal.ip = 10.200.*.109
# register ip to zookeeper(這裏寫上當前canal server所在機器的ip)
canal.register.ip = 10.200.*.109
# 指定註冊的zk集羣地址
canal.zkServers =10.200.*.109:2181,10.200.*.110:2181
 
# tcp, kafka, RocketMQ(設置serverMode模式,這個配置很是關鍵,咱們設置爲kafka)
canal.serverMode = kafka
 
# 這個demo就是conf目錄裏的實例
canal.destinations = demo
# HA模式必須使用該xml,須要將相關數據寫入zookeeper,保證數據集羣共享
canal.instance.global.spring.xml = classpath:spring/default-instance.xml
 
# 這裏設置 kafka集羣地址(其它關於mq的配置參數能夠根據實際狀況設置)
canal.mq.servers = 10.200.*.108:9092,10.200.*.111:9092
修改demo.properties中配置
# canal假裝的MySQL slave的編號,不能與MySQL數據庫和其餘的slave重複
# canal.instance.MySQL.slaveId=1003
# 按需修改爲本身的數據庫信息
# position info(須要訂閱的MySQL數據庫地址)
canal.instance.master.address=10.200.*.109:3306
 
# 這裏配置要訂閱的數據庫,數據庫的用戶名和密碼
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
canal.instance.defaultDatabaseName =
 
# 設置要訂閱的topic名稱
canal.mq.topic=demo
 
# 設置訂閱散列模式的分區數
canal.mq.partitionsNum=3

 

備註

3.支持帶cluster模式的客戶端連接,保障服務高可用

  • 客戶端能夠直接指定zookeeper地址、instance name,canal client 會自動從zookeeper中的running節點,獲取當前canal server服務的工做節點,而後與其創建連接;

  • 其它canal server節點則作爲Standby狀態,若是當前active節點發生故障,能夠自動完成failover切換。

對canal 的高可用(HA機制)想了解更多,能夠查看這篇文章。

三. 移山實時數據同步流程圖

實時數據同步服務流程圖(摘自《禧雲數芯大數據平臺技術白皮書》)以下:

總結

  • canal server 訂閱業務系統的 MySQL 數據庫產生的 bin log;

  • canal server 將訂閱到的 bin log 投遞至 kafka 指定的topic裏;

  • kafka 消費端拿到消息,根據實際的數據使用場景,將數據再寫入 Hbase 或 MySQL,或直接作實時分析。

四. 建立一個實時數據同步任務的主要步驟

以建立一個數據訂閱類型爲 HBase 的數據同步任務爲例,主要步驟以下:

  1. 建立kafka的topic;

  2. 進入到canal server的bin目錄,拷貝example整個目錄,生成一個新的實例目錄;

  3. 手動修改新實例的配置文件,配置如下主要參數:

    • 3.1 設置slaveId,不能與已經成功運行的實例設置的slaveId值重複;

    • 3.2 要訂閱的數據庫所在的機器地址和端口號;

    • 3.3 要訂閱的數據庫名稱;

    • 3.4 要訂閱的表;

    • 3.5 要訂閱的數據庫用戶名、密碼;

    • 3.6 配置向kafka發送消息的topic;

    • 3.7 配置kafka的partition等;

  4. 重啓canal server;

  5. 查看實例的啓動日誌,判斷實例是否啓動成功。

存在的問題

因爲缺少 WebUI 的支撐,所以會存在如下問題:

  • 流程複雜:如上這些一系列的操做都是依靠腳本的方式配置完成,配置過程繁瑣,數據開發者很容易在某個環節上發生遺漏、出錯;

  • 不利於任務的統一管理:好比誰開發的任務可能只有寫代碼的這我的比較熟悉;

  • 不方便查看任務的運行狀況:好比已消費消息數、延遲消息數;

  • 不利於排查問題:查看任務的執行狀況只能登錄 canal server 所在服務器去查看任務所屬實例的啓動日誌,若是遇到錯誤時,不可以快速及時的排查問題。

怎麼解決問題

爲了解決上面提到的這些問題,咱們開發了移山的實時數據同步服務。

後話

  • 在最新的穩定版:canal 1.1.4版本,迎來最重要的 WebUI 能力;

  • instance 能夠經過 WebUI 來建立,可是有部分使用者反饋,instance的啓動會有不穩定的狀況出現,咱們期待穩定版本能夠快速發佈。

五. 移山實時數據同步服務總體架構

1. 所需集羣環境

zookeeper集羣

爲何要用zookeeper集羣,能夠看這篇文章:阿里canal是怎麼經過zookeeper實現HA機制的?

kafka集羣
  • kafka 具備高吞吐量、內置的分區、備份冗餘分佈式等特色,爲大規模消息處理提供了一種很好的解決方案;

  • 前面已經提到過 canal 中間件經過簡單的配置便可支持將訂閱到的數據直接投遞到 kafka中。

canal server集羣

爲保障數據訂閱服務的穩定性,咱們須要藉助 canal 的HA機制,實現故障自動轉移,保障服務高可用,所以咱們須要部署多個 canal server。

hbase集羣
  • 數據湖在禧雲的實踐是存儲集團各子公司、ISV各類各樣原始數據的大型倉庫,其中的數據可供存取、處理、分析和傳輸;

  • 數據湖的技術解決方案,咱們選擇的是 Apache HBase。

2. 移山實時數據同步架構設計

架構圖

canal server端
  • 在canal server 的多個節點上手工建立、運行instance;

備註:

  • 咱們在配置instance相關參數時,不指定具體的數據庫,這樣該instance能夠訂閱到該MySQL節點上的全部數據庫,而後在移山建立同步任務時再指定具體要訂閱的表。

移山

前端採用 Vue.js + Element UI,後端使用 SpringBoot 開發:

  • 前端工程

    • 負責提供建立實時同步任務所需的 WebUI;

    • 提供豐富的任務運行監控功能。

  • 後端工程

    • 負責前端工程的數據接口,會記錄目標表(實時同步任務訂閱到的數據最終存儲的目的地)的各類元數據信息。

備註:

  • 若是要建立的同步任務將數據存儲至MySQL,則須要提早人工干預建立MySQL表(MySQL數據庫由DBA統一管理);

  • 若是要建立的同步任務將數據存儲至Hbase,則在移山建立任務時,由後臺自動建立Hbase表。

變形金剛

處理訂閱數據存儲的java工程,分爲三個可單獨部署的模塊:

  • canal client服務

    • canal 客戶端,從 canal server 拿到數據,並將數據投遞至kafka。

  • kafkaToHbase服務

    • kafka 消費端,負責將接收的消息進行轉化處理,處理後的數據存儲至Hbase。

  • kafkaToMySQL服務

    • kafka 消費端,負責將接收的消息進行轉化處理,處理後的數據存儲至MySQL。

備註:

  • 以上三個服務均支持命令行啓動、中止。

關注微信公衆號

歡迎你們關注個人微信公衆號閱讀更多文章:

相關文章
相關標籤/搜索