ZooKeeper 保證了資料的強一緻性, zk叢集中任意節點(一個zkServer)上的相同znode下的資料一定是相同的。使用zookeeper可以非常簡單的實作分布式鎖,
其基本邏輯如下:
用戶端調用create()方法建立名為“locknode/lock”的節點,需要注意的是,這裡節點的建立類型需要設定為EPHEMERAL_SEQUENTIAL。
用戶端調用getChildren(“lock”)方法來擷取所有已經建立的lock節點的子節點,同時在這個節點上注冊上子節點變更通知的Watcher。
用戶端擷取到所有子節點path之後,如果發現自己在步驟1中建立的節點是所有節點中序号最小的,那麼就認為這個用戶端獲得了鎖。
如果在步驟3中發現自己并非是所有子節點中最小的,說明自己還沒有擷取到鎖,就等待,直到下次子節點變更通知的時候,再進行子節點的擷取,判斷是否擷取鎖。
釋放鎖的過程比較簡單,就是删除自己建立的那個子節點即可。
附:分布式鎖實作過程中考慮問題的思路:
1.鎖何時獨占
2.鎖何時釋放
3.鎖占有或者釋放的先後次序可能引起的問題(控制時序)
參考:
<a href="http://rdc.taobao.com/team/jm/archives/1232">ZooKeeper典型使用場景一覽</a>
<a href="http://www.cnblogs.com/zhengyun_ustc/archive/2012/11/17/topic2.html">分布式</a>