ZooKeeper分佈式鎖淺談(一)

一.概述
  清明節的時候寫了一篇分佈式鎖概述,裏面介紹了分佈式鎖實現的幾種方式,其實那時候我一直沉迷於使用redis的悲觀鎖和樂觀鎖來實現分佈式鎖,直到一個血案的引起才讓我從新認識了redis分佈式鎖的弊端,因此才痛定思痛潛心研究Zookeeper;本身裝了三臺Centos虛擬機,搭建了ZooKeeper集羣。
二.ZooKeeper基本概念
1.前言
  ZooKeeper 是一個開源的分佈式協調服務,由雅虎建立,是 Google Chubby 的開源實現。分佈式應用程序能夠基於 ZooKeeper 實現諸如數據發佈/訂閱、負載均衡、命名服務、分佈式協調/通知、集羣管理、Master 選舉、分佈式鎖和分佈式隊列等功能。
2.ZooKeeper角色
  在 ZooKeeper 中,有三種角色:
  Leader
  Follower
  Observer
  一個 ZooKeeper 集羣同一時刻只會有一個 Leader,其餘都是 Follower 或 Observer。當Leader奔潰後會從Follower從新選舉一個出來,讀者能夠自行參考Zab協議。
3.節點介紹
  一、PERSISTENT-持久化目錄節點
  客戶端與Zookeeper斷開鏈接後,該節點依舊存在
  二、PERSISTENT_SEQUENTIAL-持久化順序編號目錄節點
  客戶端與Zookeeper斷開鏈接後,該節點依舊存在,只是Zookeeper給該節點名稱進行順序編號
  三、EPHEMERAL-臨時目錄節點
  客戶端與Zookeeper斷開鏈接後,該節點被刪除
  四、EPHEMERAL_SEQUENTIAL-臨時順序編號目錄節點
  客戶端與Zookeeper斷開鏈接後,該節點被刪除,只是Zookeeper給該節點名稱進行順序編號
三.Zookeeper分佈式鎖的實現
  Zookeeper實現分佈式鎖是經過節點和臨時順序節點來實現的:主要有一下步驟:
  1. 在構造函數裏面啓動的時候創建一個節點,假如命名爲:lock。節點類型爲持久節點(PERSISTENT)【ZooKeeper裏面的znode節點會自動同步的,並且是強一致性,建立一個節點後只有ZooKeeper集羣同步完成後算成功】
  2. 每當進程須要訪問共享資源時,會在lock節點下面創建響應的順序子節點,節點類型爲臨時順序節點(EPHEMERAL_SEQUENTIAL)
  3. 在創建子節點以後,判斷剛剛創建的子節點順序號是否爲最小節點,若是是最小節點,則能夠得到該鎖對資源進行訪問。(臨時子節點創建會自動生成一個序號的)
  4. 若是不是該節點,就得到該節點的上一順序節點,並給該節點是否存在註冊監聽事件。同時在這裏阻塞。等待監聽事件的發生。得到控制權(實現watch接口,而且重寫process方法,在process裏面實現監聽)
  5. 當完成以後,關閉ZooKeeper鏈接,進而能夠應發監聽事件,釋放該鎖(客戶端關閉ZooKeeper鏈接以後會刪除當前的臨時節點)node

下一篇將貼上代碼基於代碼進行詳細介紹。redis

相關文章
相關標籤/搜索