zookeeper是如何实现数据一致性的?
轉(zhuǎn)載自?https://blog.csdn.net/qqqq0199181/article/details/80865828
眾所周知,zookeeper是一個開源的分布式協(xié)調(diào)服務(wù),很多分布式的應(yīng)用都是基于zookeeper來實(shí)現(xiàn)分布式鎖,服務(wù)管理,服務(wù)發(fā)現(xiàn),通知訂閱等功能。那么。zookeeper自身是如何在分布式環(huán)境下實(shí)現(xiàn)數(shù)據(jù)的一致性的呢。
結(jié)構(gòu)
既然zookeeper是在分布式環(huán)境下提供服務(wù)的,那么它必須要解決的問題就是單點(diǎn)問題,因此zookeeper是一個主備的結(jié)構(gòu)。zookeeper 存在leader,follower,observer三種角色,這三種角色在實(shí)際服務(wù)集群中都是服務(wù)節(jié)點(diǎn)。
leader:處理所有請求,為客戶的提供讀和寫服務(wù)
follower:只提供讀服務(wù),有機(jī)會通過選舉成為leader
observer:只提供讀服務(wù)?
由以上三種角色的介紹可知,zookeeper中所有請求都是交給leader處理的,因此,如果leader掛了,zookeeper就無法再提供服務(wù),這就是單點(diǎn)問題。所幸在leader掛了之后,follower能夠通過選舉成為新的leader。?
那么問題來了,follower是如何被選舉成為新的leader的?新的leader又是如何保證數(shù)據(jù)的一致性的?這些問題的答案都在于zookeeper所用的分布式一致性協(xié)議ZAB。
ZAB協(xié)議
ZAB協(xié)議是為zookeeper專門設(shè)計(jì)的一種支持奔潰恢復(fù)的原子廣播協(xié)議。雖然它不像Paxos算法那樣通用通用,但是它卻比Paxos算法易于理解。在我看來ZAB協(xié)議主要的作用在于三個方面1、選舉出leader;2、同步節(jié)點(diǎn)之間的狀態(tài)達(dá)到數(shù)據(jù)一致;3、數(shù)據(jù)的廣播。
幾個概念的定義
在了解ZAB協(xié)議具體過程之前不要先了解幾個概念。
事務(wù)
zookeeper作為一個分布式協(xié)調(diào)服務(wù),需要leader節(jié)點(diǎn)去接受外部請求,轉(zhuǎn)化為內(nèi)部操作(比如創(chuàng)建,修改,刪除節(jié)點(diǎn)),需要原子性執(zhí)行的幾個操作就組成了事務(wù),這里用T代表。zookeeper要求有序的處理事務(wù),因此給每個事務(wù)一個編號,每進(jìn)來一個事務(wù)編號加1,假設(shè)leader節(jié)點(diǎn)中進(jìn)來n個事務(wù),可以表示為T1,T2,T3…Tn。為了防止單點(diǎn)問題導(dǎo)致事務(wù)數(shù)據(jù)丟失,leader節(jié)點(diǎn)會把事務(wù)數(shù)據(jù)同步到follower節(jié)點(diǎn)中。
事務(wù)隊(duì)列
leader和follower都會保存一個事務(wù)隊(duì)列,用L表示,L=T1,T2,T3…Tn,leader的事務(wù)隊(duì)列是接受請求保存下來的,follower的事務(wù)隊(duì)列是leader同步過來的,因此leader的事務(wù)隊(duì)列是最新,最全的。
任期
在zookeeper的工作過程中,leader節(jié)點(diǎn)奔潰,重新選舉出新的leader是很正常的事情,所以zookeeper的運(yùn)行歷史中會產(chǎn)生多個leader,就好比一個國家的歷史中會相繼出現(xiàn)多為領(lǐng)導(dǎo)人。為了區(qū)分各個leader,ZAB協(xié)議用一個整數(shù)來表示任期,我們假設(shè)用E表示任務(wù)。zookeeper剛運(yùn)行時選舉出的第一個leader的任期為E=1;第一個leader奔潰后,下面選舉出來的leader,任期會加1,E=2;一次類推。加入任期概念的事務(wù)應(yīng)該表示為T(E,n)
協(xié)議過程
選舉leader
每個follower廣播自己事務(wù)隊(duì)列中最大事務(wù)編號maxId
獲取集群中其他follower發(fā)出來的maxId,選取出最大的maxId所屬的follower,投票給改follower,選它為leader。
統(tǒng)計(jì)所有投票,獲取投票數(shù)超過一半的follower被推選為leader
同步數(shù)據(jù)
各個follower向leader發(fā)送自己保存的任期E
leader,比較所有的任期,選取最大的E,加1后作為當(dāng)前的任期E=E+1
將任務(wù)E廣播給所有follower
follower將任期改為leader發(fā)過來的值,并且返回給leader事務(wù)隊(duì)列L
leader從隊(duì)列集合中選取任期最大的隊(duì)列,如果有多個隊(duì)列任期都是最大,則選取事務(wù)編號n最大的隊(duì)列Lmax。將Lmax最為leader隊(duì)列,并且廣播給各個follower。
follower接收隊(duì)列替換自己的事務(wù)隊(duì)列,并且執(zhí)行提交隊(duì)列中的事務(wù)。?
至此各個節(jié)點(diǎn)的數(shù)據(jù)達(dá)成一致,zookeeper恢復(fù)正常服務(wù)。
廣播
leader節(jié)點(diǎn)接收到請求,將事務(wù)加入事務(wù)隊(duì)列,并且將事務(wù)廣播給各個follower。
follower接收事務(wù)并加入都事務(wù)隊(duì)列,然后給leader發(fā)送準(zhǔn)備提交請求。
leader 接收到半數(shù)以上的準(zhǔn)備提交請求后,提交事務(wù)同時向follower 發(fā)送提交事務(wù)請求
follower提交事務(wù)。
?
總結(jié)
以上是生活随笔為你收集整理的zookeeper是如何实现数据一致性的?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java的,与类的初始化顺序
- 下一篇: java,获取微信分享需要的获取 sig