has been regarded as difficult to understand, perhaps because the original
presentation was greek to many readers. 我們的重點在前半句,至于要了解後半句,需要了解paxos的産生曆史,paxos的曆史是計算機曆史中最有趣的曆史之一,這裡就不八卦了,有興趣的同學可以自行google.
the paxos algorithm for solving consensus is used to implement a fault-tolerant
atomic broadcast.
we used the paxos algorithm (“paxos”) as the base for a framework that implements a fault-tolerant
log.
從這3句描述paxos的句子中可以發現,都共同提到了一個詞:fault-tolerant。fault-tolerant就是paxos的核心。通常paxos被用在資料寫入多個副本的場景,paxos可以保證在容忍少量節點(n/2)挂掉的情況下仍然可以保證資料最終被成功寫入所有副本。假設我們不用paxos,自己來實作副本寫入的邏輯,我們同步寫所有的副本,當所有副本都傳回成功後,再通知使用者這條資料寫入成功,這種實作可以達到寫入多個副本的目的,但是這種方式無法容忍節點挂掉。paxos的核心就是在容忍節點挂掉的情況下,保證資料最終寫入所有副本。是以說paxos的核心是fault-tolerant,在任何一個paxos的定義中都沒有提到一緻性,是以說一緻性不是paxos關注的點。(paxos是否保證強一緻性這裡就不讨論了)
從上面的3句話中我們還能看出2個點,第一個點是paxos解決什麼問題:consensus。什麼是consensus,有人把它翻譯成一緻性(也許這就是為什麼paxos被有些人誤解為"是一種強一緻性協定"的原因吧,錯誤的翻譯了這個詞),其實不準确,應該翻譯成共識。共識也就是說多個程序在分布式的條件下,針對一個值達成共識。後面會再解釋consensus。
第二個點就是paxos可以用來實作atomic broadcast,或者log(也可以說狀态機)。後面也會再解釋atomic broadcast和狀态機。
總結一下paxos是什麼:
接下來,說一下paxos具體是什麼?leslie lamport的論文中的paxos協定由2個部分組成,一個是basic paxos,一個是multi paxos。協定中定義了4中角色:client, proposer, acceptor, learner 。這裡要特别指出的是learner。了解zookeeper的人都知道,zookeeper所使用的zab協定和paxos類似(有人說zab是paxos的變種,個人覺得2者差别很大)。zookeeper中有3種角色,leader,follower,observer,在zookeeper中observer角色其實是可用可無,但是在paxos中learner角色是必須的。個人曾經受上面說法的影響,認為learner類似oberserver的所起的功能,導緻很長時間無法正确了解paxos協定的細節。
basic paxos是一種consensus算法。consensus像上面所說的是用來讓多個程序針對一個值達成共識的,而且這個共識一旦達成就不可更改。這裡我們先不展開說明達成共識是怎樣的一個過程。我們這裡假設你已經了解了這個過程。這個過程可以單獨再寫篇文章來分析。這個達成共識過程就是atomic broadcast要完成功能。zab其實就是從這個角度出發,将自己叫作原子廣播協定(zookeeper atomic broadcast)。
最後再總結一下paxos是什麼: