? ? ? ? canal是阿里巴巴開(kāi)源的mysql數(shù)據(jù)庫(kù)binlog的增量訂閱&消費(fèi)組件徘跪。當(dāng)前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x
基于日志增量訂閱和消費(fèi)的業(yè)務(wù)包括
1、數(shù)據(jù)庫(kù)鏡像
2厨钻、數(shù)據(jù)庫(kù)實(shí)時(shí)備份
3饮潦、索引構(gòu)建和實(shí)時(shí)維護(hù)(拆分異構(gòu)索引燃异、倒排索引等)
4、業(yè)務(wù) cache 刷新
5继蜡、帶業(yè)務(wù)邏輯的增量數(shù)據(jù)處理
項(xiàng)目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:部署模塊鲫剿。通過(guò)該模塊提供的CanalLauncher來(lái)啟動(dòng)canal server
server模塊:canal服務(wù)器端鳄逾。核心接口為CanalServer
instance模塊:一個(gè)server有多個(gè)instance。每個(gè)instance都會(huì)模擬成一個(gè)mysql實(shí)例的slave灵莲。instance模塊有四個(gè)核心組成部分:parser模塊雕凹、sink模塊、store模塊政冻,meta模塊枚抵。核心接口為CanalInstance
parser模塊:數(shù)據(jù)源接入,模擬slave協(xié)議和master進(jìn)行交互明场,協(xié)議解析汽摹。parser模塊依賴于dbsync、driver模塊苦锨。
driver模塊和dbsync模塊:從這兩個(gè)模塊的artifactId(canal.parse.driver逼泣、canal.parse.dbsync),就可以看出來(lái)舟舒,這兩個(gè)模塊實(shí)際上是parser模塊的組件拉庶。事實(shí)上parser 是通過(guò)driver模塊與mysql建立連接,從而獲取到binlog秃励。由于原始的binlog都是二進(jìn)制流氏仗,需要解析成對(duì)應(yīng)的binlog事件,這些binlog事件對(duì)象都定義在dbsync模塊中夺鲜,dbsync 模塊來(lái)自于淘寶的tddl(分布式數(shù)據(jù)庫(kù)中間件)皆尔。
sink模塊:parser和store鏈接器,進(jìn)行數(shù)據(jù)過(guò)濾币励,加工慷蠕,分發(fā)的工作。核心接口為CanalEventSink
store模塊:數(shù)據(jù)存儲(chǔ)榄审。核心接口為CanalEventStore
meta模塊:增量訂閱&消費(fèi)信息管理器砌们,核心接口為CanalMetaManager,主要用于記錄canal消費(fèi)到的mysql binlog的位置
工作原理
MySQL主備復(fù)制原理
1搁进、MySQL master 將數(shù)據(jù)變更寫(xiě)入二進(jìn)制日志( binary log, 其中記錄叫做二進(jìn)制日志事件binary log events浪感,可以通過(guò) show binlog events 進(jìn)行查看)
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 請(qǐng)求,開(kāi)始推送 binary log 給 slave (即 canal )
3、canal 解析 binary log 對(duì)象(原始為 byte 流)
canal各個(gè)模塊依賴
? ? ? ? 通過(guò)deployer模塊婶熬,啟動(dòng)一個(gè)canal-server尸诽,一個(gè)cannal-server內(nèi)部包含多個(gè)instance性含,每個(gè)instance都會(huì)偽裝成一個(gè)mysql實(shí)例的slave芝发。client與server之間的通信協(xié)議由protocol模塊定義格郁。client在訂閱binlog信息時(shí),需要傳遞一個(gè)destination參數(shù),server會(huì)根據(jù)這個(gè)destination確定由哪一個(gè)instance為其提供服務(wù)拇厢。
參考: