canal 高可用介紹(4)

系列

canal 組件介紹(1)

canal 啟動介紹(2)

canal 數(shù)據(jù)消費(fèi)介紹(3)

canal 高可用介紹(4)

canal源碼解析(2)—位點(diǎn)的實(shí)現(xiàn)



概述

????這篇文章的目的是為了講清楚canal的HA機(jī)制轨帜,至于什么是HA機(jī)制直接套用canal官網(wǎng)原話兴泥,因?yàn)槲易哉J(rèn)為沒法描述的更好。而我直接從代碼的角度去分析如何實(shí)現(xiàn)HA的坏瘩,其實(shí)也就是zookeeper的分布式鎖的使用方法磕瓷。

? ? 摘錄自官網(wǎng)的一段原話:

????canal的HA分為兩部分,canal server和canal client分別有對應(yīng)的ha實(shí)現(xiàn):

????canal server: 為了減少對mysql dump的請求编振,不同server上的instance要求同一時間只能有一個處于running棉姐,其他的處于standby狀態(tài)。

????canal client: 為了保證有序性庵楷,一份instance同一時間只能由一個canal client進(jìn)行g(shù)et/ack/rollback操作罢艾,否則客戶端接收無法保證有序。


canal HA 架構(gòu)圖

canal-ha說明圖

說明

? ? 圖片來自官網(wǎng)的剪切嫁乘,講述的很清楚昆婿,就不再多說什么了,后面會基于這個圖從代碼角度展開講解蜓斧。


canal server HA

????canal server的HA是其實(shí)我覺得從我自己的理解應(yīng)該分為兩個角度去講解仓蛆,一個是在啟動的時候搶占并負(fù)責(zé)啟動提供服務(wù),另外一個是在發(fā)生fail-over后搶占并負(fù)責(zé)啟動提供服務(wù)挎春。

? ? 能把這兩個過程講解清楚我覺得就夠了看疙,就能理解server的HA機(jī)制了,也基本了解了如何通過zookeeper去實(shí)現(xiàn)互斥鎖直奋。

? ? 最后我們需要問自己的一個問題能庆,就是發(fā)生HA切換的時候狀態(tài)數(shù)據(jù)同步在兩個切換的server之間進(jìn)行同步呢,很簡單脚线,因?yàn)槲覀兊臄?shù)據(jù)都是記錄在zookeeper上的搁胆。


server 啟動HA

? ? server在啟動過程中,通過以下幾步來實(shí)現(xiàn)搶占服務(wù)啟動邮绿,入口類在CanalController渠旁。

????1、對臨時節(jié)點(diǎn)(/otter/canal/destinations/xxxx/running)進(jìn)行監(jiān)聽船逮。

????2顾腊、通過創(chuàng)建臨時節(jié)點(diǎn)來搶占鎖,成功就提供服務(wù)挖胃。

????3杂靶、搶占鎖成功后啟動embededCanalServer開始提供服務(wù)。

????4酱鸭、創(chuàng)建的臨時節(jié)點(diǎn)內(nèi)部將自己的ip+port暴露出去給client使用吗垮。


start-ha-1

說明

? ? 啟動服務(wù)的入口函數(shù),別看是runningMonitor凛辣,其實(shí)是內(nèi)部負(fù)責(zé)啟動canal instance實(shí)例的抱既。


start-ha-2

說明

? ? 這里最重要的一個點(diǎn)就是對canal的臨時節(jié)點(diǎn)監(jiān)控用于在fail-over的時候能夠感知到并及時啟動stand-by的canal server提供服務(wù)。


start-ha-3

說明

? ? 負(fù)責(zé)創(chuàng)建臨時節(jié)點(diǎn)來確認(rèn)自己是否能夠提供服務(wù)扁誓,這其實(shí)通過zookeeper的特性來實(shí)現(xiàn)的防泵。


start-ha-4

說明

????真正啟動canal instance的過程蚀之,負(fù)責(zé)同步mysql的數(shù)據(jù)到canal instance。


server fail-over ha

????server 在fail-over過程能夠及時發(fā)現(xiàn)并完成切換的原因是通過zookeeper的watch機(jī)制來實(shí)現(xiàn)捷泞,如果watch的節(jié)點(diǎn)消失了那么其他監(jiān)聽的canal server都能感知到并發(fā)起新一輪的搶占并提供服務(wù)足删。

? ? 需要區(qū)分兩個zookeeper事件,分別是節(jié)點(diǎn)內(nèi)容變更事件锁右、節(jié)點(diǎn)刪除事件失受,下面有具體說明。

? ? 關(guān)鍵字:zookeeper的watch機(jī)制咏瑟,通知拂到,重新?lián)屨肌?/p>

fail-over-1

說明

? ? 這里區(qū)分了兩種情況,節(jié)點(diǎn)內(nèi)容變更事件码泞、節(jié)點(diǎn)本身消失事件兄旬。對于這兩種情況區(qū)分簡單區(qū)分一下進(jìn)行說明。我估計(jì)很多人跟我的疑惑一樣余寥,為啥要區(qū)分這兩個事件呢领铐,其實(shí)我的猜測是如果節(jié)點(diǎn)刪除了說明這個服務(wù)停止了跟mysql的同步也就結(jié)束了,但是如果節(jié)點(diǎn)內(nèi)容變更了宋舷,可能因?yàn)槠渌恍┰蛐髂欤┤缥覀兪謩有薷膠k節(jié)點(diǎn)內(nèi)容之類的,這個時候我們需要處理連接釋放的過程祝蝠。

? ? 節(jié)點(diǎn)本身消失處理是handleDataDeleted函數(shù)內(nèi)部的操作音诈,可以看出來其實(shí)就做一件事情,重新開始新一輪的搶占绎狭,initRunning就是我們剛剛講的搶占邏輯改艇,可以翻看start-ha-3這個圖片。唯一的區(qū)別是節(jié)點(diǎn)消失事件前提供服務(wù)的如果是自身就具有優(yōu)先搶占的權(quán)利坟岔,否則就隨機(jī)進(jìn)行個delay操作避免同時大面積并發(fā)搶占。

? ? 我們重點(diǎn)關(guān)注下節(jié)點(diǎn)內(nèi)容變更的事件吧摔桦,之所以需要額外關(guān)注這個事件是因?yàn)橹虚g涉及到如果是如果變更前是自身就需要釋放連接資源社付。


資源釋放過程

canal server release - 1

說明

? ? 在收到節(jié)點(diǎn)內(nèi)容變更事件后就開始進(jìn)入資源釋放過程

canal server release - 2

說明

? ? 停止canal的embededCanalserver的服務(wù),結(jié)束從mysql的數(shù)據(jù)同步邻耕。


canal client HA

? ? 整體來說鸥咖,canal client的HA和canal server的HA機(jī)制是一模一樣的,它的實(shí)現(xiàn)邏輯其實(shí)在創(chuàng)建cluster client的時候用的封裝zookeeper的客戶端兄世,然后zookeeper的客戶端去檢測canal server節(jié)點(diǎn)內(nèi)容的變化并重新初始化連接而已啼辣。


client cluster -1

說明

? ? 這個地方很明顯看出來,我們首先連接的zookeeper御滩,原因應(yīng)該很清楚鸥拧,因?yàn)槲覀冃枰獜膠ookeeper獲取提供服務(wù)的canal server的地址党远,在/otter/canal/destinations/destination/running節(jié)點(diǎn)去獲取。


client cluster-2
client cluster-3

說明

? ? 這部分其實(shí)就是client和zookeeper交互的部分富弦,負(fù)責(zé)實(shí)時感知節(jié)點(diǎn)變化并重新初始化連接沟娱,保證client端的HA。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末腕柜,一起剝皮案震驚了整個濱河市济似,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌盏缤,老刑警劉巖砰蠢,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異唉铜,居然都是意外死亡台舱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門打毛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柿赊,“玉大人,你說我怎么就攤上這事幻枉∨錾” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵熬甫,是天一觀的道長胰挑。 經(jīng)常有香客問我,道長椿肩,這世上最難降的妖魔是什么瞻颂? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮郑象,結(jié)果婚禮上贡这,老公的妹妹穿的比我還像新娘。我一直安慰自己厂榛,他們只是感情好盖矫,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著击奶,像睡著了一般辈双。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上柜砾,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天湃望,我揣著相機(jī)與錄音,去河邊找鬼。 笑死证芭,一個胖子當(dāng)著我的面吹牛瞳浦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播檩帐,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼术幔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了湃密?” 一聲冷哼從身側(cè)響起诅挑,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎泛源,沒想到半個月后拔妥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了编丘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片外恕。...
    茶點(diǎn)故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡入客,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤筝家,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站邻辉,受9級特大地震影響溪王,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜值骇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一莹菱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸凶杖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至部逮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嫂易,已是汗流浹背兄朋。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人颅和。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓傅事,卻偏偏與公主長得像,于是被迫代替她去往敵國和親峡扩。 傳聞我的和親對象是個殘疾皇子蹭越,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容