canal 是阿里巴巴在 2012 年開源的基於 MySQL 資料庫增量日誌解析,提供增量數據訂閱&消費。基於 canal 的準實時日誌訂閱消費,你可以完成類似的業務:
同步到另一個資料庫,比如異地容災、同步離線庫等 構建多級索引 (賣家和買家各自分庫索引) 實時構建搜尋引擎,比如同步給 elasticsearch 業務 cache 刷新 價格變化等重要業務消息項目開源地址:https://github.com/alibaba/canal。經歷了 4 個月的蟄伏,canal 1.1 系列的 1.1.3 正式發布了,主要圍繞自建的生態能力,完善消息投遞到 MQ 和 Client Adapter 做了比較多的測試和修復工作,具體的變更日誌:
功能新增支持 MySQL 8.0 新的 caching_sha2_password 認證協議
支持 Azure MySQL 的認證協議
canal 投遞 MQ 消息【MQ投遞】
canal 內置的客戶端【ClientAdapter】
小需求 & bugfix
解決 server 單核伺服器無法接收數據的問題 #1605
修復 TableMeta TSDB 支持 utf8mb4 #1550
修復 MQ 消息發送時非 flatMessage 模式出現數據重複 #1551
修復 Kafka 配置為分區模式時出現數據 #1636
修復 fastsql 的幾個 DDL 解析問題 #1306 #1546 #1626
修復 rdb-adapter 同步的類型轉化、空指針、大小寫、DDL 同步等問題 #1313 #1338 #1341 #1408 #1433
修復投遞 MQ 模式,Canal server HA 在切換後不生效 #1229
修復 es-adapter 資料庫主鍵類型錯誤 #1559
修復 charset 編碼不存在 #1662
更多詳情,可以參見 https://github.com/alibaba/canal/releases
canal 工作原理原理相對比較簡單:
canal 模擬 MySQL slave 的交互協議,偽裝自己為 MySQL slave,向 MySQL master 發送 dump 協議 MySQL master 收到 dump 請求,開始推送 binary log 給 slave(也就是 canal) canal 解析 binary log 對象(原始為 byte 流)canal 整體架構說明:
server 代表一個 canal 運行實例,對應於一個 jvm instance 對應於一個數據隊列 (1個 server 對應 1..n 個 instance)instance 模塊:
eventParser (數據源接入,模擬 slave 協議和 master 進行交互,協議解析) eventSink (Parser 和 Store 連結器,進行數據過濾、加工、分發的工作) eventStore (數據存儲) metaManager (增量訂閱&消費信息管理器)整個 canal-server 可以有兩種交付方式
client/server 架構,可以獨立部署一個 canal server 進程去抓取 MySQL binlog,然後業務代碼裡啟動1個或多個 canal client 來做消費。優點:開箱即用,運維簡單
嵌入式架構,允許業務代碼裡啟動 canal server 直接來做消費。優點:方便和業務系統做集成
canal 相比於其他開源的 binlog 產品,比如 open-replicator、mysql-binlog-connector-java、Tungsten Replicator、maxwell 有比較多的優勢:
高可用性。canal 支持 MySQL 主備、server 和 client 多個層面的高可用機制,可以作為生產使用
跨語言。canal 的通訊協議選擇了 protobuf 3.6.1,client 層面目前支持 java、c#、go 多個語言的客戶端
整體性。canal 支持增量數據投遞到 MQ,同時引入 Client Adpater 擴展機制,目前支持 rdb、elasticsearch、hbase 等目標的寫入
來源 DRDS樂園