可以訪問 這里 查看更多關於 消息中間件 的原創文章。
移山是禧雲自研的數據遷移平台,包含異構數據源的遷移、實時數據同步等服務。有興趣的可以看這里:了解在移山中怎么實現異構數據源的遷移;
本文主要介紹移山實時數據同步服務產生的背景以及整體架構設計。
- 可以訪問 這里 查看更多關於大數據平台建設的原創文章。
一. 移山實時數據同步服務產生背景
-
禧雲各個子公司業務系統基本都是以 MySQL 為主;
-
做為數據支持部門,需要訂閱這些業務數據做為數據倉庫的數據源,來進行下游的數據分析。比如:
-
各種離線數據 T+1 報表展示;
-
實時數據大屏展示等。
-
微信小程序實時數據指標展示
像這種常見的實時數據指標大屏展示,背后可能就用到實時數據同步服務技術棧。
二. 移山實時數據同步服務使用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
備注
-
更多關於mq的配置參數解釋,可以訪問這里:https://github.com/alibaba/canal/wiki/Canal-Kafka-RocketMQ-QuickStart
-
多個 canal server 除了 ip 和 MySQL.slaveId 設置不同外,其它都應該保持相同的配置。
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 的數據同步任務為例,主要步驟如下:
-
創建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的啟動會有不穩定的情況出現,我們期待穩定版本可以快速發布。
五. 移山實時數據同步服務整體架構
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。
-
備注:
-
以上三個服務均支持命令行啟動、停止。
更多文章
歡迎訪問更多關於消息中間件的原創文章:
- RabbitMQ系列之消息確認機制
- RabbitMQ系列之RPC實現
- RabbitMQ系列之怎么確保消息不丟失
- RabbitMQ系列之基本概念和基本用法
- RabbitMQ系列之部署模式
- RabbitMQ系列之單機模式安裝
關注微信公眾號
歡迎大家關注我的微信公眾號閱讀更多關於 消息隊列 的原創文章: