上饒建設(shè)培訓(xùn)中心網(wǎng)站網(wǎng)絡(luò)營(yíng)銷公司熱線電話
文章目錄
- 一、canal 概述
- 1.2 什么是 canal
- 2.3 canal 的所有組件
- 二、canal 工作原理
- 2.1 MySQL 主備復(fù)制原理
- 2.2 canal 工作原理
- 三、canal.server 組件
- 3.1 canal.server 的架構(gòu)
- 3.2 instance 模塊組成部分
- 四、canal.client 組件
- 4.1 類設(shè)計(jì)
- 4.2 server/clinet 交互協(xié)議
- 4.3 使用案例
- 參考資料
一、canal 概述
1.2 什么是 canal
canal 主要用途是基于 MySQL 數(shù)據(jù)庫(kù)增量日志解析,提供增量數(shù)據(jù)訂閱和消費(fèi)。
基于日志增量訂閱和消費(fèi)的業(yè)務(wù)包括
- 數(shù)據(jù)庫(kù)鏡像
- 數(shù)據(jù)庫(kù)實(shí)時(shí)備份
- 索引構(gòu)建和實(shí)時(shí)維護(hù)(拆分異構(gòu)索引、倒排索引等)
- 業(yè)務(wù) cache 刷新
- 帶業(yè)務(wù)邏輯的增量數(shù)據(jù)處理
2.3 canal 的所有組件
Canal 的架構(gòu)包括多個(gè)組件,每個(gè)組件承擔(dān)不同的功能,以便實(shí)現(xiàn)高效的數(shù)據(jù)同步和管理。
- canal.server:負(fù)責(zé)處理與數(shù)據(jù)源的連接和數(shù)據(jù)的采集。作為 Canal 的核心,server 組件解析從數(shù)據(jù)庫(kù)獲取的變更數(shù)據(jù),并將其推送到下游。它支持多種數(shù)據(jù)源,并管理多個(gè)實(shí)例的運(yùn)行。
- canal.client:提供了與 canal server 進(jìn)行通信的客戶端接口??蛻舳丝梢杂嗛喬囟ǖ臄?shù)據(jù)變更事件,并根據(jù)業(yè)務(wù)需求處理這些事件。Canal 客戶端通常用于集成其他應(yīng)用程序,支持多種編程語(yǔ)言,如 Java、Python 等,方便用戶進(jìn)行數(shù)據(jù)消費(fèi)和業(yè)務(wù)邏輯處理。
- canal-admin :為 canal 提供整體配置管理和節(jié)點(diǎn)運(yùn)維功能的組件,具有友好的 Web UI 操作界面。通過(guò) canal-admin,用戶可以輕松管理 Canal 實(shí)例的配置、監(jiān)控實(shí)例狀態(tài)、執(zhí)行增量訂閱等操作。它降低了運(yùn)維的復(fù)雜性,使得更多用戶能夠快速、安全地操作 canal。
二、canal 工作原理
canal 的工作原理主要是將自己偽裝成數(shù)據(jù)庫(kù)主從同步中的從節(jié)點(diǎn)。
2.1 MySQL 主備復(fù)制原理
- MySQL master 將數(shù)據(jù)變更寫入二進(jìn)制日志( binary log, 其中記錄叫做二進(jìn)制日志事件binary log events,可以通過(guò) show binlog events 進(jìn)行查看)
- MySQL slave 將 master 的 binary log events 拷貝到它的中繼日志(relay log)
- MySQL slave 重放 relay log 中事件,將數(shù)據(jù)變更反映它自己的數(shù)據(jù)
具體細(xì)節(jié)查看 MySQL 日志:主從復(fù)制是怎么實(shí)現(xiàn)
2.2 canal 工作原理
- canal 模擬 MySQL slave 的交互協(xié)議,偽裝自己為 MySQL slave ,向 MySQL master 發(fā)送dump 協(xié)議
- MySQL master 收到 dump 請(qǐng)求,開(kāi)始推送 binary log 給 slave (即 canal )
- canal 解析 binary log 對(duì)象(原始為 byte 流)
三、canal.server 組件
3.1 canal.server 的架構(gòu)
在 canal.server 的架構(gòu)中,server 和 instance 是兩個(gè)重要的概念:
- server:代表一個(gè) Canal 運(yùn)行實(shí)例,通常對(duì)應(yīng)于一個(gè) JVM。它負(fù)責(zé)管理和運(yùn)行整個(gè) Canal 服務(wù),處理數(shù)據(jù)源的接入、數(shù)據(jù)解析、過(guò)濾和存儲(chǔ)等任務(wù)。
- instance:對(duì)應(yīng)于一個(gè)數(shù)據(jù)隊(duì)列,負(fù)責(zé)從特定數(shù)據(jù)源(如 MySQL)讀取變更數(shù)據(jù)并將其推送到下游消費(fèi)者。每個(gè) instance 獨(dú)立運(yùn)行,管理特定的數(shù)據(jù)庫(kù)連接和數(shù)據(jù)流。
在實(shí)際使用中,通常在 /canal/conf/canal.properties
中定義全局的環(huán)境和配置,而在 /canal/conf/example/instance.properties
中定義具體的數(shù)據(jù)庫(kù)實(shí)例的連接信息和監(jiān)控規(guī)則。
注意,example 是一個(gè) instance 的名字。
3.2 instance 模塊組成部分
instance 模塊是其核心部分,負(fù)責(zé)與數(shù)據(jù)源的交互和數(shù)據(jù)的處理:
-
EventParser:負(fù)責(zé)數(shù)據(jù)源的接入,模擬從主數(shù)據(jù)庫(kù)(master)到從數(shù)據(jù)庫(kù)(slave)的協(xié)議交互,并解析從數(shù)據(jù)庫(kù)獲取的變更數(shù)據(jù)。
-
EventSink:充當(dāng)解析器(Parser)和存儲(chǔ)(Store)之間的連接器,負(fù)責(zé)數(shù)據(jù)的過(guò)濾、加工和分發(fā)。它將解析后的數(shù)據(jù)根據(jù)配置進(jìn)行處理后,推送到目標(biāo)存儲(chǔ)或下游消費(fèi)者。
-
EventStore:負(fù)責(zé)將數(shù)據(jù)持久化存儲(chǔ),維護(hù)已消費(fèi)的數(shù)據(jù)記錄,以支持增量訂閱和歷史數(shù)據(jù)的查詢。
-
MetaManager:負(fù)責(zé)增量訂閱和消費(fèi)信息的管理,維護(hù)每個(gè)實(shí)例的狀態(tài),包括已消費(fèi)的位置、訂閱信息等。
四、canal.client 組件
本節(jié)內(nèi)容來(lái)源于 ClientAPI · alibaba/canal Wiki
4.1 類設(shè)計(jì)
canal client 提供了一套接口,用于與 canal server 進(jìn)行交互和數(shù)據(jù)消費(fèi)。以下是主要 API 組件的詳細(xì)說(shuō)明
ClientIdentity
: canal client 和 server 交互之間的身份標(biāo)識(shí)。CanalConnector
:提供兩種 connector 的實(shí)現(xiàn)。SimpleCanalConnector
針對(duì)簡(jiǎn)單的 IP 直連模式,適合單個(gè)客戶端與單個(gè)服務(wù)器的連接。ClusterCanalConnector
針對(duì)多 IP 的模式,可依賴CanalNodeAccessStrategy
進(jìn)行 failover 控制。
CanalNodeAccessStrategy
:提供提供兩種 failover 的實(shí)現(xiàn)。SimpleNodeAccessStrategy
針對(duì)給定的初始 IP 列表進(jìn)行故障轉(zhuǎn)移選擇,適用于簡(jiǎn)單的連接場(chǎng)景。ClusterNodeAccessStrategy
基于 Zookeeper 上的集群節(jié)點(diǎn)動(dòng)態(tài)選擇正在運(yùn)行的 canal server,適用于更復(fù)雜的分布式環(huán)境。
ClientRunningMonitor/ClientRunningListener/ClientRunningData
: client running 相關(guān)控制,主要為解決 client 自身的 failover 機(jī)制。
4.2 server/clinet 交互協(xié)議
4.3 使用案例
具體使用案例查看 ClientExample · alibaba/canal Wiki
參考資料
Home · alibaba/canal Wiki
Canal——原理架構(gòu)及應(yīng)用場(chǎng)景 - 曹偉雄 - 博客園