一旦ZooKeeper集合啟動,它將等待客戶端連接。客戶端將連接到ZooKeeper集合中的一個(gè)節(jié)點(diǎn)。它可以是領(lǐng)導(dǎo)或跟隨者節(jié)點(diǎn)。一旦客戶端被連接,節(jié)點(diǎn)將向特定客戶端分配會話ID并向該客戶端發(fā)送確認(rèn)。如果客戶端沒有收到確認(rèn),它將嘗試連接ZooKeeper集合中的另一個(gè)節(jié)點(diǎn)。 一旦連接到節(jié)點(diǎn),客戶端將以有規(guī)律的間隔向節(jié)點(diǎn)發(fā)送心跳,以確保連接不會丟失。
如果客戶端想要讀取特定的znode,它將會向具有znode路徑的節(jié)點(diǎn)發(fā)送讀取請求,并且節(jié)點(diǎn)通過從其自己的數(shù)據(jù)庫獲取來返回所請求的znode。為此,在ZooKeeper集合中讀取速度快。
如果客戶端想要將數(shù)據(jù)存儲在ZooKeeper集合中,則會將znode路徑和數(shù)據(jù)發(fā)送到服務(wù)器。連接的服務(wù)器將該請求轉(zhuǎn)發(fā)給領(lǐng)導(dǎo)者,然后領(lǐng)導(dǎo)者將向所有的跟隨著重新發(fā)出寫入請求。如果只有大部分節(jié)點(diǎn)成功響應(yīng),而寫入請求成功,則成功返回代碼將被發(fā)送到客戶端。 否則,寫入請求失敗。絕大多數(shù)節(jié)點(diǎn)被稱為 Quorum 。
ZooKeeper集合中可以有不同數(shù)量的節(jié)點(diǎn)。那么,讓我們分析一下在ZooKeeper工作流中更改節(jié)點(diǎn)的效果:
如果我們有單個(gè)節(jié)點(diǎn),那么當(dāng)該節(jié)點(diǎn)失敗時(shí),ZooKeeper集群就會失效。這就是為什么不建議在生產(chǎn)環(huán)境中使用它,因?yàn)樗鼤?dǎo)致"單點(diǎn)故障"。
如果我們有兩個(gè)節(jié)點(diǎn)和一個(gè)節(jié)點(diǎn)故障,我們就沒有多數(shù),因?yàn)閮蓚€(gè)節(jié)點(diǎn)中有一個(gè)不是多數(shù)節(jié)點(diǎn)。
如果我們有三個(gè)節(jié)點(diǎn)而一個(gè)節(jié)點(diǎn)故障,那么我們有大多數(shù),因此,這是最低要求。ZooKeeper集群在實(shí)際生產(chǎn)環(huán)境中必須至少有三個(gè)節(jié)點(diǎn)。
如果我們有四個(gè)節(jié)點(diǎn)而兩個(gè)節(jié)點(diǎn)故障,它將再次故障。類似于有三個(gè)節(jié)點(diǎn),額外節(jié)點(diǎn)不用于任何目的,因此,最好添加奇數(shù)的節(jié)點(diǎn),例如3,5,7。
我們知道寫入過程比ZooKeeper集合中的讀取過程昂貴,因?yàn)樗泄?jié)點(diǎn)都需要在數(shù)據(jù)庫中寫入相同的數(shù)據(jù)。因此,對于平衡的環(huán)境擁有較少數(shù)量(例如3,5,7)的節(jié)點(diǎn)比擁有大量的節(jié)點(diǎn)要好。
下圖描述了ZooKeeper工作流,后面的表說明了它的不同組件。
組件 | 描述 |
---|---|
寫入(write) | 寫入過程由leader節(jié)點(diǎn)處理。leader將寫入請求轉(zhuǎn)發(fā)到所有znode,并等待znode的回復(fù)。如果一半的znode回復(fù),則寫入過程完成。 |
讀?。╮ead) | 讀取由特定連接的znode在內(nèi)部執(zhí)行,因此不需要與集群進(jìn)行交互。 |
復(fù)制數(shù)據(jù)庫(replicated database) | 它用于在zookeeper中存儲數(shù)據(jù)。每個(gè)znode都有自己的數(shù)據(jù)庫,每個(gè)znode在一致性的幫助下每次都有相同的數(shù)據(jù)。 |
領(lǐng)導(dǎo)者(Leader) | Leader是負(fù)責(zé)處理寫入請求的Znode。 |
跟隨者(Follower) | follower從客戶端接收寫入請求,并將它們轉(zhuǎn)發(fā)到leader znode。 |
請求處理器(request processor) | 只存在于leader節(jié)點(diǎn)。它管理來自follower節(jié)點(diǎn)的寫入請求。 |
原子廣播(atomic broadcasts) | 負(fù)責(zé)廣播從leader節(jié)點(diǎn)到follower節(jié)點(diǎn)的變化。 |
更多建議: