分布式鎖服務(wù)在大家的項(xiàng)目中或許用的不多,因?yàn)榇蠹叶及雅潘旁跀?shù)據(jù)庫(kù)那一層來(lái)?yè)酢.?dāng)大量的行鎖、表鎖、事務(wù)充斥著數(shù)據(jù)庫(kù)的時(shí)候。一般web應(yīng)用很多的瓶頸都在數(shù)據(jù)庫(kù)上,這里給大家介紹的是減輕數(shù)據(jù)庫(kù)鎖負(fù)擔(dān)的一種方案,使用zookeeper分布式鎖服務(wù)。 zookeeper是hadoop下面的一個(gè)子項(xiàng)目, 用來(lái)協(xié)調(diào)跟hadoop相關(guān)的一些分布式的框架, 如hadoop, hive, pig等, 其實(shí)他們都是動(dòng)物, 所以叫zookeeper ——“動(dòng)物園管理員”。動(dòng)物園里當(dāng)然有好多的動(dòng)物,游客可以根據(jù)動(dòng)物園提供的向?qū)D到不同的場(chǎng)館觀賞各種類型的動(dòng)物,而不是像走在原始叢林里,心驚膽顫的被動(dòng)物所觀賞。為了讓各種不同的動(dòng)物呆在它們應(yīng)該呆的地方,而不是相互串門,或是相互廝殺,就需要?jiǎng)游飯@管理員按照動(dòng)物的各種習(xí)性加以分類和管理,這樣我們才能更加放心安全的觀賞動(dòng)物?;氐轿覀兤髽I(yè)級(jí)應(yīng)用系統(tǒng)中,隨著信息化水平的不斷提高,我們的企業(yè)級(jí)系統(tǒng)變得越來(lái)越龐大臃腫,性能急劇下降,客戶抱怨頻頻。拆分系統(tǒng)是目前我們可選擇的解決系統(tǒng)可伸縮性和性能問(wèn)題的唯一行之有效的方法。但是拆分系統(tǒng)同時(shí)也帶來(lái)了系統(tǒng)的復(fù)雜性——各子系統(tǒng)不是孤立存在的,它們彼此之間需要協(xié)作和交互,這就是我們常說(shuō)的分布式系統(tǒng)。各個(gè)子系統(tǒng)就好比動(dòng)物園里的動(dòng)物,為了使各個(gè)子系統(tǒng)能正常為用戶提供統(tǒng)一的服務(wù),必須需要一種機(jī)制來(lái)進(jìn)行協(xié)調(diào)——這就是ZooKeeper——?jiǎng)游飯@管理員。 ZooKeeper本質(zhì)上是一個(gè)分布式的小文件存儲(chǔ)系統(tǒng)。原本是Apache Hadoop的一個(gè)組件,現(xiàn)在被拆分為一個(gè)Hadoop的獨(dú)立子項(xiàng)目,在HBase(Hadoop的另外一個(gè)被拆分出來(lái)的子項(xiàng)目,用于分布式環(huán)境下的超大數(shù)據(jù)量的DBMS)中也用到了ZooKeeper集群。ZooKeeper有如下的特性: 1) 簡(jiǎn)單 ZooKeeper核心是一個(gè)精簡(jiǎn)的文件系統(tǒng),它提供了一些簡(jiǎn)單的文件操作以及附加的功能,例如排序和通知。 2) 易表達(dá) ZooKeeper的數(shù)據(jù)結(jié)構(gòu)原型是一棵znode樹(shù)(類似Linux的文件系統(tǒng)),并且它們是一些已經(jīng)被構(gòu)建好的塊,可以用來(lái)構(gòu)建大型的協(xié)作數(shù)據(jù)結(jié)構(gòu)和協(xié)議。 3) 高可用性 ZooKeeper可以運(yùn)行在一組服務(wù)器上,同時(shí)它們被設(shè)計(jì)成高可用性,為你的應(yīng)用程序避免單點(diǎn)故障。 4) 松耦合交互 ZooKeeper提供的Watcher機(jī)制使得各客戶端與服務(wù)器的交互變得松耦合,每個(gè)客戶端無(wú)需知曉其他客戶端的存在,就可以和其他客戶端進(jìn)行數(shù)據(jù)交互。 5) 豐富的API ZooKeeper為開(kāi)發(fā)人員提供了一套豐富的API,減輕了開(kāi)發(fā)人員編寫通用協(xié)議的負(fù)擔(dān)。 zookeeper其實(shí)是集群中每個(gè)節(jié)點(diǎn)都維護(hù)著一棵相同的樹(shù), 樹(shù)的結(jié)構(gòu)跟linux的目錄結(jié)構(gòu)的概念差不多, 以/為跟節(jié)點(diǎn), 下邊可以擴(kuò)展任意的節(jié)點(diǎn)和葉子節(jié)點(diǎn), 每個(gè)節(jié)點(diǎn)都可以寫入數(shù)據(jù). 基于zookeeper的分布式鎖的實(shí)現(xiàn), 其實(shí)是得益于zookeeper同步文件的強(qiáng)大性, 我們相信每時(shí)每刻我們?cè)L問(wèn)zookeeper的樹(shù)時(shí), 相同節(jié)點(diǎn)返回的數(shù)據(jù)都是一致的. 這要靠zookeeper內(nèi)部的一些算法來(lái)實(shí)現(xiàn). 特別是leader的選舉算法。 官方文檔:http://zookeeper./doc/r3.3.2/zookeeperOver.html#ch_DesignOverview 下載:http://zookeeper./releases.html C#的zookeeper客戶端還是有一些和zookeeper最新版3.4.3兼容 https://github.com/ewhauser/zookeeper/branches zookeeper集群的每個(gè)節(jié)點(diǎn)的數(shù)據(jù)都是一致的, 那么我們可以通過(guò)這些節(jié)點(diǎn)來(lái)作為鎖的標(biāo)志. 首先給鎖設(shè)置一下API, 至少要包含, lock(鎖住), unlock(解鎖), isLocked(是否鎖住)三個(gè)方法,然后我們可以創(chuàng)建一個(gè)工廠(LockFactory), 用來(lái)專門生產(chǎn)鎖.鎖的創(chuàng)建過(guò)程如下描述: 前提:每個(gè)鎖都需要一個(gè)路徑來(lái)指定(如:/geffzhang/lock) 1.根據(jù)指定的路徑, 查找zookeeper集群下的這個(gè)節(jié)點(diǎn)是否存在.(說(shuō)明已經(jīng)有鎖了) 2. 如果存在, 根據(jù)查詢者的一些特征數(shù)據(jù)(如ip地址/hostname), 當(dāng)前的鎖是不是查詢者的 3. 如果不是查詢者的鎖, 則返回null, 說(shuō)明創(chuàng)建鎖失敗 4. 如果是查詢者的鎖, 則把這個(gè)鎖返回給查詢者 5. 如果這個(gè)節(jié)點(diǎn)不存在, 說(shuō)明當(dāng)前沒(méi)有鎖, 那么創(chuàng)建一個(gè)臨時(shí)節(jié)點(diǎn), 并將查詢者的特征信息寫入這個(gè)節(jié)點(diǎn)的數(shù)據(jù)中, 然后返回這個(gè)鎖. 據(jù)以上5部, 一個(gè)分布式的鎖就可以創(chuàng)建了. 創(chuàng)建的鎖有三種狀態(tài): 1. 創(chuàng)建失敗(null), 說(shuō)明該鎖被其他查詢者使用了.’ 2. 創(chuàng)建成功, 但當(dāng)前沒(méi)有鎖住(unlocked), 可以使用 3. 創(chuàng)建成功, 但當(dāng)前已經(jīng)鎖住(locked)了, 不能繼續(xù)加鎖.
|
|
來(lái)自: 知識(shí)存儲(chǔ)館 > 《java》