您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)怎么解析zookeeper 原理,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
1. 領(lǐng)導(dǎo)者(leader): 負(fù)責(zé)進(jìn)行投票的發(fā)起和決議,更新系統(tǒng)狀態(tài)。
2. 學(xué)習(xí)者(learner): 包括跟隨者是(follower)和觀(guān)察者(observer)。
3. 跟隨者(follower): 用于接受客戶(hù)端的請(qǐng)求并向客戶(hù)端返回結(jié)果,在選主的過(guò)程中參與投票。
4. 觀(guān)察者(observer): 可以接受客戶(hù)端連接,將寫(xiě)入請(qǐng)求轉(zhuǎn)發(fā)給leader,但observer不參加投票過(guò)程,只同步leader的狀態(tài),observer的目的是為了擴(kuò)展系統(tǒng),提高讀取速度。
5. 客戶(hù)端(client): 請(qǐng)求發(fā)起方。
Zookeeper的核心是原子廣播,這個(gè)機(jī)制保證了各個(gè)Server之間的同步。實(shí)現(xiàn)這個(gè)機(jī)制的協(xié)議叫做Zab協(xié)議。Zab協(xié)議有兩種模式,它們分別是回復(fù)模式(選主)和廣播模式(同步)。當(dāng)服務(wù)啟動(dòng)或者領(lǐng)導(dǎo)者崩潰后,Zab就進(jìn)入恢復(fù)模式,當(dāng)領(lǐng)導(dǎo)者被選舉出來(lái),且大多數(shù)Server完成了和leader的狀態(tài)同步以后,恢復(fù)模式就結(jié)束了。狀態(tài)同步保證了leader和Server具有相同的系統(tǒng)狀態(tài)。
為了保證事務(wù)的順序一致性,zookeeper采用了遞增的事務(wù)id號(hào)(zxid)來(lái)標(biāo)識(shí)事務(wù)。所有的提議(proposal)都在被提出的時(shí)候加上zxid。實(shí)現(xiàn)中zxid是一個(gè)64位的數(shù)字,它高32位是epoch用來(lái)標(biāo)識(shí)leader關(guān)系是否改變,每次一個(gè)leader被選出來(lái),它都會(huì)有一個(gè)新的epoch,標(biāo)識(shí)當(dāng)前屬于哪個(gè)leader的統(tǒng)治時(shí)期。低32位用于遞增計(jì)數(shù)。
每個(gè)Server工作過(guò)程中有三個(gè)狀態(tài):
LOOKING : 當(dāng)前Server不知道leader是誰(shuí),正在搜尋。
LEADING : 當(dāng)前Server即為選出來(lái)的leader。
FOLLOWING : leader已經(jīng)選舉出來(lái),當(dāng)前Server與之同步。
假設(shè)有五臺(tái)服務(wù)器組成的Zookeeper集群,它們的id從1-5,同時(shí)它們都是最新啟動(dòng)的,也就是沒(méi)有歷史數(shù)據(jù),在存放數(shù)據(jù)量這一點(diǎn)上,都是一樣的。假設(shè)這些服務(wù)器依序啟動(dòng),來(lái)看看會(huì)發(fā)生什么,如圖所示。
1. 服務(wù)器1啟動(dòng),此時(shí)只有它一臺(tái)服務(wù)器啟動(dòng)了,它發(fā)出去的報(bào)文沒(méi)有任何響應(yīng),所以它的選舉狀態(tài)一直是LOOKING狀態(tài)。
2. 服務(wù)器2啟動(dòng),它與最開(kāi)始啟動(dòng)的服務(wù)器1進(jìn)行通信,互相交換自己的選舉結(jié)果,由于兩者都沒(méi)有歷史數(shù)據(jù),所以id值較大的服務(wù)器2勝出,但是由于沒(méi)有達(dá)到超過(guò)半數(shù)以上的服務(wù)器都同意選舉它(這個(gè)例子中的半數(shù)以上是3),所以服務(wù)器1、2還是繼續(xù)保持LOOKING狀態(tài)。
3. 服務(wù)器3啟動(dòng),根據(jù)前面的理論分析,服務(wù)器3成為服務(wù)器1、2、3中的老大,而與上面不同的是,此時(shí)有三臺(tái)服務(wù)器選舉了它,所以它成為了這次選舉的Leader。
4. 服務(wù)器4啟動(dòng),根據(jù)前面的分析,理論上服務(wù)器4應(yīng)該是服務(wù)器1、2、3、4中最大的,但是由于前面已經(jīng)有半數(shù)以上的服務(wù)器選舉了服務(wù)器3,所以它只能接收當(dāng)小弟的命了。
5. 服務(wù)器5啟動(dòng),同4一樣當(dāng)小弟。
[zk: 127.0.0.1:2181(CONNECTED) 2] get /20181112 hello #數(shù)據(jù) cZxid = 0x4 #創(chuàng)建節(jié)點(diǎn)的事務(wù)zxid ctime = Mon Nov 12 15:31:17 CST 2018 #創(chuàng)建時(shí)間 mZxid = 0x4 #最后一次更新的事務(wù)zxid mtime = Mon Nov 12 15:31:17 CST 2018 #最后一次更新時(shí)間 pZxid = 0x4 #最后一次更新子節(jié)點(diǎn)zxid cversion = 0 #子節(jié)點(diǎn)變化號(hào),znode子節(jié)點(diǎn)修改次數(shù) dataVersion = 0 #數(shù)據(jù)變化版本號(hào) aclVersion = 0 #訪(fǎng)問(wèn)控制列表的變化號(hào) ephemeralOwner = 0x0 #如果是臨時(shí)節(jié)點(diǎn),這個(gè)是znode擁有者的session id。如果不是臨時(shí)節(jié)點(diǎn)則是0。 dataLength = 5 #數(shù)據(jù)長(zhǎng)度 numChildren = 0 #子節(jié)點(diǎn)數(shù)量
Znode有兩種類(lèi)型,短暫的(ephemeral)和 持久的(persistent)。
Znode的類(lèi)型在創(chuàng)建時(shí)確定并且之后不能修改。
短暫Znode的客戶(hù)端會(huì)話(huà)結(jié)束時(shí),zookeeper會(huì)將該短暫znode刪除,短暫znode不可以有子節(jié)點(diǎn)。
持久Znode不依賴(lài)于客戶(hù)端會(huì)話(huà),只有當(dāng)客戶(hù)端明確要?jiǎng)h除該持有化Znode時(shí)才會(huì)刪除。
Znode有四種形式的目錄節(jié)點(diǎn)
PERSISITENT
EPHEMERAL
PERSISITENT_SEQUENTIAL
EPHEMERAL_SEQUENTIAL
1. Client 向 ZooKeeper 的 Server1 上寫(xiě)數(shù)據(jù),發(fā)送一個(gè)寫(xiě)請(qǐng)求。
2. 如果Server1不是Leader,那么Server1 會(huì)把接受到的請(qǐng)求進(jìn)一步轉(zhuǎn)發(fā)給Leader,因?yàn)槊總€(gè)ZooKeeper的Server里面有一個(gè)是Leader。這個(gè)Leader 會(huì)將寫(xiě)請(qǐng)求廣播給各個(gè)Server,比如Server1和Server2,各個(gè)Server寫(xiě)成功后就會(huì)通知Leader。
3. 當(dāng)Leader收到大多數(shù) Server 數(shù)據(jù)寫(xiě)成功了,那么就說(shuō)明數(shù)據(jù)寫(xiě)成功了。如果這里三個(gè)節(jié)點(diǎn)的話(huà),只要有兩個(gè)節(jié)點(diǎn)數(shù)據(jù)寫(xiě)成功了,那么就認(rèn)為數(shù)據(jù)寫(xiě)成功了。寫(xiě)成功之后,Leader會(huì)告訴Server1數(shù)據(jù)寫(xiě)成功了。
4. Server1會(huì)進(jìn)一步通知 Client 數(shù)據(jù)寫(xiě)成功了,這時(shí)就認(rèn)為整個(gè)寫(xiě)操作成功。
Watcher 在 Zookeeper 是一個(gè)核心功能,Watcher可以監(jiān)控目錄節(jié)點(diǎn)的數(shù)據(jù)變化以及子目錄的變化,一單這些狀態(tài)發(fā)生變化,服務(wù)器就會(huì)通知所有設(shè)置在這個(gè)目錄節(jié)點(diǎn)上的Watcher,從而每個(gè)客戶(hù)端都很快知道它所關(guān)注的狀態(tài)發(fā)生變化,而做出相應(yīng)的反應(yīng)。
可以設(shè)置觀(guān)察的操作:exists、getChildren、getData
可以出發(fā)觀(guān)察的操作:create、delete、setData
監(jiān)聽(tīng)原理詳解:
1. 首先要有一個(gè)main()線(xiàn)程
2. 在main線(xiàn)程中創(chuàng)建Zookeeper客戶(hù)端,這時(shí)就會(huì)創(chuàng)建兩個(gè)線(xiàn)程,一個(gè)負(fù)責(zé)網(wǎng)絡(luò)連接通信(connet),一個(gè)負(fù)責(zé)監(jiān)聽(tīng)(listener)。
3. 通過(guò)connect線(xiàn)程將注冊(cè)的監(jiān)聽(tīng)事件發(fā)送給Zookeeper。
4. 在Zookeeper的注冊(cè)監(jiān)聽(tīng)器列表中將注冊(cè)的監(jiān)聽(tīng)事件添加到列表中。
5. Zookeeper監(jiān)聽(tīng)到有數(shù)據(jù)或路徑變化,就會(huì)將這個(gè)消息發(fā)送給listener線(xiàn)程。
6. listener線(xiàn)程內(nèi)部調(diào)用了process()方法。
看完上述內(nèi)容,你們對(duì)怎么解析zookeeper 原理有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guā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)容。