1. 程式人生 > >Paxos發展、算法原理

Paxos發展、算法原理

hub 決定 特性 惡意攻擊 tor img 如果 ava 一個

Paxos

發展史

  Leslie Lamport所提出的Paxos算法是現代分布式系統中的一項重要的基礎性技術,得到廣泛的應用。

Paxos的整個發展過程大概可以分為三個階段:
  第一階段:萌芽期,大致是1988-1996年。Liskov等人在PODC上發表了Viewstamped Replication: A New Primary Copy Method to Support Highly-Available Distributed Systems ,提出了一個在副本出現宕機情況下仍能正常工作的主從備份算法,該算法與Paxos在本質上是一致的(The ABCD’s of Paxos)。

  第二階段:1996-2007年。湧現出一批Paxos的不同版本,這些Paxos的變種從不同側面完善了基礎Paxos算法,提升其性能。Liskov等人在1999年提出了PBFT(實用的拜占庭容錯算法),這實際上也是Paxos的一個變種,被Lampson稱為Byzantine Paxos,該算法對基礎Paxos進行了改進,使其可以處理拜占庭錯誤。

  拜占庭將軍問題(Byzantine failures),是由萊斯利·蘭伯特提出的點對點通信中的基本問題。含義是在存在消息丟失的不可靠信道上試圖通過消息傳遞的方式達到一致性是不可能的。
  拜占庭位於如今的土耳其的伊斯坦布爾,是東羅馬帝國的首都。由於當時拜占庭羅馬帝國國土遼闊,為了防禦目的,因此每個軍隊都分隔很遠,將軍與將軍之間只能靠信差傳消息。 在戰爭的時候,拜占庭軍隊內所有將軍和副官必需達成一致的共識,決定是否有贏的機會才去攻打敵人的陣營。但是,在軍隊內有可能存有叛徒和敵軍的間諜,左右將軍們的決定又擾亂整體軍隊的秩序。在進行共識時,結果並不代表大多數人的意見。這時候,在已知有成員謀反的情況下,其余忠誠的將軍在不受叛徒的影響下如何達成一致的協議,拜占庭問題就此形成。
  拜占庭假設是對現實世界的模型化,由於硬件錯誤、網絡擁塞或斷開以及遭到惡意攻擊,計算機和網絡可能出現不可預料的行為。拜占庭容錯協議必須處理這些失效,並且這些協議還要滿足所要解決的問題要求的規範。

Eli Gafni 和 Lamport 在2000年提出了Disk Paxos,這可以認為是Paxos基於磁盤的版本,以支持持久化。

  第三階段:本階段。Paxos開始在工業界得到了廣泛應用。從2006年開始,谷歌公司有兩篇影響深遠的論文發表在OSDI上,一篇是“Bigtable:A Distributed Storage System for Structured Data”,另一篇“The Chubby lock service for loosely-coupled distributed systems”。兩篇論文可以說是揭開了大數據管理的序幕,而Paxos則在大數據管理的核心技術(容錯)中扮演了極為重要的角色。

算法原理

  Paxos算法維基百科https://en.wikipedia.org/wiki/Paxos_(computer_science)
  Paxos算法是基於消息傳遞且具有高度容錯特性的一致性算法,是目前公認的解決分布式一致性問題最有效的算法之一。然而,Paxos算法也因為晦澀難懂而臭名昭著。

問題產生的背景

  在常見的分布式系統中,總會發生諸如機器宕機或網絡異常(包括消息的延遲、丟失、重復、亂序,還有網絡分區)等情況。Paxos算法需要解決的問題就是如何在一個可能發生上述異常的分布式系統中,快速且正確地在集群內部對某個數據的值達成一致,並且保證不論發生以上任何異常,都不會破壞整個系統的一致性。
技術分享

相關概念

在Paxos算法中,有四種角色:

  • Client:產生議題者
  • Proposer :提議者
  • Acceptor(Voters):決策者(投票者)
  • Learner:最終決策學習者,也就是執行者。

上面4種角色中,提議者和決策者是很重要的,其他的2個角色在整個算法中應該算做打醬油的,Proposer就像Client的使者,由Proposer使者拿著Client的議題去向Acceptor提議,讓Acceptor來決策。

  1. Proposer拿著Client的議題去向Acceptor提議,讓Acceptor來決策。
  2. Proposer提出議題,Acceptor初步接受或者Acceptor初步不接受。
  3. Acceptor初步接受則Proposer再次向Acceptor確認是否最終接受。
  4. Acceptor最終接受或者Acceptor最終不接受。
  5. Learner最終學習的目標是向所有Acceptor學習,如果有多數派個Acceptor最終接受了某提議,那就得到了最終的結果,算法的目的就達到了。 技術分享 技術分享

問題描述

  假設有一組可以提出(propose)value(value在提案Proposal裏)的進程集合。一個一致性算法需要保證提出的這麽多value中,只有一個value被選定(chosen)。如果沒有value被提出,就不應該有value被選定。如果一個value被選定,那麽所有進程都應該能學習(learn)到這個被選定的value。對於一致性算法,安全性(safaty)要求如下:

  • 只有被提出的value才能被選定。
  • 只有一個value被選定,並且
  • 如果某個進程認為某個value被選定了,那麽這個value必須是真的被選定的那個。

Paxos的目標:保證最終有一個value會被選定,當value被選定後,進程最終也能獲取到被選定的value。

算法描述

Paxos算法分為兩個階段。具體如下:

階段一:
(a) Proposer選擇一個提案編號N,然後向半數以上的Acceptor發送編號為N的Prepare請求。

(b) 如果一個Acceptor收到一個編號為N的Prepare請求,且N大於該Acceptor已經響應過的所有Prepare請求的編號,那麽它就會將它已經接受過的編號最大的提案(如果有的話)作為響應反饋給Proposer,同時該Acceptor承諾不再接受任何編號小於N的提案。

階段二:
(a) 如果Proposer收到半數以上Acceptor對其發出的編號為N的Prepare請求的響應,那麽它就會發送一個針對[N,V]提案的Accept請求給半數以上的Acceptor。註意:V就是收到的響應中編號最大的提案的value,如果響應中不包含任何提案,那麽V就由Proposer自己決定。

(b) 如果Acceptor收到一個針對編號為N的提案的Accept請求,只要該Acceptor沒有對編號大於N的Prepare請求做出過響應,它就接受該提案。
技術分享

技術分享

eg. 技術分享

Learner學習被選定的value

Learner學習(獲取)被選定的value有如下三種方案:
技術分享

Paxos發展、算法原理