溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

zookeeper分布式鎖服務(wù)的原理分析

發(fā)布時(shí)間:2021-12-09 09:21:40 來源:億速云 閱讀:130 作者:小新 欄目:云計(jì)算

小編給大家分享一下zookeeper分布式鎖服務(wù)的原理分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

分布式鎖服務(wù)在大家的項(xiàng)目中或許用的不多,因?yàn)榇蠹叶及雅潘旁跀?shù)據(jù)庫(kù)那一層來?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)目, 用來協(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)變得越來越龐大臃腫,性能急劇下降,客戶抱怨頻頻。拆分系統(tǒng)是目前我們可選擇的解決系統(tǒng)可伸縮性和性能問題的唯一行之有效的方法。但是拆分系統(tǒng)同時(shí)也帶來了系統(tǒng)的復(fù)雜性——各子系統(tǒng)不是孤立存在的,它們彼此之間需要協(xié)作和交互,這就是我們常說的分布式系統(tǒng)。各個(gè)子系統(tǒng)就好比動(dòng)物園里的動(dòng)物,為了使各個(gè)子系統(tǒng)能正常為用戶提供統(tǒng)一的服務(wù),必須需要一種機(jī)制來進(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è)被拆分出來的子項(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樹(類似Linux的文件系統(tǒng)),并且它們是一些已經(jīng)被構(gòu)建好的塊,可以用來構(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è)客戶端無需知曉其他客戶端的存在,就可以和其他客戶端進(jìn)行數(shù)據(jù)交互。

5) 豐富的API

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

zookeeper其實(shí)是集群中每個(gè)節(jié)點(diǎn)都維護(hù)著一棵相同的樹, 樹的結(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問zookeeper的樹時(shí), 相同節(jié)點(diǎn)返回的數(shù)據(jù)都是一致的. 這要靠zookeeper內(nèi)部的一些算法來實(shí)現(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集群的每個(gè)節(jié)點(diǎn)的數(shù)據(jù)都是一致的, 那么我們可以通過這些節(jié)點(diǎn)來作為鎖的標(biāo)志.

首先給鎖設(shè)置一下API, 至少要包含, lock(鎖住), unlock(解鎖), isLocked(是否鎖住)三個(gè)方法,然后我們可以創(chuàng)建一個(gè)工廠(LockFactory), 用來專門生產(chǎn)鎖.鎖的創(chuàng)建過程如下描述:

前提:每個(gè)鎖都需要一個(gè)路徑來指定(如:/geffzhang/lock)

1.根據(jù)指定的路徑, 查找zookeeper集群下的這個(gè)節(jié)點(diǎn)是否存在.(說明已經(jīng)有鎖了)

2. 如果存在, 根據(jù)查詢者的一些特征數(shù)據(jù)(如ip地址/hostname), 當(dāng)前的鎖是不是查詢者的

3. 如果不是查詢者的鎖, 則返回null, 說明創(chuàng)建鎖失敗

4. 如果是查詢者的鎖, 則把這個(gè)鎖返回給查詢者

5. 如果這個(gè)節(jié)點(diǎn)不存在, 說明當(dāng)前沒有鎖, 那么創(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), 說明該鎖被其他查詢者使用了.’

2. 創(chuàng)建成功, 但當(dāng)前沒有鎖住(unlocked), 可以使用

3. 創(chuàng)建成功, 但當(dāng)前已經(jīng)鎖住(locked)了, 不能繼續(xù)加鎖.

以上是“zookeeper分布式鎖服務(wù)的原理分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI