ZooKeeper中篇
hello大家好,承接上文,今天將繼續(xù)介紹ZooKeeper相關(guān)知識點(diǎn)。
一、你知道Zookeeper中有哪些角色?系統(tǒng)模型

領(lǐng)導(dǎo)者(leader)Leader服務(wù)器為客戶端提供讀服務(wù)和寫服務(wù)。負(fù)責(zé)進(jìn)行投票的發(fā)起和決議,更新系統(tǒng)狀態(tài)。學(xué)習(xí)者(learner)跟隨者( follower ) Follower服務(wù)器為客戶端提供讀服務(wù),參與Leader選舉過程,參與寫操作“過半寫成功”策略。
觀察者( observer ) Observer服務(wù)器為客戶端提供讀服務(wù),不參與Leader選舉過程,不參與寫操作“過半寫成功”策略。用于在不影響寫性能的前提下提升集群的讀性能。客戶端(client) :服務(wù)請求發(fā)起方。
二、Zookeeper的選主流程是怎么樣的?

出現(xiàn)選舉主要是兩種場景:初始化、leader不可用
當(dāng)zk集群中的一臺服務(wù)器出現(xiàn)以下兩種情況之一時,就會開始leader選舉。
服務(wù)器初始化啟動。
服務(wù)器運(yùn)行期間無法和leader保持連接。
而當(dāng)一臺機(jī)器進(jìn)入leader選舉流程時,當(dāng)前集群也可能處于以下兩種狀態(tài)。
集群中本來就已經(jīng)存在一個leader。
集群中確實(shí)不存在leader。
首先第一種情況,通常是集群中某一臺機(jī)器啟動比較晚,在它啟動之前,集群已經(jīng)正常工作,即已經(jīng)存在一臺leader服務(wù)器。當(dāng)該機(jī)器試圖去選舉leader時,會被告知當(dāng)前服務(wù)器的leader信息,它僅僅需要和leader機(jī)器建立連接,并進(jìn)行狀態(tài)同步即可
重點(diǎn)是leader不可用了,此時的選主制度
投票信息中包含兩個最基本的信息。
sid :即server id,用來標(biāo)識該機(jī)器在集群中的機(jī)器序號。
zxid :即zookeeper事務(wù)id號

例如:如果當(dāng)前服務(wù)器要推舉sid為1,zxid為8的服務(wù)器成為leader,那么投票信息可以表示為(1,8)
集群中的每臺機(jī)器發(fā)出自己的投票后,也會接受來自集群中其他機(jī)器的投票。每臺機(jī)器都會根據(jù)一定的規(guī)則,來處理收到的其他機(jī)器的投票,以此來決定是否需要變更自己的投票。
規(guī)則如下 :
初始階段,都會給自己投票。
當(dāng)接收到來自其他服務(wù)器的投票時,都需要將別人的投票和自己的投票進(jìn)行pk,規(guī)則如下:
優(yōu)先檢查zxid。zxid比較大的服務(wù)器優(yōu)先作為leader。如果zxid相同的話,就比較sid,sid比較大的服務(wù)器作為leader。
所有服務(wù)啟動時候的選舉流程:



總結(jié):
開始投票 -> 節(jié)點(diǎn)狀態(tài)變成 LOOKING -> 每個節(jié)點(diǎn)選自己-> 收到票進(jìn)行 PK -> sid 大的獲勝 -> 更新選票 -> 再次投票 -> 統(tǒng)計(jì)選票,選票過半數(shù)選舉結(jié)果 -> 節(jié)點(diǎn)狀態(tài)更新為自己的角色狀態(tài)。
三、為什么Zookeeper集群的數(shù)目,一般為奇數(shù)個?
首先需要明確zookeeper選舉的規(guī)則:leader選舉,要求 可用節(jié)點(diǎn)數(shù)量 > 總節(jié)點(diǎn)數(shù)量/2 。
比如:標(biāo)記一個寫是否成功是要在超過一半節(jié)點(diǎn)發(fā)送寫請求成功時才認(rèn)為有效。同樣,Zookeeper選擇領(lǐng)導(dǎo)者節(jié)點(diǎn)也是在超過一半節(jié)點(diǎn)同意時才有效。最后,Zookeeper是否正常是要根據(jù)是否超過一半的節(jié)點(diǎn)正常才算正常。這是基于CAP的一致性原理。
zookeeper有這樣一個特性:集群中只要有過半的機(jī)器是正常工作的,那么整個集群對外就是可用的。
也就是說如果有2個zookeeper,那么只要有1個死了zookeeper就不能用了,因?yàn)?沒有過半,所以2個zookeeper的死亡容忍度為0;
同理,要是有3個zookeeper,一個死了,還剩下2個正常的,過半了,所以3個zookeeper的容忍度為1;
同理:

會發(fā)現(xiàn)一個規(guī)律,2n和2n-1的容忍度是一樣的,都是n-1,所以為了更加高效,何必增加那一個不必要的zookeeper呢。
zookeeper的選舉策略也是需要半數(shù)以上的節(jié)點(diǎn)同意才能當(dāng)選leader,如果是偶數(shù)節(jié)點(diǎn)可能導(dǎo)致票數(shù)相同的情況。
四、Zookeeper監(jiān)聽器的原理是什么?

1. 創(chuàng)建一個Main()線程。2. 在Main()線程中創(chuàng)建兩個線程,一個負(fù)責(zé)網(wǎng)絡(luò)連接通信(connect),一個負(fù)責(zé)監(jiān)聽(listener)。3. 通過connect線程將注冊的監(jiān)聽事件發(fā)送給Zookeeper。4. 將注冊的監(jiān)聽事件添加到Zookeeper的注冊監(jiān)聽器列表中。5. Zookeeper監(jiān)聽到有數(shù)據(jù)或路徑發(fā)生變化時,把這條消息發(fā)送給Listener線程。6. Listener線程內(nèi)部調(diào)用process()方法
五、說說Zookeeper中的ACL 權(quán)限控制機(jī)制
ACL(Access Control List)訪問控制列表

六、Zookeeper 有哪幾種幾種部署模式?
Zookeeper 有三種部署模式:
1. 單機(jī)部署:一臺集群上運(yùn)行;
2. 集群部署:多臺集群運(yùn)行;
3. 偽集群部署:一臺集群啟動多個 Zookeeper 實(shí)例運(yùn)行。
七、Zookeeper集群支持動態(tài)添加機(jī)器嗎?
其實(shí)就是水平擴(kuò)容了,Zookeeper 在這方面不太好。兩種方式:
全部重啟:關(guān)閉所有 Zookeeper 服務(wù),修改配置之后啟動。不影響之前客戶端的會話。
逐個重啟:在過半存活即可用的原則下,一臺機(jī)器重啟不影響整個集群對外提供服務(wù)。這是比較常用的方式。3.5 版本開始支持動態(tài)擴(kuò)容。
IT楓斗者offer訓(xùn)練營集訓(xùn)中,有需要的趕緊報名。不知道哪些人可以報名?沒關(guān)系點(diǎn)擊這里關(guān)于我們。