分佈式鎖服務在你們的項目中或許用的很少,由於你們都把排他放在數據庫那一層來擋。當大量的行鎖、表鎖、事務充斥着數據庫的時候。通常web應用不少的瓶頸都在數據庫上,這裏給你們介紹的是減輕數據庫鎖負擔的一種方案,使用zookeeper分佈式鎖服務。html
zookeeper是hadoop下面的一個子項目, 用來協調跟hadoop相關的一些分佈式的框架, 如hadoop, hive, pig等, 其實他們都是動物, 因此叫zookeeper ——「動物園管理員」。動物園裏固然有好多的動物,遊客能夠根據動物園提供的嚮導圖到不一樣的場館觀賞各類類型的動物,而不是像走在原始叢林裏,心驚膽顫的被動物所觀賞。爲了讓各類不一樣的動物呆在它們應該呆的地方,而不是相互串門,或是相互廝殺,就須要動物園管理員按照動物的各類習性加以分類和管理,這樣咱們才能更加放心安全的觀賞動物。回到咱們企業級應用系統中,隨着信息化水平的不斷提升,咱們的企業級系統變得愈來愈龐大臃腫,性能急劇降低,客戶抱怨頻頻。拆分系統是目前咱們可選擇的解決系統可伸縮性和性能問題的惟一行之有效的方法。可是拆分系統同時也帶來了系統的複雜性——各子系統不是孤立存在的,它們彼此之間須要協做和交互,這就是咱們常說的分佈式系統。各個子系統就比如動物園裏的動物,爲了使各個子系統能正常爲用戶提供統一的服務,必須須要一種機制來進行協調——這就是ZooKeeper——動物園管理員。node
ZooKeeper本質上是一個分佈式的小文件存儲系統。本來是Apache Hadoop的一個組件,如今被拆分爲一個Hadoop的獨立子項目,在HBase(Hadoop的另一個被拆分出來的子項目,用於分佈式環境下的超大數據量的DBMS)中也用到了ZooKeeper集羣。ZooKeeper有以下的特性:linux
1) 簡單git
ZooKeeper核心是一個精簡的文件系統,它提供了一些簡單的文件操做以及附加的功能,例如排序和通知。github
2) 易表達web
ZooKeeper的數據結構原型是一棵znode樹(相似Linux的文件系統),而且它們是一些已經被構建好的塊,能夠用來構建大型的協做數據結構和協議。算法
3) 高可用性數據庫
ZooKeeper能夠運行在一組服務器上,同時它們被設計成高可用性,爲你的應用程序避免單點故障。apache
4) 鬆耦合交互編程
ZooKeeper提供的Watcher機制使得各客戶端與服務器的交互變得鬆耦合,每一個客戶端無需知曉其餘客戶端的存在,就能夠和其餘客戶端進行數據交互。
5) 豐富的API
ZooKeeper爲開發人員提供了一套豐富的API,減輕了開發人員編寫通用協議的負擔。
zookeeper實際上是集羣中每一個節點都維護着一棵相同的樹, 樹的結構跟linux的目錄結構的概念差很少, 以/爲跟節點, 下邊能夠擴展任意的節點和葉子節點, 每一個節點均可以寫入數據. 基於zookeeper的分佈式鎖的實現, 實際上是得益於zookeeper同步文件的強大性, 咱們相信每時每刻咱們訪問zookeeper的樹時, 相同節點返回的數據都是一致的. 這要靠zookeeper內部的一些算法來實現. 特別是leader的選舉算法。
官方文檔:http://zookeeper.apache.org/doc/r3.3.2/zookeeperOver.html#ch_DesignOverview
下載:http://zookeeper.apache.org/releases.html
C#的zookeeper客戶端仍是有一些和zookeeper最新版3.4.3兼容 https://github.com/ewhauser/zookeeper/branches
zookeeper集羣的每一個節點的數據都是一致的, 那麼咱們能夠經過這些節點來做爲鎖的標誌.
首先給鎖設置一下API, 至少要包含, lock(鎖住), unlock(解鎖), isLocked(是否鎖住)三個方法,而後咱們能夠建立一個工廠(LockFactory), 用來專門生產鎖.鎖的建立過程以下描述:
前提:每一個鎖都須要一個路徑來指定(如:/geffzhang/lock)
1.根據指定的路徑, 查找zookeeper集羣下的這個節點是否存在.(說明已經有鎖了)
2. 若是存在, 根據查詢者的一些特徵數據(如ip地址/hostname), 當前的鎖是否是查詢者的
3. 若是不是查詢者的鎖, 則返回null, 說明建立鎖失敗
4. 若是是查詢者的鎖, 則把這個鎖返回給查詢者
5. 若是這個節點不存在, 說明當前沒有鎖, 那麼建立一個臨時節點, 並將查詢者的特徵信息寫入這個節點的數據中, 而後返回這個鎖.
據以上5部, 一個分佈式的鎖就能夠建立了.
建立的鎖有三種狀態:
1. 建立失敗(null), 說明該鎖被其餘查詢者使用了.’
2. 建立成功, 但當前沒有鎖住(unlocked), 可使用
3. 建立成功, 但當前已經鎖住(locked)了, 不能繼續加鎖.
zookeeper 客戶端編程
分佈式鎖服務
分佈式服務框架 Zookeeper -- 管理分佈式環境中的數據
基於zookeeper實現的分佈式鎖