zookeeper 分布式锁服务
分布式鎖服務(wù)在大家的項目中或許用的不多,因為大家都把排他放在數(shù)據(jù)庫那一層來擋。當(dāng)大量的行鎖、表鎖、事務(wù)充斥著數(shù)據(jù)庫的時候。一般web應(yīng)用很多的瓶頸都在數(shù)據(jù)庫上,這里給大家介紹的是減輕數(shù)據(jù)庫鎖負(fù)擔(dān)的一種方案,使用zookeeper分布式鎖服務(wù)。
zookeeper是hadoop下面的一個子項目, 用來協(xié)調(diào)跟hadoop相關(guān)的一些分布式的框架, 如hadoop, hive, pig等, 其實他們都是動物, 所以叫zookeeper ——“動物園管理員”。動物園里當(dāng)然有好多的動物,游客可以根據(jù)動物園提供的向?qū)D到不同的場館觀賞各種類型的動物,而不是像走在原始叢林里,心驚膽顫的被動物所觀賞。為了讓各種不同的動物呆在它們應(yīng)該呆的地方,而不是相互串門,或是相互廝殺,就需要動物園管理員按照動物的各種習(xí)性加以分類和管理,這樣我們才能更加放心安全的觀賞動物。回到我們企業(yè)級應(yīng)用系統(tǒng)中,隨著信息化水平的不斷提高,我們的企業(yè)級系統(tǒng)變得越來越龐大臃腫,性能急劇下降,客戶抱怨頻頻。拆分系統(tǒng)是目前我們可選擇的解決系統(tǒng)可伸縮性和性能問題的唯一行之有效的方法。但是拆分系統(tǒng)同時也帶來了系統(tǒng)的復(fù)雜性——各子系統(tǒng)不是孤立存在的,它們彼此之間需要協(xié)作和交互,這就是我們常說的分布式系統(tǒng)。各個子系統(tǒng)就好比動物園里的動物,為了使各個子系統(tǒng)能正常為用戶提供統(tǒng)一的服務(wù),必須需要一種機制來進(jìn)行協(xié)調(diào)——這就是ZooKeeper——動物園管理員。
ZooKeeper本質(zhì)上是一個分布式的小文件存儲系統(tǒng)。原本是Apache Hadoop的一個組件,現(xiàn)在被拆分為一個Hadoop的獨立子項目,在HBase(Hadoop的另外一個被拆分出來的子項目,用于分布式環(huán)境下的超大數(shù)據(jù)量的DBMS)中也用到了ZooKeeper集群。ZooKeeper有如下的特性:
1) 簡單
ZooKeeper核心是一個精簡的文件系統(tǒng),它提供了一些簡單的文件操作以及附加的功能,例如排序和通知。
2) 易表達(dá)
ZooKeeper的數(shù)據(jù)結(jié)構(gòu)原型是一棵znode樹(類似Linux的文件系統(tǒng)),并且它們是一些已經(jīng)被構(gòu)建好的塊,可以用來構(gòu)建大型的協(xié)作數(shù)據(jù)結(jié)構(gòu)和協(xié)議。
3) 高可用性
ZooKeeper可以運行在一組服務(wù)器上,同時它們被設(shè)計成高可用性,為你的應(yīng)用程序避免單點故障。
4) 松耦合交互
ZooKeeper提供的Watcher機制使得各客戶端與服務(wù)器的交互變得松耦合,每個客戶端無需知曉其他客戶端的存在,就可以和其他客戶端進(jìn)行數(shù)據(jù)交互。
5) 豐富的API
ZooKeeper為開發(fā)人員提供了一套豐富的API,減輕了開發(fā)人員編寫通用協(xié)議的負(fù)擔(dān)。
zookeeper其實是集群中每個節(jié)點都維護(hù)著一棵相同的樹, 樹的結(jié)構(gòu)跟linux的目錄結(jié)構(gòu)的概念差不多, 以/為跟節(jié)點, 下邊可以擴展任意的節(jié)點和葉子節(jié)點, 每個節(jié)點都可以寫入數(shù)據(jù). 基于zookeeper的分布式鎖的實現(xiàn), 其實是得益于zookeeper同步文件的強大性, 我們相信每時每刻我們訪問zookeeper的樹時, 相同節(jié)點返回的數(shù)據(jù)都是一致的. 這要靠zookeeper內(nèi)部的一些算法來實現(xiàn). 特別是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集群的每個節(jié)點的數(shù)據(jù)都是一致的, 那么我們可以通過這些節(jié)點來作為鎖的標(biāo)志.
首先給鎖設(shè)置一下API, 至少要包含, lock(鎖住), unlock(解鎖), isLocked(是否鎖住)三個方法,然后我們可以創(chuàng)建一個工廠(LockFactory), 用來專門生產(chǎn)鎖.鎖的創(chuàng)建過程如下描述:
前提:每個鎖都需要一個路徑來指定(如:/geffzhang/lock)
1.根據(jù)指定的路徑, 查找zookeeper集群下的這個節(jié)點是否存在.(說明已經(jīng)有鎖了)
2. 如果存在, 根據(jù)查詢者的一些特征數(shù)據(jù)(如ip地址/hostname), 當(dāng)前的鎖是不是查詢者的
3. 如果不是查詢者的鎖, 則返回null, 說明創(chuàng)建鎖失敗
4. 如果是查詢者的鎖, 則把這個鎖返回給查詢者
5. 如果這個節(jié)點不存在, 說明當(dāng)前沒有鎖, 那么創(chuàng)建一個臨時節(jié)點, 并將查詢者的特征信息寫入這個節(jié)點的數(shù)據(jù)中, 然后返回這個鎖.
據(jù)以上5部, 一個分布式的鎖就可以創(chuàng)建了.
創(chuàng)建的鎖有三種狀態(tài):
1. 創(chuàng)建失敗(null), 說明該鎖被其他查詢者使用了.’
2. 創(chuàng)建成功, 但當(dāng)前沒有鎖住(unlocked), 可以使用
3. 創(chuàng)建成功, 但當(dāng)前已經(jīng)鎖住(locked)了, 不能繼續(xù)加鎖.
?
zookeeper 客戶端編程
分布式鎖服務(wù)
分布式服務(wù)框架 Zookeeper -- 管理分布式環(huán)境中的數(shù)據(jù)
基于zookeeper實現(xiàn)的分布式鎖
杭州ADC技術(shù)嘉年華兩日總結(jié)-SOA,去C
Zookeeper .Net Client
Zookeeper Client簡介
ZooKeeper在網(wǎng)關(guān)中的應(yīng)用
ZooKeeper配置 (二)
zookeeper 安裝配置(三)
總結(jié)
以上是生活随笔為你收集整理的zookeeper 分布式锁服务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何使用Win10自带DLL修复工具修复
- 下一篇: 360摄像头视频怎么导出? 360摄像头