【Zookeeper靈魂】一個關於Paxos算法的故事

作者:大數據研習社 
來源:CSDN 
原文:https://blog.csdn.net/dajiangtai007/article/details/68488701 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

Zookeeper默認採用FastLeaderElection算法,然而FastLeaderElection對於Zookeeper來講只是相當於paxos中的leader選舉。 
  下面我們用最簡單的方式加以描述並建立起Paxos和ZKServer的對應關係。 
   
相關資料:《ZooKeeper管理員指南》免費領取,領取辦法:關注“大數據研習社”,微信後臺回覆“zookeeper”,即可獲得下載鏈接。查看歷史消息,獲取更多資料! 
掃描二維碼關注微信: 


  Paxos描述了這樣一個場景: 
 
  1、有一個叫做Paxos的小島(Island)上面住了一批居民,島上面所有的事情由一些特殊的人決定,他們叫做議員(Senator)。 
  2、議員的總數(SenatorCount)是確定的,不能更改。 
  3、島上每次環境事務的變更都需要通過一個提議(Proposal),每個提議都有一個編號(PID),這個編號是一直增長的,不能倒退。 
  4、每個提議都需要超過半數((SenatorCount)/2+1)的議員同意才能生效。 
  5、每個議員只會同意大於當前編號的提議,包括已生效的和未生效的。 
  6、如果議員收到小於等於當前編號的提議,他會拒絕,並告知對方:你的提議已經有人提過了。這裏的當前編號是每個議員在自己記事本上面記錄的編號,他不斷更新這個編號。整個議會不能保證所有議員記事本上的編號總是相同的。 
現在議會有一個目標:保證所有的議員對於提議都能達成一致的看法。 
 
  好,現在議會開始運作,所有議員一開始記事本上面記錄的編號都是0。 
  有一個議員發了一個提議: 
  將電費設定爲1元/度。他首先看了一下記事本,嗯,當前提議編號是0,那麼我的這個提議的編號就是1,於是他給所有議員發消息:1號提議,設定電費1元/度。其他議員收到消息以後查了一下記事本,哦,當前提議編號是0,這個提議可接受,於是他記錄下這個提議並回復:我接受你的1號提議,同時他在記事本上記錄:當前提議編號爲1。發起提議的議員收到了超過半數的回覆,立即給所有人發通知:1號提議生效!收到的議員會修改他的記事本,將1好提議由記錄改成正式的法令,當有人問他電費爲多少時,他會查看法令並告訴對方:1元/度。 
現在看衝突的解決: 
 
  假設總共有三個議員S1-S3,S1和S2同時發起了一個提議:1號提議,設定電費。S1想設爲1元/度,S2想設爲2元/度。結果S3先收到了S1的提議,於是他做了和前面同樣的操作。緊接着他又收到了S2的提議,結果他一查記事本,咦,這個提議的編號小於等於我的當前編號1,於是他拒絕了這個提議:對不起,這個提議先前提過了。於是S2的提議被拒絕,S1正式發佈了提議:1號提議生效。S2向S1或者S3打聽並更新了1號法令的內容,然後他可以選擇繼續發起2號提議。 
  好,我覺得Paxos的精華就這麼多內容。現在讓我們來對號入座,看看在ZKServer裏面Paxos是如何得以貫徹實施的。 
  小島(Island)——ZKServerCluster 
  議員(Senator)——ZKServer 
  提議(Proposal)——ZNodeChange(Create/Delete/SetData…) 
  提議編號(PID)——Zxid(ZooKeeperTransactionId) 
正式法令——所有ZNode及其數據: 
  貌似關鍵的概念都能一一對應上,但是等一下,Paxos島上的議員應該是人人平等的吧,而ZKServer好像有一個Leader的概念。沒錯,其實Leader的概念也應該屬於Paxos範疇的。如果議員人人平等,在某種情況下會由於提議的衝突而產生一個“活鎖”(所謂活鎖我的理解是大家都沒有死,都在動,但是一直解決不了衝突問題)。Paxos的作者Lamport在他的文章”ThePart-TimeParliament“中闡述了這個問題並給出瞭解決方案——在所有議員中設立一個總統,只有總統有權發出提議,如果議員有自己的提議,必須發給總統並由總統來提出。好,我們又多了一個角色:總統。 
  總統——ZKServerLeader 
又一個問題產生了,總統怎麼選出來的? 
  現在我們假設總統已經選好了,下面看看ZKServer是怎麼實施的。 
 
情況一: 
  屁民甲(Client)到某個議員(ZKServer)那裏詢問(Get)某條法令的情況(ZNode的數據),議員毫不猶豫的拿出他的記事本(localstorage),查閱法令並告訴他結果,同時聲明:我的數據不一定是最新的。你想要最新的數據?沒問題,等着,等我找總統Sync一下再告訴你。 
情況二: 
  屁民乙(Client)到某個議員(ZKServer)那裏要求政府歸還欠他的一萬元錢,議員讓他在辦公室等着,自己將問題反映給了總統,總統詢問所有議員的意見,多數議員表示欠屁民的錢一定要還,於是總統發表聲明,從國庫中拿出一萬元還債,國庫總資產由100萬變成99萬。屁民乙拿到錢回去了(Client函數返回)。 
情況三: 
  總統突然掛了,議員接二連三的發現聯繫不上總統,於是各自發表聲明,推選新的總統,總統大選期間政府停業,拒絕屁民的請求。 
  呵呵,到此爲止吧,當然還有很多其他的情況,但這些情況總是能在Paxos的算法中找到原型並加以解決。這也正是我們認爲Paxos是Zookeeper的靈魂的原因。當然ZKServer還有很多屬於自己特性的東西:Session,Watcher,Version等等,需要我們花更多的時間去研究和學習。
--------------------- 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章