[轉(zhuǎn)載]Zookeeper全解析——Paxos作為靈魂

Paxos描述了這樣一個場景,有一個叫做Paxos的小島(Island)上面住了一批居民,島上面所有的事情由一些特殊的人決定,他們叫做議員(Senator)。議員的總數(shù)(Senator Count)是確定的,不能更改。島上每次環(huán)境事務的變更都需要通過一個提議(Proposal),每個提議都有一個編號(PID),這個編號是一直增長的,不能倒退。每個提議都需要超過半數(shù)((Senator Count)/2 +1)的議員同意才能生效。每個議員只會同意大于當前編號的提議,包括已生效的和未生效的。如果議員收到小于等于當前編號的提議,他會拒絕,并告知對方:你的提議已經(jīng)有人提過了。這里的當前編號是每個議員在自己記事本上面記錄的編號,他不斷更新這個編號。整個議會不能保證所有議員記事本上的編號總是相同的?,F(xiàn)在議會有一個目標:保證所有的議員對于提議都能達成一致的看法。

好,現(xiàn)在議會開始運作,所有議員一開始記事本上面記錄的編號都是0。有一個議員發(fā)了一個提議:將電費設定為1元/度。他首先看了一下記事本,嗯,當前提議編號是0,那么我的這個提議的編號就是1,于是他給所有議員發(fā)消息:1號提議,設定電費1元/度。其他議員收到消息以后查了一下記事本,哦,當前提議編號是0,這個提議可接受,于是他記錄下這個提議并回復:我接受你的1號提議,同時他在記事本上記錄:當前提議編號為1。發(fā)起提議的議員收到了超過半數(shù)的回復,立即給所有人發(fā)通知:1號提議生效!收到的議員會修改他的記事本,將1好提議由記錄改成正式的法令,當有人問他電費為多少時,他會查看法令并告訴對方:1元/度。

現(xiàn)在看沖突的解決:假設總共有三個議員S1-S3,S1和S2同時發(fā)起了一個提議:1號提議,設定電費。S1想設為1元/度, S2想設為2元/度。結(jié)果S3先收到了S1的提議,于是他做了和前面同樣的操作。緊接著他又收到了S2的提議,結(jié)果他一查記事本,咦,這個提議的編號小于等于我的當前編號1,于是他拒絕了這個提議:對不起,這個提議先前提過了。于是S2的提議被拒絕,S1正式發(fā)布了提議: 1號提議生效。S2向S1或者S3打聽并更新了1號法令的內(nèi)容,然后他可以選擇繼續(xù)發(fā)起2號提議。

好,我覺得Paxos的精華就這么多內(nèi)容?,F(xiàn)在讓我們來對號入座,看看在ZK Server里面Paxos是如何得以貫徹實施的。

小島(Island)——ZK Server Cluster

議員(Senator)——ZK Server

提議(Proposal)——ZNode Change(Create/Delete/SetData…)

提議編號(PID)——Zxid(ZooKeeper Transaction Id)

正式法令——所有ZNode及其數(shù)據(jù)

貌似關鍵的概念都能一一對應上,但是等一下,Paxos島上的議員應該是人人平等的吧,而ZK Server好像有一個Leader的概念。沒錯,其實Leader的概念也應該屬于Paxos范疇的。如果議員人人平等,在某種情況下會由于提議的沖突而產(chǎn)生一個“活鎖”(所謂活鎖我的理解是大家都沒有死,都在動,但是一直解決不了沖突問題)。Paxos的作者Lamport在他的文章”The Part-Time Parliament“中闡述了這個問題并給出了解決方案——在所有議員中設立一個總統(tǒng),只有總統(tǒng)有權(quán)發(fā)出提議,如果議員有自己的提議,必須發(fā)給總統(tǒng)并由總統(tǒng)來提出。好,我們又多了一個角色:總統(tǒng)。

總統(tǒng)——ZK Server Leader

又一個問題產(chǎn)生了,總統(tǒng)怎么選出來的?oh, my god! It’s a long story. 在淘寶核心系統(tǒng)團隊的Blog上面有一篇文章是介紹如何選出總統(tǒng)的,有興趣的可以去看看:http://rdc.taobao.com/blog/cs/?p=162

現(xiàn)在我們假設總統(tǒng)已經(jīng)選好了,下面看看ZK Server是怎么實施的。

情況一:

屁民甲(Client)到某個議員(ZK Server)那里詢問(Get)某條法令的情況(ZNode的數(shù)據(jù)),議員毫不猶豫的拿出他的記事本(local storage),查閱法令并告訴他結(jié)果,同時聲明:我的數(shù)據(jù)不一定是最新的。你想要最新的數(shù)據(jù)?沒問題,等著,等我找總統(tǒng)Sync一下再告訴你。

情況二:

屁民乙(Client)到某個議員(ZK Server)那里要求政府歸還欠他的一萬元錢,議員讓他在辦公室等著,自己將問題反映給了總統(tǒng),總統(tǒng)詢問所有議員的意見,多數(shù)議員表示欠屁民的錢一定要還,于是總統(tǒng)發(fā)表聲明,從國庫中拿出一萬元還債,國庫總資產(chǎn)由100萬變成99萬。屁民乙拿到錢回去了(Client函數(shù)返回)。

情況三:

總統(tǒng)突然掛了,議員接二連三的發(fā)現(xiàn)聯(lián)系不上總統(tǒng),于是各自發(fā)表聲明,推選新的總統(tǒng),總統(tǒng)大選期間政府停業(yè),拒絕屁民的請求。

呵呵,到此為止吧,當然還有很多其他的情況,但這些情況總是能在Paxos的算法中找到原型并加以解決。這也正是我們認為Paxos是Zookeeper的靈魂的原因。當然ZK Server還有很多屬于自己特性的東西:Session, Watcher,Version等等等等,需要我們花更多的時間去研究和學習。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容