zookeeper分布式鎖原理

在講分布式鎖之前渐溶,我們先看看zookeeper的基礎(chǔ)特性辉浦,zookeeper主要是一個文件系統(tǒng)數(shù)據(jù)結(jié)構(gòu),節(jié)點可以分為以下幾類

一茎辐、節(jié)點類型

1.PERSISTENT-持久化目錄節(jié)點

當(dāng)客戶端與zookeeper斷開連接后宪郊,該節(jié)點依然存在掂恕,只要不進(jìn)行手動刪除,他將會永久存在

2.PERSISTENT_SEQUENTIAL-持久化順序編號目錄節(jié)點

和持久化目錄節(jié)點類似弛槐,但是會給該節(jié)點名稱進(jìn)行順序編號

3.EPHEMERAL-臨時目錄節(jié)點

當(dāng)客戶端與zookeeper斷開連接后懊亡,該節(jié)點會被刪除

4.EPHEMERAL_SEQUENTIAL-臨時順序編號目錄節(jié)點

和臨時目錄節(jié)點類似,但是會給該節(jié)點名稱進(jìn)行順序編號

5.Container 節(jié)點(3.5.3 版本新增)

當(dāng)只建立一個Container節(jié)點丐黄,和建立一個持久化目錄節(jié)點是一樣的斋配,但是當(dāng)Container節(jié)點,有子節(jié)點時灌闺,子節(jié)點被刪除完后艰争,該Container節(jié)點會被zookeeper自動清除,時間間隔60s桂对;

6.TTL 節(jié)點

和redis過期緩存有點類似甩卓,默認(rèn)禁用,現(xiàn)在該功能不太穩(wěn)定

創(chuàng)建節(jié)點命令

create [-s] [-e] [-c] [-t ttl] path [data] [acl]
s:順序節(jié)點
e:臨時節(jié)點
c:容器節(jié)點
t:可以給節(jié)點添加過期時間蕉斜,默認(rèn)關(guān)閉

二逾柿、監(jiān)聽機(jī)制

客戶端可以監(jiān)聽自己關(guān)系的節(jié)點,或者目錄節(jié)點宅此,或者目錄下的所有子節(jié)點
當(dāng)客戶端監(jiān)聽的對象發(fā)生刪除或者修改(有子節(jié)點被創(chuàng)建机错,或被刪除)時,會觸發(fā)相應(yīng)的事件通知到客戶端
get -w /path
針對節(jié)點監(jiān)聽父腕;當(dāng)節(jié)點觸發(fā)修改事件時弱匪,會通知到監(jiān)聽的客戶端;一旦事件觸發(fā)璧亮,則監(jiān)聽會被移除萧诫,需要根據(jù)相應(yīng)的業(yè)務(wù)來判斷,是否需要繼續(xù)監(jiān)聽枝嘶;
ls -w /path
對目錄進(jìn)行監(jiān)聽帘饶,當(dāng)該目錄下有子節(jié)點的創(chuàng)建,以及刪除群扶,則會觸發(fā)及刻;監(jiān)聽也是一次性的;
ls -R -w /path
對目錄進(jìn)行遞歸監(jiān)聽竞阐,每個目錄下的監(jiān)聽也是一次性的

三提茁、分布式鎖

了解了上面兩個特性,我們來看下zookeeper分布式鎖是怎么實現(xiàn)的馁菜;我們現(xiàn)在一般用的zookeeper客戶端是Curator,這個里面有公平鎖铃岔,非公平鎖汪疮,讀寫鎖等

1.非公平鎖

創(chuàng)建PERSISTENT(臨時目錄節(jié)點)峭火,創(chuàng)建成功則加鎖成功,其他應(yīng)用創(chuàng)建則會失敗智嚷,然后注冊一個當(dāng)前節(jié)點的監(jiān)聽卖丸,掛起線程;當(dāng)獲取鎖的應(yīng)用釋放鎖時(自己釋放或者當(dāng)前機(jī)器掛掉)盏道,刪除該臨時目錄節(jié)點稍浆,則其他監(jiān)聽的應(yīng)用則會被喚醒,再次嘗試獲取鎖猜嘱,獲取成功的繼續(xù)執(zhí)行衅枫,未獲取到鎖的應(yīng)用,則繼續(xù)監(jiān)聽朗伶,然后掛起弦撩;

2.公平鎖

非公平鎖有個弊端,就是羊群效應(yīng)论皆,當(dāng)節(jié)點被刪除時益楼,所有應(yīng)用都會被喚醒爭搶鎖,會加大服務(wù)器的壓力点晴;公平鎖感凤,在某個目錄下創(chuàng)建EPHEMERAL_SEQUENTIAL(臨時順序編號目錄節(jié)點),當(dāng)創(chuàng)建完成后粒督,獲取當(dāng)前目錄下所以節(jié)點陪竿,判斷自己節(jié)點是否是最小節(jié)點,如果是最小節(jié)點坠陈,則獲取到鎖萨惑,繼續(xù)執(zhí)行;如果不是最小節(jié)點仇矾,則監(jiān)聽上一個節(jié)點庸蔼,當(dāng)上一個節(jié)點被釋放時,再次判斷是否是最小節(jié)點贮匕;如果是姐仅,則繼續(xù)執(zhí)行;如下圖
公平鎖

3.讀寫鎖

當(dāng)應(yīng)用存在讀多寫少的場景刻盐,則公平鎖也不適用掏膏,并發(fā)量不高,則需要讀寫鎖敦锌;讀寫鎖馒疹,在鎖目錄下創(chuàng)建EPHEMERAL_SEQUENTIAL(臨時順序編號目錄節(jié)點),創(chuàng)建的節(jié)點都有標(biāo)識乙墙,是讀鎖颖变,還是寫鎖生均;當(dāng)讀鎖創(chuàng)建成功后,會獲取到當(dāng)前所有節(jié)點腥刹,如果是最小節(jié)點或者比當(dāng)前節(jié)點更小的都是讀節(jié)點马胧,則繼續(xù)執(zhí)行,如果比當(dāng)前節(jié)點小的節(jié)點中有寫節(jié)點衔峰,則監(jiān)聽該寫節(jié)點佩脊,掛起當(dāng)前線程,當(dāng)寫節(jié)點鎖被釋放時垫卤,當(dāng)前線程被喚醒威彰,獲取所有節(jié)點,再次判斷葫男;當(dāng)寫鎖創(chuàng)建成功時抱冷,判斷邏輯和公平鎖一樣,只要不是最小節(jié)點梢褐,則監(jiān)聽上一個節(jié)點旺遮,掛起當(dāng)前線程;如下圖:
讀寫鎖

三盈咳、zookeeper鎖避免的問題

加鎖成功時耿眉,出現(xiàn)網(wǎng)絡(luò)波動,客戶端立馬連接上時鱼响,導(dǎo)致客戶端應(yīng)用不知道是否加鎖成功鸣剪;所以在每次加鎖時,會加一個當(dāng)前應(yīng)用生成類型與uuid的前綴丈积,當(dāng)應(yīng)用不知道是否加鎖成功時筐骇,獲取到所以節(jié)點,判斷是否有該前綴的節(jié)點江滨,則知道是否加鎖成功铛纬,如果加鎖失敗,則重新加鎖唬滑;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末告唆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子晶密,更是在濱河造成了極大的恐慌擒悬,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稻艰,死亡現(xiàn)場離奇詭異懂牧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)尊勿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門僧凤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來用狱,“玉大人,你說我怎么就攤上這事拼弃。” “怎么了摇展?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵吻氧,是天一觀的道長。 經(jīng)常有香客問我咏连,道長盯孙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任祟滴,我火速辦了婚禮振惰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘垄懂。我一直安慰自己骑晶,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布草慧。 她就那樣靜靜地躺著桶蛔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪漫谷。 梳的紋絲不亂的頭發(fā)上仔雷,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天,我揣著相機(jī)與錄音舔示,去河邊找鬼碟婆。 笑死,一個胖子當(dāng)著我的面吹牛惕稻,可吹牛的內(nèi)容都是我干的竖共。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼缩宜,長吁一口氣:“原來是場噩夢啊……” “哼肘迎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起锻煌,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤妓布,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后宋梧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體匣沼,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年捂龄,在試婚紗的時候發(fā)現(xiàn)自己被綠了释涛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片加叁。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖唇撬,靈堂內(nèi)的尸體忽然破棺而出它匕,到底是詐尸還是另有隱情,我是刑警寧澤窖认,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布豫柬,位于F島的核電站,受9級特大地震影響扑浸,放射性物質(zhì)發(fā)生泄漏烧给。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一喝噪、第九天 我趴在偏房一處隱蔽的房頂上張望础嫡。 院中可真熱鬧,春花似錦酝惧、人聲如沸榴鼎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽檬贰。三九已至,卻和暖如春缺亮,著一層夾襖步出監(jiān)牢的瞬間翁涤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工萌踱, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留葵礼,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓并鸵,卻偏偏與公主長得像鸳粉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子园担,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355

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