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.節點介紹
  1、PERSISTENT-持久化目錄節點
  客戶端與Zookeeper斷開連接后,該節點依舊存在
  2、PERSISTENT_SEQUENTIAL-持久化順序編號目錄節點
  客戶端與Zookeeper斷開連接后,該節點依舊存在,只是Zookeeper給該節點名稱進行順序編號
  3、EPHEMERAL-臨時目錄節點
  客戶端與Zookeeper斷開連接后,該節點被刪除
  4、EPHEMERAL_SEQUENTIAL-臨時順序編號目錄節點
  客戶端與Zookeeper斷開連接后,該節點被刪除,只是Zookeeper給該節點名稱進行順序編號
三.Zookeeper分布式鎖的實現
  Zookeeper實現分布式鎖是通過節點和臨時順序節點來實現的:主要有一下步驟:
  1. 在構造函數里面啟動的時候建立一個節點,假如命名為:lock。節點類型為持久節點(PERSISTENT)【ZooKeeper里面的znode節點會自動同步的,而且是強一致性,創建一個節點后只有ZooKeeper集群同步完成后算成功】
  2. 每當進程需要訪問共享資源時,會在lock節點下面建立響應的順序子節點,節點類型為臨時順序節點(EPHEMERAL_SEQUENTIAL)
  3. 在建立子節點之后,判斷剛剛建立的子節點順序號是否為最小節點,如果是最小節點,則可以獲得該鎖對資源進行訪問。(臨時子節點建立會自動生成一個序號的)
  4. 如果不是該節點,就獲得該節點的上一順序節點,並給該節點是否存在注冊監聽事件。同時在這里阻塞。等待監聽事件的發生。獲得控制權(實現watch接口,並且重寫process方法,在process里面實現監聽)
  5. 當完成之后,關閉ZooKeeper連接,進而可以應發監聽事件,釋放該鎖(客戶端關閉ZooKeeper連接之后會刪除當前的臨時節點)

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM