移山是禧雲自研的數據遷移平臺,包含異構數據源的遷移、實時數據同步等服務。有興趣的能夠看這裏:瞭解在移山中怎麼實現異構數據源的遷移;前端
本文主要介紹移山實時數據同步服務產生的背景以及總體架構設計。java
- 能夠訪問 這裏 查看更多關於大數據平臺建設的原創文章。
禧雲各個子公司業務系統基本都是以 MySQL 爲主;node
作爲數據支持部門,須要訂閱這些業務數據作爲數據倉庫的數據源,來進行下游的數據分析。好比:git
各類離線數據 T+1 報表展現;github
實時數據大屏展現等。spring
微信小程序實時數據指標展現數據庫
像這種常見的實時數據指標大屏展現,背後可能就用到實時數據同步服務技術棧。小程序
它能夠對 MySQL 數據庫增量日誌解析,提供增量數據訂閱和消費,徹底符合咱們的使用場景。後端
canal 1.1.1版本以後,server端能夠經過簡單的配置就能將訂閱到的數據投遞到MQ中,目前支持的MQ有kafka、RocketMQ,替代老版本中必須經過手動編碼投遞的方式。微信小程序
移山的實時數據同步服務使用的MQ爲kafka,如下爲主要配置:
# 這裏寫上當前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
# 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
備註
更多關於mq的配置參數解釋,能夠訪問這裏:https://github.com/alibaba/canal/wiki/Canal-Kafka-RocketMQ-QuickStart
多個 canal server 除了 ip 和 MySQL.slaveId 設置不一樣外,其它都應該保持相同的配置。
客戶端能夠直接指定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 的數據同步任務爲例,主要步驟以下:
建立kafka的topic;
進入到canal server的bin目錄,拷貝example整個目錄,生成一個新的實例目錄;
手動修改新實例的配置文件,配置如下主要參數:
3.1 設置slaveId,不能與已經成功運行的實例設置的slaveId值重複;
3.2 要訂閱的數據庫所在的機器地址和端口號;
3.3 要訂閱的數據庫名稱;
3.4 要訂閱的表;
3.5 要訂閱的數據庫用戶名、密碼;
3.6 配置向kafka發送消息的topic;
3.7 配置kafka的partition等;
重啓canal server;
查看實例的啓動日誌,判斷實例是否啓動成功。
因爲缺少 WebUI 的支撐,所以會存在如下問題:
流程複雜:如上這些一系列的操做都是依靠腳本的方式配置完成,配置過程繁瑣,數據開發者很容易在某個環節上發生遺漏、出錯;
不利於任務的統一管理:好比誰開發的任務可能只有寫代碼的這我的比較熟悉;
不方便查看任務的運行狀況:好比已消費消息數、延遲消息數;
不利於排查問題:查看任務的執行狀況只能登錄 canal server 所在服務器去查看任務所屬實例的啓動日誌,若是遇到錯誤時,不可以快速及時的排查問題。
爲了解決上面提到的這些問題,咱們開發了移山的實時數據同步服務。
後話
在最新的穩定版:canal 1.1.4版本,迎來最重要的 WebUI 能力;
instance 能夠經過 WebUI 來建立,可是有部分使用者反饋,instance的啓動會有不穩定的狀況出現,咱們期待穩定版本能夠快速發佈。
爲何要用zookeeper集羣,能夠看這篇文章:阿里canal是怎麼經過zookeeper實現HA機制的?
kafka 具備高吞吐量、內置的分區、備份冗餘分佈式等特色,爲大規模消息處理提供了一種很好的解決方案;
前面已經提到過 canal 中間件經過簡單的配置便可支持將訂閱到的數據直接投遞到 kafka中。
爲保障數據訂閱服務的穩定性,咱們須要藉助 canal 的HA機制,實現故障自動轉移,保障服務高可用,所以咱們須要部署多個 canal server。
數據湖在禧雲的實踐是存儲集團各子公司、ISV各類各樣原始數據的大型倉庫,其中的數據可供存取、處理、分析和傳輸;
數據湖的技術解決方案,咱們選擇的是 Apache HBase。
在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。
備註:
以上三個服務均支持命令行啓動、中止。
歡迎你們關注個人微信公衆號閱讀更多文章: