基於Zookeeper的分佈式鎖

zookeeper中幾個關於節點的有趣的性質:html

  1. 有序節點:假如當前有一個父節點爲/lock,咱們能夠在這個父節點下面建立子節點;zookeeper提供了一個可選的有序特性,例如咱們能夠建立子節點「/lock/node-」而且指明有序,那麼zookeeper在生成子節點時會根據當前的子節點數量自動添加整數序號,也就是說若是是第一個建立的子節點,那麼生成的子節點爲/lock/node-0000000000,下一個節點則爲/lock/node-0000000001,依次類推。
  2. 臨時節點:客戶端能夠創建一個臨時節點,在會話結束或者會話超時後,zookeeper會自動刪除該節點。
  3. 事件監聽:在讀取數據時,咱們能夠同時對節點設置事件監聽,當節點數據或結構變化時,zookeeper會通知客戶端。當前zookeeper有以下四種事件:1)節點建立;2)節點刪除;3)節點數據修改;4)子節點變動。

 

zookeeper實現分佈式鎖的步驟:java

  1. 客戶端鏈接zookeeper,並在/lock下建立臨時的有序的子節點,第一個客戶端對應的子節點爲/lock/lock-0000000000,第二個爲/lock/lock-0000000001,以此類推。
  2. 客戶端獲取/lock下的子節點列表,判斷本身建立的子節點是否爲當前子節點列表中序號最小的子節點,若是是則認爲得到鎖,不然監聽恰好在本身以前一位的子節點刪除消息,得到子節點變動通知後重復此步驟直至得到鎖;
  3. 執行業務代碼;
  4. 完成業務流程後,刪除對應的子節點釋放鎖。

 

Curator 二次封裝zk,提供的zookeeper分佈式鎖實現。node

    經過 acquire,release 方法搞定。分佈式

 

http://www.dengshenyu.com/java/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F/2017/10/23/zookeeper-distributed-lock.html?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.ioui

 

https://mp.weixin.qq.com/s/GtiYmuKruS2V1oMxIDt0VQhtm

 

Znode節點均可以設置關聯的數據。Zookeeper爲了保證高吞吐和低延遲,在內存中維護了這個樹狀的目錄結構,這種特性使得Zookeeper不能用於存放大量的數據,每一個節點的存放數據上限爲1M。事件

有序性是zookeeper中很是重要的一個特性,全部的更新都是全局有序的,每一個更新都有一個惟一的時間戳,這個時間戳稱爲zxid(Zookeeper Transaction Id)。而讀請求只會相對於更新有序,也就是讀請求的返回結果中會帶有這個zookeeper最新的zxid。內存

相關文章
相關標籤/搜索