Zookeeper的工作機(jī)制和數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)單介紹

本篇內(nèi)容介紹了“Zookeeper的工作機(jī)制和數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)單介紹”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

創(chuàng)新互聯(lián)從2013年創(chuàng)立,先為晉寧等服務(wù)建站,晉寧等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為晉寧企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。

 一、Zookeeper工作機(jī)制

分布式和集中式系統(tǒng)相比,有很多優(yōu)勢(shì),比如更強(qiáng)的計(jì)算能力,存儲(chǔ)能力,避免單點(diǎn)故障等問(wèn)題。但是由于在分布式部署的方式遇到網(wǎng)絡(luò)故障等問(wèn)題的時(shí)候怎么保證各個(gè)節(jié)點(diǎn)數(shù)據(jù)的一致性和可用性是比較關(guān)鍵的問(wèn)題。

那么,對(duì)于分布式集群來(lái)說(shuō),我們需要一個(gè)能夠在各個(gè)服務(wù)和節(jié)點(diǎn)之間進(jìn)行協(xié)調(diào)和服務(wù)的中間人——Zookeeper。

Zookeeper從設(shè)計(jì)模式角度來(lái)理解:是一個(gè)基于觀察者模式設(shè)計(jì)的分布式服務(wù)管理框架,負(fù)責(zé)存儲(chǔ)和管理大家都關(guān)心的數(shù)據(jù),然后接受觀察者的注冊(cè),一旦這些數(shù)據(jù)的狀態(tài)發(fā)生變化,Zookeeper就將負(fù)責(zé)通知已經(jīng)在Zookeeper上注冊(cè)的那些觀察者做出相應(yīng)的回應(yīng)。

二、數(shù)據(jù)結(jié)構(gòu)

Zookeeper的數(shù)據(jù)結(jié)構(gòu)和linux的目錄結(jié)構(gòu)類似,也像數(shù)據(jù)結(jié)構(gòu)中的樹(shù),如下圖:

Zookeeper的工作機(jī)制和數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)單介紹

Zookeeper的數(shù)據(jù)存儲(chǔ)基于節(jié)點(diǎn),這種節(jié)點(diǎn)稱為Znode。Znode的引用方式是路徑的引用,每個(gè)Znode都可以通過(guò)其路徑唯一標(biāo)識(shí)。

其中Znode中包含有:數(shù)據(jù),子節(jié)點(diǎn)引用,訪問(wèn)權(quán)限等,如下圖:

Zookeeper的工作機(jī)制和數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)單介紹
  • data:Znode存儲(chǔ)的數(shù)據(jù)信息

  • ACL:記錄Znode的訪問(wèn)權(quán)限,即哪些人或哪些IP可以訪問(wèn)本節(jié)點(diǎn)

  • child:當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn)引用,類似于二叉樹(shù)的左孩子右孩子

  • stat:包含Znode的各種元數(shù)據(jù),比如事務(wù)ID、版本號(hào)、時(shí)間戳、大小等等

stat 查看根目錄的詳細(xì)信息:

[zk: localhost:2181(CONNECTED) 0] stat /  cZxid = 0x0  ctime = Thu Jan 01 08:00:00 CST 1970  mZxid = 0x0  mtime = Thu Jan 01 08:00:00 CST 1970  pZxid = 0x0  cversion = -1  dataVersion = 0  aclVersion = 0  ephemeralOwner = 0x0  dataLength = 0  numChildren = 1

三、選舉機(jī)制

Zookeeper的工作機(jī)制和數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)單介紹

Zookeeper集群是一主多從的模式,主為leader,從為follower,其中l(wèi)eader是通過(guò)選舉得到。

Zookeeper集群有如下特點(diǎn):

- Zookeeper:一個(gè)領(lǐng)導(dǎo)者(leader),多個(gè)跟隨者(follower)組成的集群

- Leader負(fù)責(zé)進(jìn)行投票的發(fā)起和決議,更新系統(tǒng)狀態(tài)

- Follower用于接收客戶請(qǐng)求并向客戶端返回結(jié)果,在選舉Leader過(guò)程中參與投票

- 集群中只要有半數(shù)以上節(jié)點(diǎn)存活,Zookeeper集群就能正常服務(wù),所以Zookeeper適合安裝奇數(shù)臺(tái)服務(wù)器

- 全局?jǐn)?shù)據(jù)一致:每個(gè)server保存一份相同的數(shù)據(jù)副本,client無(wú)論連接到哪個(gè)server,數(shù)據(jù)都是一致的

- 更新請(qǐng)求順序進(jìn)行,來(lái)自同一個(gè)client的更新請(qǐng)求按其發(fā)送順序依次執(zhí)行

- 數(shù)據(jù)更新原子性,一次數(shù)據(jù)更新要么成功,要么失敗

- 實(shí)時(shí)性,在一定時(shí)間范圍內(nèi),client能讀到最新數(shù)據(jù)

Leader選舉是保證分布式數(shù)據(jù)一致性的關(guān)鍵所在,當(dāng)Zookeeper進(jìn)入以下兩種狀態(tài)時(shí),需要進(jìn)入leader選舉:

  • 服務(wù)器初始化啟動(dòng)

  • leader宕機(jī)掛掉

1. 服務(wù)器初始化啟動(dòng)時(shí)的選舉

(1)以三臺(tái)服務(wù)器組成的集群為例,在集群的初始化階段,當(dāng)server1啟動(dòng)時(shí),其單獨(dú)無(wú)法完成選舉;當(dāng)server2啟動(dòng)時(shí),此時(shí)兩臺(tái)機(jī)器可以互相通信,每臺(tái)機(jī)器都試圖找到leader,于是進(jìn)入選舉狀態(tài)

(2)每個(gè)server首先給自己投票:初始階段,每個(gè)服務(wù)器都將自己作為leader來(lái)投票,每次投票包含的信息有(myid,ZXID,epoch),此時(shí)Server1的投票為(1,  0),Server2的投票為(2, 0),然后各自將這個(gè)投票發(fā)給集群中其他機(jī)器

其中epoch用來(lái)判斷多個(gè)投票是否在同一輪選舉周期中,該值在服務(wù)端是一個(gè)自增序列,每次進(jìn)入新一輪的投票后,都會(huì)對(duì)該值進(jìn)行加1操作

(3)每個(gè)server接受來(lái)自各個(gè)服務(wù)器的投票:集群的每個(gè)服務(wù)器收到投票后,首先判斷該投票的有效性,如檢查是否是本輪投票、是否來(lái)自LOOKING狀態(tài)的服務(wù)器

(4)處理投票。針對(duì)每一個(gè)投票,服務(wù)器都需要將別人的投票和自己的投票進(jìn)行PK,PK規(guī)則如下:

優(yōu)先檢查ZXID。ZXID比較大的服務(wù)器優(yōu)先作為L(zhǎng)eader

如果ZXID相同,那么就比較myid。myid較大的服務(wù)器作為L(zhǎng)eader服務(wù)器

對(duì)于Server1而言,它的投票是(1, 0),接收Server2的投票為(2,  0),首先會(huì)比較兩者的ZXID,均為0,再比較myid,此時(shí)Server2的myid最大,于是更新自己的投票為(2,  0),然后重新投票,對(duì)于Server2而言,其無(wú)須更新自己的投票,只是再次向集群中所有機(jī)器發(fā)出上一次投票信息即可

(5)統(tǒng)計(jì)投票。每次投票后,服務(wù)器都會(huì)統(tǒng)計(jì)投票信息,判斷是否已經(jīng)有過(guò)半機(jī)器接受到相同的投票信息,對(duì)于Server1、Server2而言,都統(tǒng)計(jì)出集群中已經(jīng)有兩臺(tái)機(jī)器接受了(2,  0)的投票信息,此時(shí)便認(rèn)為已經(jīng)選出了Leader,一旦選出leader,后邊的機(jī)器不管myid和ZXID多大,都自動(dòng)成為leader的小弟

(6)改變服務(wù)器狀態(tài)。一旦確定了Leader,每個(gè)服務(wù)器就會(huì)更新自己的狀態(tài),如果是Follower,那么就變更為FOLLOWING,如果是Leader,就變更為L(zhǎng)EADING

2. leader服務(wù)器掛掉的投票機(jī)制

與啟動(dòng)時(shí)不同的就是,每個(gè)服務(wù)器上都有歷史數(shù)據(jù),在選舉之前,首先非leader的服務(wù)器改變狀態(tài)為L(zhǎng)OOKING狀態(tài),因?yàn)檫\(yùn)行期間每個(gè)服務(wù)器ZXID不同,會(huì)和啟動(dòng)時(shí)的選舉一樣進(jìn)行重新投票選舉。

四、監(jiān)聽(tīng)機(jī)制

首先要有一個(gè)main()線程

在main線程中創(chuàng)建Zookeeper客戶端,這時(shí)就會(huì)創(chuàng)建兩個(gè)線程,一個(gè)負(fù)責(zé)網(wǎng)絡(luò)連接通信(connet),一個(gè)負(fù)責(zé)監(jiān)聽(tīng)(listener)

通過(guò)connect線程將注冊(cè)的監(jiān)聽(tīng)事件發(fā)送給Zookeeper

在Zookeeper的注冊(cè)監(jiān)聽(tīng)器列表中將注冊(cè)的監(jiān)聽(tīng)事件添加到列表中

Zookeeper監(jiān)聽(tīng)到有數(shù)據(jù)或路徑變化,就會(huì)將這個(gè)消息發(fā)送給listener線程

listener線程內(nèi)部調(diào)用了process()方法

五、API應(yīng)用

Zookeeper常用的API如下:

create創(chuàng)建節(jié)點(diǎn)delete刪除節(jié)點(diǎn)exists判斷節(jié)點(diǎn)是否存在getData獲得一個(gè)節(jié)點(diǎn)的數(shù)據(jù)setData設(shè)置一個(gè)節(jié)點(diǎn)的數(shù)據(jù)getChildren獲取節(jié)點(diǎn)下的所有子節(jié)點(diǎn)

這其中,exists,getData,getChildren屬于讀操作。Zookeeper客戶端在請(qǐng)求讀操作的時(shí)候,可以選擇是否設(shè)置Watch。

Watch是什么意思呢?

我們可以理解成是注冊(cè)在特定Znode上的觸發(fā)器。當(dāng)這個(gè)Znode發(fā)生改變,也就是調(diào)用了create,delete,setData方法的時(shí)候,將會(huì)觸發(fā)Znode上注冊(cè)的對(duì)應(yīng)事件,請(qǐng)求Watch的客戶端會(huì)接收到異步通知。

具體交互過(guò)程如下:

  • 客戶端調(diào)用getData方法,watch參數(shù)是true。服務(wù)端接到請(qǐng)求,返回節(jié)點(diǎn)數(shù)據(jù),并且在對(duì)應(yīng)的哈希表里插入被Watch的Znode路徑,以及Watcher列表。

  • 當(dāng)被Watch的Znode已刪除,服務(wù)端會(huì)查找哈希表,找到該Znode對(duì)應(yīng)的所有Watcher,異步通知客戶端,并且刪除哈希表中對(duì)應(yīng)的Key-Value

六、應(yīng)用場(chǎng)景

Zookeeper提供的服務(wù)包括:統(tǒng)一命名服務(wù)、統(tǒng)一配置管理、統(tǒng)一集群管理、服務(wù)器節(jié)點(diǎn)動(dòng)態(tài)上下線、軟負(fù)載均衡等。

“Zookeeper的工作機(jī)制和數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)單介紹”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

網(wǎng)站名稱:Zookeeper的工作機(jī)制和數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)單介紹
地址分享:http://muchs.cn/article34/igspse.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、外貿(mào)建站、網(wǎng)頁(yè)設(shè)計(jì)公司軟件開(kāi)發(fā)、動(dòng)態(tài)網(wǎng)站電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作