日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

zookeeper 分布式鎖服務(wù)

 知識存儲館 2014-08-16

分布式鎖服務(wù)在大家的項目中或許用的不多,因為大家都把排他放在數(shù)據(jù)庫那一層來擋。當(dāng)大量的行鎖、表鎖、事務(wù)充斥著數(shù)據(jù)庫的時候。一般web應(yīng)用很多的瓶頸都在數(shù)據(jù)庫上,這里給大家介紹的是減輕數(shù)據(jù)庫鎖負擔(dān)的一種方案,使用zookeeper分布式鎖服務(wù)。

zookeeper是hadoop下面的一個子項目, 用來協(xié)調(diào)跟hadoop相關(guān)的一些分布式的框架, 如hadoop, hive, pig等, 其實他們都是動物, 所以叫zookeeper ——“動物園管理員”。動物園里當(dāng)然有好多的動物,游客可以根據(jù)動物園提供的向?qū)D到不同的場館觀賞各種類型的動物,而不是像走在原始叢林里,心驚膽顫的被動物所觀賞。為了讓各種不同的動物呆在它們應(yīng)該呆的地方,而不是相互串門,或是相互廝殺,就需要動物園管理員按照動物的各種習(xí)性加以分類和管理,這樣我們才能更加放心安全的觀賞動物?;氐轿覀兤髽I(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ù),必須需要一種機制來進行協(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) 易表達

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ù)器的交互變得松耦合,每個客戶端無需知曉其他客戶端的存在,就可以和其他客戶端進行數(shù)據(jù)交互。

5) 豐富的API

ZooKeeper為開發(fā)人員提供了一套豐富的API,減輕了開發(fā)人員編寫通用協(xié)議的負擔(dān)。

zookeeper其實是集群中每個節(jié)點都維護著一棵相同的樹, 樹的結(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./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集群的每個節(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ù)加鎖.

 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多