在前面兩篇中,我們從基本概念理解了canal是一個什麼專案,能應用於什麼場景,然後通過一個demo體驗,有了基本的體感和認識。
從這一篇開始,我們將從原始碼入手,深入學習canal的實現方式。瞭解canal相關功能的實現方式,其中有很多機制是非常值得深入瞭解的,從程式碼實現角度去學習實時資料訂閱與同步的實現與核心技術點。當然,如果要在生產中使用這個開源專案,瞭解原始碼更是必不可少,是解決問題和新特性定製的前提條件。
本文使用的版本是1.1.4,這也是筆者寫這篇部落格時的最新穩定版。
1.準備工作
下載原始碼
git clone https://github.com/alibaba/canal.git
切換到1.1.4這個tag
git checkout canal-1.1.4
或者可以關注我的原始碼註釋版本(正在不斷更新中)
https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_reading/canal
2.canal專案模組介紹
canal專案是基於maven構建的,將不同的功能模組劃分了不同的子模組。
我們可以簡單執行可執行模組deployer,也可以將模組通過maven依賴的方式,將你需要的子模組引入到你自己的專案中進行使用開發。
簡單介紹下核心模組的功能:
- deployer模組:獨立部署模組,用於canal-server的獨立啟動,包括本地配置解析、拉取遠端配置、啟動canal-server。
- server模組:canal-server的實現邏輯,一個canal-server一般是一個jvm程式。重點關注兩種canal-server的實現方式,內嵌型的canalServerEmbed和獨立使用的canalServerWithNetty。新版本中新增了直接對接mq的canal-server實現。
- instance模組:具體實時訂閱任務是由一個個instance組成的,每個canal-server中可以同時執行多個instance。instance由parser、sink、store三個重點模組組成。
- parser模組:資料來源接入,模擬slave協議和master進行互動,協議解析。parser模組依賴於dbsync、driver模組。
- sink模組:將parser抓取到的資料,進行過濾,加工,然後傳送到store模組進行儲存。核心介面為CanalEventSink。
- store模組:資料儲存模組,類似記憶體模式到訊息佇列,本質上是一個RingBuffer。核心介面為CanalEventStore。
- meta模組:增量訂閱&消費資訊管理器,核心介面為CanalMetaManager,主要用於記錄canal消費到的mysql binlog的位置
- client模組:專案最早的消費客戶端,通過將client模組引入自己的專案中,然後直接消費canal-server獲取的資料。
- client-adapter模組:1.1.x後新出的模組,可以獨立部署為canal-server的消費服務端,是一個springboot專案。通過SPI機制,能夠載入不同plugins,將消費資訊投遞到ES\hbase\rdb等下游。
- admin模組:1.1.x新出的模組,可以獨立部署為canal-server的控制檯,配置canal-server、instance相關配置,非常好用。
3.模組關聯
那這些模組之間是如何組織、如何關聯的呢?
我們從整體到區域性來看一下。
整體架構關聯,包括admin模組、server模組、client-adapter模組
1)server模組是服務端核心模組,用來拉取binlog的實時變更,然後投遞到客戶端。
2)server可以通過配置,選擇投遞到MQ,或者是啟動一個netty,讓客戶端來拉取。
3)client-adapter就是一個獨立部署到服務,可以直接拉取canal-server的訊息(或者拉取mq的訊息),轉發到對應RDS/Redis/HBase,當然,你也可以自己實現一個轉發到redis的adapter
4)admin模組是管理控制檯,可以排程canal-server組成一個個叢集實現instance的高可用、可以更改server、instance的配置資訊。
Canal-server模組區域性關係,包括deployer模組、server模組、instance模組、parser模組、sink模組、store模組、meta模組、client模組。
1)deployer模組是一個啟動模組,可以啟動canal-server。
2)一個server是一個獨立應用,是一個jvm程式,裡面可以有多個instance物件。
3)instance內包括了parser、sink、store、meta
4)parser負責獲取binlog變更,然後sink將parser獲取的binlog變更轉換為event,存入store。
5)meta是元資訊管理器
6)client模組可以內嵌入你的應用,用來消費canal-server的訊息事件。
基本上核心模組的關係就是這樣了,後續會按照模組的維度進行原始碼分析,敬請期待。
都看到最後了,原創不易,點個關注,點個贊吧~
文章持續更新,可以微信搜尋「阿丸筆記 」第一時間閱讀,回覆關鍵字【學習】有我準備的一線大廠面試資料。
知識碎片重新梳理,構建Java知識圖譜:github.com/saigu/JavaK…(歷史文章查閱非常方便)