canal 作用
canal是阿里巴巴旗下的一款開(kāi)源項(xiàng)目诬辈,純Java開(kāi)發(fā)∨肯纾基于數(shù)據(jù)庫(kù)增量日志解析对省,提供增量數(shù)據(jù)訂閱&消費(fèi),目前主要支持了MySQL(也支持mariaDB)晾捏。
canal 就是一個(gè)同步增量數(shù)據(jù)的一個(gè)工具蒿涎。
canal 背景
canal [k?'n?l],譯意為水道/管道/溝渠惦辛,主要用途是基于 MySQL 數(shù)據(jù)庫(kù)增量日志解析劳秋,提供增量數(shù)據(jù)訂閱和消費(fèi)
早期阿里巴巴因?yàn)楹贾莺兔绹?guó)雙機(jī)房部署,存在跨機(jī)房同步的業(yè)務(wù)需求裙品,實(shí)現(xiàn)方式主要是基于業(yè)務(wù) trigger 獲取增量變更俗批。從 2010 年開(kāi)始,業(yè)務(wù)逐步嘗試數(shù)據(jù)庫(kù)日志解析獲取增量變更進(jìn)行同步市怎,由此衍生出了大量的數(shù)據(jù)庫(kù)增量訂閱和消費(fèi)業(yè)務(wù)岁忘。
基于日志增量訂閱和消費(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ù)處理
當(dāng)前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x
來(lái)自阿里巴巴官方介紹
canal 應(yīng)用場(chǎng)景
- 將用戶(hù)的訂單信息傳入后臺(tái)区匠。
- 后臺(tái)服務(wù)器將訂單信息保存到mysql數(shù)據(jù)庫(kù)干像。
- 又 canal 進(jìn)行監(jiān)控mysql中的寫(xiě)操作變化,將發(fā)生修改(
Insert
) 的數(shù)據(jù)寫(xiě)入到kafka - 通過(guò)
sparkStreaming
讀取Kafka中的數(shù)據(jù)驰弄,進(jìn)行計(jì)算麻汰。 - 將計(jì)算好的結(jié)果,重新寫(xiě)如到服務(wù)器中戚篙,并返回到瀏覽器五鲫。
需求
根據(jù)需求,思考如何處理岔擂?
獲取用戶(hù)的訂單信息位喂,保存入庫(kù),并且進(jìn)行實(shí)時(shí)計(jì)算(A 商品成交單數(shù)乱灵,B商品成交單數(shù)...)塑崖。
為什么要使用canal
?
通過(guò)需求了解到需要對(duì)訂單信息做計(jì)算,并且實(shí)時(shí)統(tǒng)計(jì)出每個(gè)商品的成交信息痛倚,如此時(shí)A 商品 100條规婆,B 商品 20條。這商品信息是動(dòng)態(tài)變化的,用戶(hù)每提交一次抒蚜,后臺(tái)就應(yīng)該計(jì)算出最新的商品訂單記錄掘鄙。所以需要實(shí)時(shí)進(jìn)行累加,比如又來(lái)一批商品嗡髓,其中 A商品 10條通铲,B 商品5條,C 商品10條器贩。那么展示的結(jié)果就是 A110條,B 30條朋截。C5條蛹稍。但是計(jì)算又不可能重頭開(kāi)始計(jì)算,也就是說(shuō)部服,A+B+C =145 中條數(shù)據(jù)中唆姐,再重新分A,B,C各個(gè)商品的信息。而是應(yīng)該做累加 比如上一次A商品100條再加上這次A商品的10條廓八。這樣的效率才更高奉芦。
canal
的作用
了解上面的原因之后,我們?cè)賮?lái)聊聊
canal
發(fā)揮的作用剧蹂,它可以實(shí)現(xiàn)增量同步声功,還是拿A商品舉例,第一批數(shù)據(jù)中宠叼,A商品有100條先巴,canal
便會(huì)將這批新增的數(shù)據(jù)寫(xiě)入Kafka
,再交給spark
處理冒冬。第二次又新增一批數(shù)據(jù)伸蚯,于是canal
又將監(jiān)控到新增數(shù)據(jù)寫(xiě)入到Kafka
中。依次類(lèi)推简烤,最終由spark
計(jì)算出結(jié)果返回出去剂邮。
canal 除了寫(xiě)入kafka
還能將數(shù)據(jù)寫(xiě)入到其他中間件(mysql、elasticsearch横侦、hbase等)
工作原理官網(wǎng)介紹
MySQL主備復(fù)制原理
- MySQL master 將數(shù)據(jù)變更寫(xiě)入二進(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ù)
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 流)
BinaryLog
WAL:
- hbase在做寫(xiě)操作時(shí)棵逊,先將寫(xiě)操作的命令記錄在
WAL
日志中伤疙,之后再將數(shù)據(jù)寫(xiě)入memstore
,此舉是為了在regionSerever進(jìn)程異常退出重啟后,恢復(fù)數(shù)據(jù)徒像,這種機(jī)制就叫WAL
黍特。
WAL日志
:將其稱(chēng)為寫(xiě)操作命令的備份 - NameNode在運(yùn)行期間,會(huì)將客戶(hù)端實(shí)時(shí)產(chǎn)生的元數(shù)據(jù)記錄在
edits
文件中锯蛀,在namenode
重啟的時(shí)候灭衷,將之前的fsimage
文件和edits
合并得到最新的元素?fù)?jù)。
edtis
:客戶(hù)端寫(xiě)操作命名的備份 - mysql可以開(kāi)啟
biglog
日志記錄功能旁涤,開(kāi)啟后每次向mysql
服務(wù)端發(fā)送寫(xiě)操作命令翔曲,會(huì)記錄在一種特殊的文件中,這個(gè)特殊的文件九稱(chēng)為biglog
日志劈愚。
biglog
日志:客戶(hù)端寫(xiě)操作命名的備份瞳遍,其目的也是為了服務(wù)器異常退出,恢復(fù)數(shù)據(jù)菌羽!
RelayLog
從機(jī)(slave)是如何同步主機(jī)(master)數(shù)據(jù)的呢掠械?他會(huì)啟動(dòng)兩個(gè)線(xiàn)程(I/O thread、SQL thread)注祖,
- I/O thread:復(fù)制讀取主機(jī)(master)寫(xiě)入到
binary log
新增的內(nèi)容猾蒂。并將內(nèi)容寫(xiě)入到中繼日志(relay log)
中,用于臨時(shí)緩沖的作用是晨。 - SQL thread:用于讀取
中繼日志(relay log)
的中數(shù)據(jù)肚菠,并執(zhí)行,這樣從機(jī)(slave)
就有了和主機(jī)(master)
一樣的操作了罩缴。
canal 工作原理(我個(gè)人的理解)
canal 就像是一名"間諜"案糙,它偽裝成了一個(gè)
從機(jī)(slave)
,從主機(jī)(master)
中騙取數(shù)據(jù)靴庆。拿到數(shù)據(jù)之后时捌,再對(duì)數(shù)據(jù)進(jìn)行解析,比如·只要新增的數(shù)據(jù)或者刪除或修改的數(shù)據(jù)炉抒,并將數(shù)據(jù)重新進(jìn)行包裝奢讨,將數(shù)據(jù)重新寫(xiě)入到第三方服務(wù)中(mysql、Kafka焰薄、es等)拿诸。