zookeeper學習筆記(轉載)


一個分佈式的,開放源碼的分佈式協調服務,是Hadoop和Hbase的重要組件;它是一個爲分佈式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分佈式同步、組服務等。
它主要是用來解決分佈式應用中經常遇到的一些數據管理問題,如:統一命名服務、狀態同步服務、集羣管理、分佈式應用配置項的管理等。

特點:

  1. ZooKeeper的目標就是封裝好複雜易出錯的關鍵服務,將簡單易用的接口和性能高效、功能穩定的系統提供給用戶。
  2. ZooKeeper包含一個簡單的原語集,提供Java和C的接口。
  3. ZooKeeper代碼版本中,提供了分佈式獨享鎖、選舉、隊列的接口,代碼在zookeeper-3.4.3\src\recipes。其中分佈鎖和隊列有Java和C兩個版本,選舉只有Java版本。

Paxos算法

拜占庭將軍問題
	拜占庭帝國就是5~15世紀的東羅馬帝國,拜占庭即現在土耳其的伊斯坦布爾。我們可以想象,拜占庭軍隊有許多分支,駐紮在敵人城外,每一分支由各自的將軍指揮。將軍們只能靠通訊員進行通訊。在觀察敵人以後,忠誠的將軍們必須制訂一個統一的行動計劃——進攻或者撤退。然而,這些將軍中有叛徒,他們不希望忠誠的將軍們能達成一致,因而影響統一行動計劃的制訂與傳播。
	問題是:將軍們必須有一個協議,使所有忠誠的將軍們能夠達成一致,而且少數幾個叛徒不能使忠誠的將軍們作出錯誤的計劃——使有些將軍進攻而另一些將軍撤退。
	如果這11位將軍中有間諜呢? 假設有9位忠誠的將軍,5位判斷進攻,4位判斷撤退,還有2個間諜惡意判斷撤退,雖然結果是錯誤的撤退,但這種情況完全是允許的。因爲這11位將軍依然保持着狀態一致性。

1.11位將軍進攻城池
2.同時進攻(議案、決議)、同時撤退(議案、決議)
3.不管撤退還是進攻,必須半數的將軍統一意見纔可以執行
4.將軍裏面有叛徒,會干擾決議生成

在Paxos算法面前,其他(包括2P、3P)都是殘次品。Google Chubby的作者Mike Burrows說過這個世界上只有一種一致性算法,那就是Paxos,其它的算法都是殘次品。
Paxos算法思想

多數派決議(最終解決一致性問題)
有些類似於法案頒發的“民主”決策:

  1. 提案者先分發草案給各議員採集意見,議員用自己的接收準則進行回覆(未接收過則接收並回復OK;否則比較與之前接收過的編號大小,大於則替換並回復OK,不然回覆ERROR);
  2. 提案者接收回復,集中判斷——多數派爲勝(否則從頭遞歸),提出篩選過的準法案再次分發確認,議員接收批准方案再進行回覆(類似於1的回覆規則);
  3. 提案者第二接收回復,判斷準法案成功與否,成功即爲正式法案(否則從頭遞歸)。

三種角色:
(1)Proposer:(議案)提交者
提交議案(判斷是否過半),提交批准議案(判斷是否過半)
(2)Acceptor:(議案)接收者
接受議案或者駁回議案,給proposer迴應(promise)
(3)Learner: (議案)學習者(打醬油的)
如果議案產生,學習議案。

規則約定
設定1:如果Acceptor沒有接受議案,那麼他必須接受第一個議案
設定2:每個議案必須有一個編號,編號惟一且遞增。
設定3:只接受編號大的議案,小於之前接受議案編號不接受
設定4:議案有2種(提交的議案,批准的議案)

選舉過程

在這裏插入圖片描述
選舉解說:

  1. Prepare階段(決議提交)
    a)Proposer希望議案V。首先發出Prepare請求至大多數Acceptor。Prepare請求內容爲序列號K
    b)Acceptor收到Prepare請求爲編號K後,檢查自己手裏是否有處理過Prepare請求。
    c)如果Acceptor沒有接受過任何Prepare請求,那麼用OK來回復Proposer,代表Acceptor必須接受收到的第一個議案(設定1)
    d)否則,如果Acceptor之前接受過任何Prepare請求(如:MaxN),那麼比較議案編號,如果K<MaxN,則用reject或者error回覆Proposer
    e)如果K>=MaxN,那麼檢查之前是否有批准的議案,如果沒有則用OK來回復Proposer,並記錄K
    f)如果K>=MaxN,那麼檢查之前是否有批准的議案,如果有則回覆批准的議案編號和議案內容(如:<AcceptN, AcceptV>, AcceptN爲批准的議案編號,AcceptV爲批准的議案內容)

  2. Accept階段(批准階段)
    a)Proposer收到過半Acceptor發來的回覆,回覆都是OK,且沒有附帶任 何批准過的議案編號和議案內容。那麼Proposer繼續提交批准請求,不過此時會連議案編號K和議案內容V一起提交(<K, V>這種數據形式)
    b)Proposer收到過半Acceptor發來的回覆,回覆都是OK,且附帶批准過的議案編號和議案內容(<pok,議案編號,議案內容>)。那麼Proposer找到所有回覆中超過半數的那個(假設爲<pok,AcceptNx,AcceptVx>)作爲提交批准請求(請求爲<K,AcceptVx>)發送給Acceptor。
    c)Proposer沒有收到過半Acceptor發來的回覆,則修改議案編號K爲Kx,並將編號重新發送給Acceptors(重複Prepare階段的過程)
    d)Acceptor收到Proposer發來的Accept請求,如果編號K<MaxN則不迴應或者reject。
    e)Acceptor收到Proposer發來的Accept請求,如果編號K>=MaxN則批准該議案,並設置手裏批准的議案爲<K,接受議案的編號,接受議案的內容>,回覆Proposer。
    f)經過一段時間Proposer對比手裏收到的Accept回覆,如果超過半數,則結束流程(代表議案被批准),同時通知Leaner可以學習議案。
    g)經過一段時間Proposer對比手裏收到的Accept回覆,如果未超過半數,則修改議案編號重新進入Prepare階段。

Paxos例子

  1. 先後提議的場景

角色:
proposer:參謀1,參謀2
acceptor:將軍1,將軍2,將軍3(決策者)

  1. 參謀1發起提議,派通信兵帶信給3個將軍,內容爲(編號1);

  2. 3個將軍收到參謀1的提議,由於之前還沒有保存任何編號,因此把(編號1)保存下來,避免遺忘;同時讓通信兵帶信回去,內容爲(ok);

  3. 參謀1收到至少2個將軍的回覆,再次派通信兵帶信給3個將軍,內容爲(編號1,進攻時間1);

  4. 3個將軍收到參謀1的時間,把(編號1,進攻時間1)保存下來,避免遺忘;同時讓通信兵帶信回去,內容爲(Accepted);

  5. 參謀1收到至少2個將軍的(Accepted)內容,確認進攻時間已經被大家接收;

  6. 參謀2發起提議,派通信兵帶信給3個將軍,內容爲(編號2);

  7. 3個將軍收到參謀2的提議,由於(編號2)比(編號1)大,因此把(編號2)保存下來,避免遺忘;又由於之前已經接受參謀1的提議,因此讓通信兵帶信回去,內容爲(編號1,進攻時間1);

  8. 參謀2收到至少2個將軍的回覆,由於回覆中帶來了已接受的參謀1的提議內容,參謀2因此不再提出新的進攻時間,接受參謀1提出的時間;

在這裏插入圖片描述

  1. 交叉場景
    proposer:參謀1,參謀2
    acceptor:將軍1,將軍2,將軍3(決策者)

  2. 參謀1發起提議,派通信兵帶信給3個將軍,內容爲(編號1);

  3. 3個將軍的情況如下
    a)將軍1和將軍2收到參謀1的提議,將軍1和將軍2把(編號1)記錄下來,如果有其他參謀提出更小的編號,將被拒絕;同時讓通信兵帶信回去,內容爲(ok);
    b)負責通知將軍3的通信兵被抓,因此將軍3沒收到參謀1的提議;

  4. 參謀2在同一時間也發起了提議,派通信兵帶信給3個將軍,內容爲(編號2);

  5. 3個將軍的情況如下
    a)將軍2和將軍3收到參謀2的提議,將軍2和將軍3把(編號2)記錄下來,如果有其他參謀提出更小的編號,將被拒絕;同時讓通信兵帶信回去,內容爲(ok);
    b)負責通知將軍1的通信兵被抓,因此將軍1沒收到參謀2的提議;

  6. 參謀1收到至少2個將軍的回覆,再次派通信兵帶信給有答覆的2個將軍,內容爲(編號1,進攻時間1);

  7. 2個將軍的情況如下
    a)將軍1收到了(編號1,進攻時間1),和自己保存的編號相同,因此把(編號1,進攻時間1)保存下來;同時讓通信兵帶信回去,內容爲(Accepted);
    b)將軍2收到了(編號1,進攻時間1),由於(編號1)小於已經保存的(編號2),因此讓通信兵帶信回去,內容爲(Rejected,編號2);

  8. 參謀2收到至少2個將軍的回覆,再次派通信兵帶信給有答覆的2個將軍,內容爲(編號2,進攻時間2);

  9. 將軍2和將軍3收到了(編號2,進攻時間2),和自己保存的編號相同,因此把(編號2,進攻時間2)保存下來,同時讓通信兵帶信回去,內容爲(Accepted);

  10. 參謀2收到至少2個將軍的(Accepted)內容,確認進攻時間已經被多數派接受;

  11. 參謀1只收到了1個將軍的(Accepted)內容,同時收到一個(Rejected,編號2);參謀1重新發起提議,派通信兵帶信給3個將軍,內容爲(編號3);

  12. 3個將軍的情況如下
    a)將軍1收到參謀1的提議,由於(編號3)大於之前保存的(編號1),因此把(編號3)保存下來;由於將軍1已經接受參謀1前一次的提議,因此讓通信兵帶信回去,內容爲(編號1,進攻時間1);
    b)將軍2收到參謀1的提議,由於(編號3)大於之前保存的(編號2),因此把(編號3)保存下來;由於將軍2已經接受參謀2的提議,因此讓通信兵帶信回去,內容爲(編號2,進攻時間2);
    c)負責通知將軍3的通信兵被抓,因此將軍3沒收到參謀1的提議;

  13. 參謀1收到了至少2個將軍的回覆,比較兩個回覆的編號大小,選擇大編號對應的進攻時間作爲最新的提議;參謀1再次派通信兵帶信給有答覆的2個將軍,內容爲(編號3,進攻時間2);

  14. 將軍1和將軍2收到了(編號3,進攻時間2),和自己保存的編號相同,因此保存(編號3,進攻時間2),同時讓通信兵帶信回去,內容爲(Accepted);

  15. 參謀1收到了至少2個將軍的(accepted)內容,確認進攻時間已經被多數派接受。

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