Zookeeper分布式鎖和佇列

2021-08-30 15:15:18 字數 956 閱讀 9301

1.分布式鎖

分布式鎖,這個主要得益於zookeeper為我們保證了資料的強一致性。鎖服務可以分為兩類,乙個是保持獨佔,另乙個是控制時序。

所謂保持獨佔,就是所有試圖來獲取這個鎖的客戶端,最終只有乙個可以成功獲得這把鎖。通常的做法是把zk上的乙個znode看作是一把鎖,通過 create znode的方式來實現。所有客戶端都去建立 /distribute_lock 節點,最終成功建立的那個客戶端也即擁有了這把鎖。

控制時序,就是所有檢視來獲取這個鎖的客戶端,最終都是會被安排執行,只是有個全域性時序了。做法和上面基本類似,只是這裡 /distribute_lock 已經預先存在,客戶端在它下面建立臨時有序節點(這個可以通過節點的屬性控制:createmode.ephemeral_sequential來指定)。zk的父節點(/distribute_lock)維持乙份sequence,保證子節點建立的時序性,從而也形成了每個客戶端的全域性時序。

2.分布式佇列

佇列方面,簡單地講有兩種,一種是常規的先進先出佇列,另一種是要等到佇列成員聚齊之後的才統一按序執行。對於第一種先進先出佇列,和分布式鎖服務中的控制時序場景基本原理一致,這裡不再贅述。

第二種佇列其實是在fifo佇列的基礎上作了乙個增強。通常可以在 /queue 這個znode下預先建立乙個/queue/num 節點,並且賦值為n(或者直接給/queue賦值n),表示佇列大小,之後每次有佇列成員加入後,就判斷下是否已經到達佇列大小,決定是否可以開始執行了。這種用法的典型場景是,分布式環境中,乙個大任務task a,需要在很多子任務完成(或條件就緒)情況下才能進行。這個時候,凡是其中乙個子任務完成(就緒),那麼就去 /tasklist 下建立自己的臨時時序節點(createmode.ephemeral_sequential),當 /tasklist 發現自己下面的子節點滿足指定個數,就可以進行下一步按序進行處理了。

zookeeper實現分布式鎖和分布式佇列

圖1zookeeper實現分布式鎖的常見方式如圖一所示 每個客戶端想拿到乙個對於 lock下面的鎖就在 lock下面建立乙個零時有序節點,建立完成後判斷是不是當前第乙個節點,如果是就為獲得鎖,釋放鎖就把剛建立的節點刪掉,如果建立的鎖不是當前第乙個就監聽上乙個節點,如果上乙個節點被刪除就說明獲得鎖,同...

zookeeper分布式鎖

方案1 演算法思路 利用名稱唯一性,加鎖操作時,只需要所有客戶端一起建立 test lock節點,只有乙個建立成功,成功者獲得鎖。解鎖時,只需刪除 test lock節點,其餘客戶端再次進入競爭建立節點,直到所有客戶端都獲得鎖。特點 這種方案的正確性和可靠性是zookeeper機制保證的,實現簡單。...

zookeeper分布式鎖

zookeeper節點有4個型別 1.持久型 2.瞬時型 3.持久自動排序型 4.瞬時自動排序型 分布式鎖利用的就是zookeeper中瞬時自動排序型節點特性。一 瞬時自動排序節點 瞬時特點為,當客戶端斷開連線的時候,該節點自動消除。自動排序則為,如果節點名字重複,則自動在該節點名字後新增數字,該數...