[Canal] Canal簡介

? ? ? ? canal是阿里巴巴開源的mysql數(shù)據(jù)庫binlog的增量訂閱&消費組件。當前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x

基于日志增量訂閱和消費的業(yè)務包括

1、數(shù)據(jù)庫鏡像

2、數(shù)據(jù)庫實時備份

3、索引構建和實時維護(拆分異構索引、倒排索引等)

4、業(yè)務 cache 刷新

5、帶業(yè)務邏輯的增量數(shù)據(jù)處理

項目github地址為:https://github.com/alibaba/canal

官方wiki:https://github.com/alibaba/canal/wiki

本文使用的版本是tag1.0.24

cancal模塊劃分


common模塊:主要是提供了一些公共的工具類和接口。

client模塊:canal的客戶端。核心接口為CanalConnector

example模塊:提供client模塊使用案例。

protocol模塊:client和server模塊之間的通信協(xié)議

deployer:部署模塊。通過該模塊提供的CanalLauncher來啟動canal server

server模塊:canal服務器端。核心接口為CanalServer

instance模塊:一個server有多個instance。每個instance都會模擬成一個mysql實例的slave。instance模塊有四個核心組成部分:parser模塊、sink模塊、store模塊,meta模塊。核心接口為CanalInstance

parser模塊:數(shù)據(jù)源接入,模擬slave協(xié)議和master進行交互,協(xié)議解析。parser模塊依賴于dbsync、driver模塊。

driver模塊和dbsync模塊:從這兩個模塊的artifactId(canal.parse.driver、canal.parse.dbsync),就可以看出來,這兩個模塊實際上是parser模塊的組件。事實上parser 是通過driver模塊與mysql建立連接,從而獲取到binlog。由于原始的binlog都是二進制流,需要解析成對應的binlog事件,這些binlog事件對象都定義在dbsync模塊中,dbsync 模塊來自于淘寶的tddl(分布式數(shù)據(jù)庫中間件)。

sink模塊:parser和store鏈接器,進行數(shù)據(jù)過濾,加工,分發(fā)的工作。核心接口為CanalEventSink

store模塊:數(shù)據(jù)存儲。核心接口為CanalEventStore

meta模塊:增量訂閱&消費信息管理器,核心接口為CanalMetaManager,主要用于記錄canal消費到的mysql binlog的位置

工作原理

MySQL主備復制原理


1、MySQL master 將數(shù)據(jù)變更寫入二進制日志( binary log, 其中記錄叫做二進制日志事件binary log events,可以通過 show binlog events 進行查看)

2、MySQL slave 將 master 的 binary log events 拷貝到它的中繼日志(relay log)

3、MySQL slave 重放 relay log 中事件,將數(shù)據(jù)變更反映它自己的數(shù)據(jù)

canal 工作原理


1、canal 模擬 MySQL slave 的交互協(xié)議,偽裝自己為 MySQL slave ,向 MySQL master 發(fā)送dump 協(xié)議

2、MySQL master 收到 dump 請求,開始推送 binary log 給 slave (即 canal )

3、canal 解析 binary log 對象(原始為 byte 流)

canal各個模塊依賴


? ? ? ? 通過deployer模塊,啟動一個canal-server,一個cannal-server內部包含多個instance,每個instance都會偽裝成一個mysql實例的slave。client與server之間的通信協(xié)議由protocol模塊定義。client在訂閱binlog信息時,需要傳遞一個destination參數(shù),server會根據(jù)這個destination確定由哪一個instance為其提供服務。

參考:

https://github.com/alibaba/canal

http://www.tianshouzhi.com/api/tutorials/canal/380

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容