系列
canal源碼解析(2)—位點(diǎn)的實(shí)現(xiàn)
前言
????首先,這個(gè)文章系列主要是講canal的,毫無疑問,對(duì)吧。那么在開始閱讀這個(gè)系列之前,我希望真正有興趣的同學(xué)一定要先去閱讀canal的官方文檔,沒有什么比這個(gè)更權(quán)威了。這篇文章的內(nèi)容其實(shí)也就是摘錄自官網(wǎng)的一些文檔。
? ? 其次,本人對(duì)mysql的了解不是特別多,所以純粹是介紹canal這個(gè)工具的大概功能,細(xì)節(jié)還需要各位各自去研究。
? ? 最后,向我們公司的吳大神和莊大神致敬。
canal的工作原理
說明
? ? 上面圖片內(nèi)容摘自canal的官方wiki,其實(shí)通過這個(gè)圖我們明白了canal是通過模擬成master的slave來完成數(shù)據(jù)的同步的,其他后續(xù)需要考慮的問題就局限在Canal系統(tǒng)本身了。所以后面應(yīng)該會(huì)針對(duì)Canal內(nèi)部系統(tǒng)進(jìn)行分析。
canal-server架構(gòu)
說明
? ? Canal的Server端本身根據(jù)配置啟動(dòng)了很多個(gè)Instance對(duì)象,所謂的Instance對(duì)象就是模擬的數(shù)據(jù)庫(kù)slave和master進(jìn)行連接,換句話說就是假設(shè)canal同時(shí)成為N個(gè)數(shù)據(jù)庫(kù)的slave,那么就會(huì)有N個(gè)Instance實(shí)例。
? ? 每個(gè)Instance內(nèi)部包含5個(gè)組件(圖中只包含了4個(gè),估計(jì)另外一個(gè)沒有實(shí)現(xiàn)的原因),分別是eventParser、eventSink、eventStore、metaManager、alarmHandler。其中同步的數(shù)據(jù)流是按照eventParser->eventSink->eventStore進(jìn)行傳輸?shù)模?dāng)然eventStore是重點(diǎn)因?yàn)樗鎯?chǔ)了所有從mysql同步過來的數(shù)據(jù)(數(shù)據(jù)結(jié)構(gòu)很有意思,后面會(huì)介紹),metaManager主要是和zookeeper打交道的,用于記錄位點(diǎn)的元信息。
canal數(shù)據(jù)流
說明
? ? Parser負(fù)責(zé)負(fù)責(zé)同步mysql的數(shù)據(jù),sink負(fù)責(zé)進(jìn)行數(shù)據(jù)處理并保存到store當(dāng)中,這也是我剛才提交的數(shù)據(jù)流,也就說canal的instance里面的三個(gè)組件是按照上圖進(jìn)行數(shù)據(jù)流傳輸?shù)摹?/p>
EventStore設(shè)計(jì)
說明:
? ? EventStore采用內(nèi)存環(huán)裝的設(shè)計(jì)來保存消息,這里面的提交的Disruptor有興趣可以去看下,這個(gè)東西號(hào)稱無鎖隊(duì)列,性能杠杠的。
? ? EventStore的3個(gè)下標(biāo)分別是put/get/ack,其中put代表同步寫入數(shù)據(jù)的下標(biāo),get代表同步獲取的數(shù)據(jù)的下標(biāo),ack代表確認(rèn)數(shù)據(jù)的下標(biāo),這三者的關(guān)系是put>=get>=ack。
canal-server內(nèi)部設(shè)計(jì)
說明:
? ? canal-server內(nèi)部其實(shí)包含兩個(gè)server,其中按照server-client模式部署的場(chǎng)景下CanalServerWithNetty負(fù)責(zé)和client進(jìn)行交互,CanalServerWithEmbeded負(fù)責(zé)給CanalServerWithNetty提供服務(wù)。
? ? 當(dāng)然我們公司某超大神也直接通過CanalServerWithEmbeded實(shí)現(xiàn)了一把獨(dú)立部署的模式,我抽空會(huì)向他進(jìn)行請(qǐng)教。
server-client交互設(shè)計(jì)
說明
? ? 1、其實(shí)在非獨(dú)立部署下,canal是以server端和client端存在的,server端主要負(fù)責(zé)同步mysql消息,client負(fù)責(zé)訪問server端消費(fèi)消息,當(dāng)然中間會(huì)有一些高可用,這個(gè)后面到其他章節(jié)會(huì)有詳細(xì)講解。
canal整體架構(gòu)
說明
? ? 一圖勝千言,這個(gè)圖詳細(xì)的涵蓋了canal的系統(tǒng)架構(gòu),consumer其實(shí)就是client端。
canal部署模式
說明
? ? 這個(gè)圖很好的詮釋了canal的工作過程,放在最后算壓軸吧,圖來自互聯(lián)網(wǎng)。
最后說說
? ? 最后想說說為什么對(duì)canal比較感興趣,首先這個(gè)東西在我們公司應(yīng)用的比較多,其次我們公司的莊大神和吳大神分別采用兩種模式在使用這個(gè)canal,每次當(dāng)他們提起這個(gè)我就覺得無地自容,因?yàn)樽约簩?duì)這個(gè)東西一竅不通,然后就通過閑暇時(shí)間整理一些文章出來,加深自己的印象,當(dāng)然這個(gè)最后也會(huì)有一個(gè)專欄叫做canal。