是一個(gè)高可靠炎辨、高可用、高性能的分布式一致系統(tǒng)娩井,核心為ZAB協(xié)議呜投。
zookeeper實(shí)現(xiàn)數(shù)據(jù)一致性的核心是ZAB協(xié)議(Zookeeper原子消息廣播協(xié)議)。該協(xié)議需要做到以下幾點(diǎn):
(1)集群在半數(shù)以下節(jié)點(diǎn)宕機(jī)的情況下炫隶,能正常對(duì)外提供服務(wù)淋叶;
(2)客戶端的寫請(qǐng)求全部轉(zhuǎn)交給leader來(lái)處理,leader需確保寫變更能實(shí)時(shí)同步給所有follower及observer伪阶;
(3)leader宕機(jī)或整個(gè)集群重啟時(shí)煞檩,需要確保那些已經(jīng)在leader服務(wù)器上提交的事務(wù)最終被所有服務(wù)器都提交,確保丟棄那些只在leader服務(wù)器上被提出的事務(wù)栅贴,并保證集群能快速恢復(fù)到故障前的狀態(tài)斟湃。
高性能:全部數(shù)據(jù)內(nèi)存存儲(chǔ),即存儲(chǔ)的數(shù)據(jù)量是有限的檐薯,受限于所在宿主機(jī)的內(nèi)存的大小
高可用:只要可用機(jī)器數(shù)在一半以上就是可用的凝赛。
一致性:ZAB協(xié)議保證注暗,事務(wù)要么完成,要么未完成墓猎,未有中間狀態(tài)捆昏。
共同點(diǎn):
leader向所有的followers提議。
leader在收到一定數(shù)目的followers的ack之后毙沾,才會(huì)commit骗卜。
提議中包含epoch,類似于paxos的ballot number左胞。
不同點(diǎn):
一個(gè)有狀態(tài)的機(jī)器(zab協(xié)議)是用來(lái)處理一系列的請(qǐng)求寇仓。一個(gè)有狀態(tài)的機(jī)器復(fù)制系統(tǒng),是一個(gè)clientserver系統(tǒng)烤宙,每個(gè)狀態(tài)機(jī)器的復(fù)制請(qǐng)求都會(huì)按照client請(qǐng)求的順序進(jìn)行執(zhí)行遍烦。
在主備份系統(tǒng)中(paxos協(xié)議),一致性是delta狀態(tài)的一致性躺枕。由主備份產(chǎn)生并發(fā)送給followers乳愉。
leader followers:有一個(gè)唯一的leader,若干個(gè)followers屯远,leader+followers滿足奇數(shù)個(gè)蔓姚。leader角色負(fù)責(zé)接受所有的從clients或者從follower以副本形式發(fā)過(guò)來(lái)的變更狀態(tài)。讀請(qǐng)求則在所有的followers與leader之間進(jìn)行負(fù)載均衡慨丐。
事務(wù):所有的狀態(tài)變更由leader廣播給所有的followers
e- leader的標(biāo)志坡脐。epoch是一個(gè)整數(shù),在一個(gè)leader開始領(lǐng)導(dǎo)的時(shí)候產(chǎn)生房揭,并且應(yīng)該比前面的leader的epoch都大
c-leader產(chǎn)生的一個(gè)順序數(shù)字备闲,從0開始并且遞增。與epoch一起用來(lái)標(biāo)識(shí)從client過(guò)來(lái)的狀態(tài)變化
F.history-followers的歷史隊(duì)列捅暴。用來(lái)有順序的提交過(guò)來(lái)事務(wù)順序恬砂。
clients可以從zk nodes的任何一個(gè)server讀數(shù)據(jù);
clients的寫狀態(tài)變更可以發(fā)送到任何一個(gè)server蓬痒,這個(gè)狀態(tài)的變更被轉(zhuǎn)發(fā)到leader節(jié)點(diǎn)泻骤。zk 用一個(gè)改良的二階段提交協(xié)議將復(fù)制的事務(wù)發(fā)送給followers。當(dāng)leader收到client的變更請(qǐng)求梧奢,leader會(huì)產(chǎn)生一個(gè)帶有sequencenumber以及epoch的事務(wù)發(fā)送給所有的followers狱掂。一個(gè)follower將事務(wù)添加到歷史隊(duì)列中并發(fā)送ack給leader。當(dāng)leader收到法定個(gè)數(shù)的ack亲轨,就會(huì)發(fā)送commit請(qǐng)求趋惨。一個(gè)follower接收COMMIT請(qǐng)求,并提交事務(wù)惦蚊;除非sequencenumber比歷史隊(duì)列中的sequencenumber大器虾?讯嫂。在提交之前,等待收到所有的比它早的事務(wù)兆沙。
如果leader崩潰端姚,所有的nodes將拒絕服務(wù),并會(huì)執(zhí)行恢復(fù)協(xié)議來(lái)達(dá)成一致?tīng)顟B(tài)挤悉,選舉一個(gè)新的leader來(lái)廣播狀態(tài)變更。
為了選擇leader巫湘,node必須獲取一定數(shù)目nodes的支持装悲。
node的生命周期:每個(gè)node在一定時(shí)間內(nèi)會(huì)執(zhí)行協(xié)議的迭代。在任何時(shí)間點(diǎn)尚氛,一個(gè)進(jìn)程可能放棄當(dāng)前的迭代诀诊,并開始一個(gè)新的階段0
階段0-預(yù)期leader選舉
階段1-發(fā)現(xiàn)
階段2-同步
階段3-廣播
階段1 和 2 對(duì)于達(dá)成一致?tīng)顟B(tài),特別是從崩潰中恢復(fù)至關(guān)重要
階段1-發(fā)現(xiàn) 在這個(gè)階段阅嘶,followers對(duì)他們預(yù)期的leader進(jìn)行通信属瓣,leader 收集followers接收的最近最新的事務(wù)信息。這個(gè)階段的目的是在一定樹木中發(fā)現(xiàn)接受的事務(wù)的最新sequence讯柔,建立一個(gè)新的epoch抡蛙,讓以前的leaders不能提交新的提議。因?yàn)橐欢〝?shù)目的followers有前面的leader發(fā)送的已經(jīng)接受的所有的變更-那么至少有一個(gè)follower在他的歷史隊(duì)列中有所有已經(jīng)接受的變更魂迄,這就意味著新的leader也會(huì)擁有他們粗截。
階段2-同步 同步階段包含協(xié)議的恢復(fù)階段,將在發(fā)現(xiàn)階段更新的歷史事務(wù)在集群間同步所有的備份捣炬。leader與followers進(jìn)行通信熊昌,提議事務(wù)。followers確認(rèn)提議湿酸。當(dāng)leader收到一定數(shù)目的acks婿屹,leader就會(huì)發(fā)起一個(gè)commit 信息。在那個(gè)時(shí)候推溃,leader已經(jīng)建立了昂利,已經(jīng)是非預(yù)期了。
階段3-廣播 如果沒(méi)有崩潰铁坎,集群將會(huì)永遠(yuǎn)在這個(gè)階段页眯,當(dāng)client發(fā)起一個(gè)寫請(qǐng)求的時(shí)候,在集群之間進(jìn)行廣播事務(wù)厢呵。為了發(fā)現(xiàn)失敗窝撵,zab 在leader與followers之間有周期性的心跳。如果在給定時(shí)間內(nèi)leader未收到一定數(shù)目的心跳襟铭,它將會(huì)放棄他的領(lǐng)導(dǎo)地位碌奉,并開始選舉階段0.如果follower未在一定時(shí)間內(nèi)收到心跳短曾,也會(huì)發(fā)起選舉leader。
https://cwiki.apache.org/confluence/display/ZOOKEEPER/Zab1.0
https://cwiki.apache.org/confluence/display/ZOOKEEPER/Zab+vs.+Paxos