成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

基于 Zookeeper 的分布式鎖實現(xiàn)

邱勇 / 2320人閱讀

摘要:不過比較膚淺,為了進一步加深對的認識,我利用空閑時間編寫了本篇文章對應(yīng)的基于的分布式鎖實現(xiàn)。不過我所編寫的分布式鎖還是比較簡陋的,實現(xiàn)的也不夠優(yōu)美,僅僅是個練習(xí),僅供參考使用。好了,題外話就說到這里,接下來我們就來聊聊基于的分布式鎖實現(xiàn)。

1. 背景

最近在學(xué)習(xí) Zookeeper,在剛開始接觸 Zookeeper 的時候,完全不知道 Zookeeper 有什么用。且很多資料都是將 Zookeeper 描述成一個“類 Unix/Linux 文件系統(tǒng)”的中間件,導(dǎo)致我很難將類 Unix/Linux 文件系統(tǒng)的 Zookeeper 和分布式應(yīng)用聯(lián)系在一起。后來在粗讀了《ZooKeeper 分布式過程協(xié)同技術(shù)詳解》和《從Paxos到Zookeeper 分布式一致性原理與實踐》兩本書,并動手寫了一些 CURD demo 后,初步對 Zookeeper 有了一定的了解。不過比較膚淺,為了進一步加深對 Zookeeper 的認識,我利用空閑時間編寫了本篇文章對應(yīng)的 demo -- 基于 Zookeeper 的分布式鎖實現(xiàn)。通過編寫這個分布式鎖 demo,使我對 Zookeeper 的 watcher 機制、Zookeeper 的用途等有了更進一步的認識。不過我所編寫的分布式鎖還是比較簡陋的,實現(xiàn)的也不夠優(yōu)美,僅僅是個練習(xí),僅供參考使用。好了,題外話就說到這里,接下來我們就來聊聊基于 Zookeeper 的分布式鎖實現(xiàn)。

2. 獨占鎖和讀寫鎖的實現(xiàn)

在本章,我將分別說明獨占鎖和讀寫鎖詳細的實現(xiàn)過程,并配以相應(yīng)的流程圖幫助大家了解實現(xiàn)的過程。這里先說說獨占鎖的實現(xiàn)。

2.1 獨占鎖的實現(xiàn)

獨占鎖又稱排它鎖,從字面意思上很容易理解他們的用途。即如果某個操作 O1 對訪問資源 R1 的過程加鎖,在操作 O1 結(jié)束對資源 R1 訪問前,其他操作不允許訪問資源 R1。以上算是對獨占鎖的簡單定義了,那么這段定義在 Zookeeper 的“類 Unix/Linux 文件系統(tǒng)”的結(jié)構(gòu)中是怎樣實現(xiàn)的呢?在鎖答案前,我們先看張圖:

圖1 獨占鎖的 Zookeeper 節(jié)點結(jié)構(gòu)

如上圖,對于獨占鎖,我們可以將資源 R1 看做是 lock 節(jié)點,操作 O1 訪問資源 R1 看做創(chuàng)建 lock 節(jié)點,釋放資源 R1 看做刪除 lock 節(jié)點。這樣我們就將獨占鎖的定義對應(yīng)于具體的 Zookeeper 節(jié)點結(jié)構(gòu),通過創(chuàng)建 lock 節(jié)點獲取鎖,刪除節(jié)點釋放鎖。詳細的過程如下:

多個客戶端競爭創(chuàng)建 lock 臨時節(jié)點

其中某個客戶端成功創(chuàng)建 lock 節(jié)點,其他客戶端對 lock 節(jié)點設(shè)置 watcher

持有鎖的客戶端刪除 lock 節(jié)點或該客戶端崩潰,由 Zookeeper 刪除 lock 節(jié)點

其他客戶端獲得 lock 節(jié)點被刪除的通知

重復(fù)上述4個步驟,直至無客戶端在等待獲取鎖了

上面即獨占鎖具體的實現(xiàn)步驟,理解起來并不復(fù)雜,這里不再贅述。

圖2 獲取獨占鎖流程圖

2.2 讀寫鎖的實現(xiàn)

說完獨占鎖的實現(xiàn),這節(jié)來說說讀寫鎖的實現(xiàn)。讀寫鎖包含一個讀鎖和寫鎖,操作 O1 對資源 R1 加讀鎖,且獲得了鎖,其他操作可同時對資源 R1 設(shè)置讀鎖,進行共享讀操作。如果操作 O1 對資源 R1 加寫鎖,且獲得了鎖,其他操作再對資源 R1 設(shè)置不同類型的鎖都會被阻塞??偨Y(jié)來說,讀鎖具有共享性,而寫鎖具有排他性。那么在 Zookeeper 中,我們可以用怎樣的節(jié)點結(jié)構(gòu)實現(xiàn)上面的操作呢?

圖3 讀寫鎖的 Zookeeper 節(jié)點結(jié)構(gòu)

在 Zookeeper 中,由于讀寫鎖和獨占鎖的節(jié)點結(jié)構(gòu)不同,讀寫鎖的客戶端不用再去競爭創(chuàng)建 lock 節(jié)點。所以在一開始,所有的客戶端都會創(chuàng)建自己的鎖節(jié)點。如果不出意外,所有的鎖節(jié)點都能被創(chuàng)建成功,此時鎖節(jié)點結(jié)構(gòu)如圖3所示。之后,客戶端從 Zookeeper 端獲取 /share_lock 下所有的子節(jié)點,并判斷自己能否獲取鎖。如果客戶端創(chuàng)建的是讀鎖節(jié)點,獲取鎖的條件(滿足其中一個即可)如下:

自己創(chuàng)建的節(jié)點序號排在所有其他子節(jié)點前面

自己創(chuàng)建的節(jié)點前面無寫鎖節(jié)點

如果客戶端創(chuàng)建的是寫鎖節(jié)點,由于寫鎖具有排他性。所以獲取鎖的條件要簡單一些,只需確定自己創(chuàng)建的鎖節(jié)點是否排在其他子節(jié)點前面即可。

不同于獨占鎖,讀寫鎖的實現(xiàn)稍微復(fù)雜一下。讀寫鎖有兩種實現(xiàn)方式,各有異同,接下來就來說說這兩種實現(xiàn)方式。

讀寫鎖的第一種實現(xiàn)

第一種實現(xiàn)是對 /share_lock 節(jié)點設(shè)置 watcher,當(dāng) /share_lock 下的子節(jié)點被刪除時,未獲取鎖的客戶端收到 /share_lock 子節(jié)點變動的通知。在收到通知后,客戶端重新判斷自己創(chuàng)建的子節(jié)點是否可以獲取鎖,如果失敗,再次等待通知。詳細流程如下:

所有客戶端創(chuàng)建自己的鎖節(jié)點

從 Zookeeper 端獲取 /share_lock 下所有的子節(jié)點,并對 /share_lock 節(jié)點設(shè)置 watcher

判斷自己創(chuàng)建的鎖節(jié)點是否可以獲取鎖,如果可以,持有鎖。否則繼續(xù)等待

持有鎖的客戶端刪除自己的鎖節(jié)點,其他客戶端收到 /share_lock 子節(jié)點變動的通知

重復(fù)步驟2、3、4,直至無客戶端在等待獲取鎖了

上述步驟對于的流程圖如下:

圖4 獲取讀寫鎖實現(xiàn)1流程圖

上面獲取讀寫鎖流程并不復(fù)雜,但卻存在性能問題。以圖3所示鎖節(jié)點結(jié)構(gòu)為例,第一個鎖節(jié)點 host1-W-0000000001 被移除后,Zookeeper 會將 /share_lock 子節(jié)點變動的通知分發(fā)給所有的客戶端。但實際上,該子節(jié)點變動通知除了能影響 host2-R-0000000002 節(jié)點對應(yīng)的客戶端外,分發(fā)給其他客戶端則是在做無用功,因為其他客戶端即使獲取了通知也無法獲取鎖。所以這里需要做一些優(yōu)化,優(yōu)化措施是讓客戶端只在自己關(guān)心的節(jié)點被刪除時,再去獲取鎖。

讀寫鎖的第二種實現(xiàn)

在了解讀寫鎖第一種實現(xiàn)的弊端后,我們針對這一實現(xiàn)進行優(yōu)化。這里客戶端不再對 /share_lock 節(jié)點進行監(jiān)視,而只對自己關(guān)心的節(jié)點進行監(jiān)視。還是以圖3的鎖節(jié)點結(jié)構(gòu)進行舉例說明,host2-R-0000000002 對應(yīng)的客戶端 C2 只需監(jiān)視 host1-W-0000000001 節(jié)點是否被刪除即可。而 host3-W-0000000003 對應(yīng)的客戶端 C3 只需監(jiān)視 host2-R-0000000002 節(jié)點是否被刪除即可,只有 host2-R-0000000002 節(jié)點被刪除,客戶端 C3 才能獲取鎖。而 host1-W-0000000001 節(jié)點被刪除時,產(chǎn)生的通知對于客戶端 C3 來說是無用的,即使客戶端 C3 響應(yīng)了通知也沒法獲取鎖。這里總結(jié)一下,不同客戶端關(guān)心的鎖節(jié)點是不同的。如果客戶端創(chuàng)建的是讀鎖節(jié)點,那么客戶端只需找出比讀鎖節(jié)點序號小的最后一個的寫鎖節(jié)點,并設(shè)置 watcher 即可。而如果是寫鎖節(jié)點,則更簡單,客戶端僅需對該節(jié)點的上一個節(jié)點設(shè)置 watcher 即可。詳細的流程如下:

所有客戶端創(chuàng)建自己的鎖節(jié)點

從 Zookeeper 端獲取 /share_lock 下所有的子節(jié)點

判斷自己創(chuàng)建的鎖節(jié)點是否可以獲取鎖,如果可以,持有鎖。否則對自己關(guān)心的鎖節(jié)點設(shè)置 watcher

持有鎖的客戶端刪除自己的鎖節(jié)點,某個客戶端收到該節(jié)點被刪除的通知,并獲取鎖

重復(fù)步驟4,直至無客戶端在等待獲取鎖了

上述步驟對于的流程圖如下:

圖5 獲取讀寫鎖實現(xiàn)2流程圖

3. 寫在最后

本文較為詳細的描述了基于 Zookeeper 分布式鎖的實現(xiàn)過程,并根據(jù)上面描述的兩種鎖原理實現(xiàn)了較為簡單的分布式鎖 demo,代碼放在了 github 上,需要的朋友自取。因為這只是一個簡單的 demo,代碼實現(xiàn)的并不優(yōu)美,僅供參考。最后,如果你覺得文章還不錯的話,歡迎點贊。如果有不妥的地方,也請?zhí)岢鰜?,我會虛心改之。好了,最后祝大家生活愉快,再見?/p> 參考

《ZooKeeper 分布式過程協(xié)同技術(shù)詳解》

《從Paxos到Zookeeper 分布式一致性原理與實踐》

本文在知識共享許可協(xié)議 4.0 下發(fā)布,轉(zhuǎn)載請注明出處
作者:coolblog
為了獲得更好的分類閱讀體驗,
請移步至本人的個人博客:http://www.coolblog.xyz


本作品采用知識共享署名-非商業(yè)性使用-禁止演繹 4.0 國際許可協(xié)議進行許可。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/70252.html

相關(guān)文章

  • 布式機制原理及實現(xiàn)方式

    摘要:分布式鎖實現(xiàn)方式前言目前幾乎很多大型網(wǎng)站及應(yīng)用都是分布式部署的,分布式場景中的數(shù)據(jù)一致性問題一直是一個比較重要的話題?;跀?shù)據(jù)庫實現(xiàn)分布式鎖基于緩存等實現(xiàn)分布式鎖基于實現(xiàn)分布式鎖。 前言 分布式鎖,是控制分布式系統(tǒng)之間同步訪問共享資源的一種方式 在分布式系統(tǒng)中,常常需要協(xié)調(diào)他們的動作。如果不同的系統(tǒng)或是同一個系統(tǒng)的不同主機之間共享了一個或一組資源,那么訪問這些資源的時候,往往需要互斥...

    yacheng 評論0 收藏0
  • 布式機制原理及實現(xiàn)方式

    摘要:分布式鎖實現(xiàn)方式前言目前幾乎很多大型網(wǎng)站及應(yīng)用都是分布式部署的,分布式場景中的數(shù)據(jù)一致性問題一直是一個比較重要的話題?;跀?shù)據(jù)庫實現(xiàn)分布式鎖基于緩存等實現(xiàn)分布式鎖基于實現(xiàn)分布式鎖。 前言 分布式鎖,是控制分布式系統(tǒng)之間同步訪問共享資源的一種方式 在分布式系統(tǒng)中,常常需要協(xié)調(diào)他們的動作。如果不同的系統(tǒng)或是同一個系統(tǒng)的不同主機之間共享了一個或一組資源,那么訪問這些資源的時候,往往需要互斥...

    Travis 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<