大數(shù)據(jù)學(xué)習(xí):ZooKeeper工作原理
在大數(shù)據(jù)生態(tài)當(dāng)中,分布式集群當(dāng)中的一個(gè)重要組件,就是Zookeeper,作為集群運(yùn)行的重要管理者,正如其名字“動物園管理員”所示,負(fù)責(zé)集群運(yùn)行的諸多事宜。今天的大數(shù)據(jù)學(xué)習(xí)分享,我們就來具體講講,ZooKeeper工作原理。
在Zookeeper的工作流程當(dāng)中,各個(gè)節(jié)點(diǎn)當(dāng)中,主要涉及到三個(gè)角色和四種狀態(tài),這也是構(gòu)成Zookeeper體系架構(gòu)的重要組成部分。
ZooKeeper角色和狀態(tài)
角色:Leader,F(xiàn)ollower,Observer。
狀態(tài):Leading,F(xiàn)ollowing,Observing,Looking。
Looking:當(dāng)前Server不知道Leader是誰,正在搜尋。
Leading:當(dāng)前Server即為選舉出來的Leader。
Following:Leader已經(jīng)選舉出來,當(dāng)前Server與之同步。
Observing:Observer的行為在大多數(shù)情況下與Follower完全一致,但是他們不參加選舉和投票,而僅僅接受(observing)選舉和投票的結(jié)果。
Zookeeper工作流程
Leader Election
當(dāng)Leader崩潰或者Leader失去大多數(shù)的Follower,這時(shí)候ZK進(jìn)入恢復(fù)模式,恢復(fù)模式需要重新選舉出一個(gè)新的Leader,讓所有的Server都恢復(fù)到一個(gè)正確的狀態(tài)。
Zk的選舉算法有兩種:一種是基于Basic paxos實(shí)現(xiàn)的,另外一種是基于Fast paxos算法實(shí)現(xiàn)的。
系統(tǒng)默認(rèn)的選舉算法為Fast paxos。
Fast paxos流程是在選舉過程中,某Server首先向所有Server提議自己要成為Leader,當(dāng)其它Server收到提議以后,解決epoch和zxid的沖突,并接受對方的提議,然后向?qū)Ψ桨l(fā)送接受提議完成的消息,重復(fù)這個(gè)流程,最后一定能選舉出Leader。
Leader工作流程
Leader主要有三個(gè)功能:
恢復(fù)數(shù)據(jù);
維持與Follower的心跳,接收Follower請求并判斷Follower的請求消息類型;
Follower的消息類型主要有PING消息、REQUEST消息、ACK消息、REVALIDATE消息,根據(jù)不同的消息類型,進(jìn)行不同的處理。
Follower主要有四個(gè)功能:
向Leader發(fā)送請求(PING消息、REQUEST消息、ACK消息、REVALIDATE消息);
接收Leader消息并進(jìn)行處理;
接收Client的請求,如果為寫請求,發(fā)送給Leader進(jìn)行投票;
返回Client結(jié)果。
Follower的消息循環(huán)處理如下幾種來自Leader的消息:
PING消息:心跳消息
PROPOSAL消息:Leader發(fā)起的提案,要求Follower投票
COMMIT消息:服務(wù)器端最新一次提案的信息
UPTODATE消息:表明同步完成
REVALIDATE消息:根據(jù)Leader的REVALIDATE結(jié)果,關(guān)閉待revalidate的session還是允許其接受消息
SYNC消息:返回SYNC結(jié)果到客戶端,這個(gè)消息最初由客戶端發(fā)起,用來強(qiáng)制得到最新的更新。
Zab協(xié)議(ZooKeeper Atomic Broadcast protocol)
Zookeeper的核心是原子廣播,這個(gè)機(jī)制保證了各個(gè)Server之間的同步。Zab協(xié)議有兩種模式,它們分別是恢復(fù)模式(Recovery選主)和廣播模式(Broadcast同步)。
當(dāng)服務(wù)啟動或者在領(lǐng)導(dǎo)者崩潰后,Zab就進(jìn)入了恢復(fù)模式,當(dāng)領(lǐng)導(dǎo)者被選舉出來,且大多數(shù)Server完成了和Leader的狀態(tài)同步以后,恢復(fù)模式就結(jié)束了。狀態(tài)同步保證了Leader和Server具有相同的系統(tǒng)狀態(tài)。
為了保證事務(wù)的順序一致性,zookeeper采用了遞增的事務(wù)id號(zxid)來標(biāo)識事務(wù)。所有的提議(proposal)都在被提出的時(shí)候加上了zxid。
實(shí)現(xiàn)中zxid是一個(gè)64位的數(shù)字,它高32位是epoch用來標(biāo)識Leader關(guān)系是否改變,每次一個(gè)Leader被選出來,它都會有一個(gè)新的epoch,標(biāo)識當(dāng)前屬于那個(gè)Leader的統(tǒng)治時(shí)期。低32位用于遞增計(jì)數(shù)。