question:大名鼎鼎的paxos協議是啥?ansower:「分布式一致性協議」。
這麼逼格的術語,就問你怕不怕??能不能搞的中國話一點,簡單一點,而不是翻譯《paxos made ******》呢?一直覺得lesile lamport的腦迴路和常人不一樣好伐。文章前面部分一眼都懂,後面的,眼睛瞄瞎都不一定看得懂。本文是paxos的一些閱讀總結。歡迎一起討論。
場景化的核心問題:成功的往分布式系統裡面寫入乙個資料。outline幾個關鍵問題:
資料寫入模型是非同步非阻塞,我們說的「同時」,都是指一次寫入未finish的情況下就開始下一次的寫入;
各節點的資料一致,保證是最終一致;
失敗處理的兩個關鍵問題:失敗了是否會重試、重試的時候是否會增加id,文中對失敗處理沒有太多的描述;
保證資料順序寫入,一旦乙個寫入成功,後續就不會有id更小的資料寫入成功。但並不是每乙個「同時」的寫入操作都會寫成功,也不保證id大的就一定會成功。
我們循序漸展開思考解決之法。主要路徑是;
all,寫入所有節點
quorum,寫入過半節點
rules, 競爭規則
same value,等值情況怎麼應對
uncertainty,結果的非確定性
two phase, 為什麼要兩階段提交
all最直觀的,往所有節點寫成功就算成功。是乙個過程艱辛的正確答案。多個寫操作並行時,部分節點是value=a,部分節點value=b,到底是a還是b呢?
quorum
好解決。咱們投個票,少數服從多數。關於投票,既然投票,拿了過半的選票數就算勝利了。如果總票數為偶數,那勢必需要在乙個票上相互爭取。既然是爭取就得定個輸贏的規矩。
rules
最簡單的輸贏規矩是先到先得,佔坑。ok,至此,基本道理咱們都了解了。咱們對著協議來說說怎麼玩的。首先給proposal編號,可以理解為乙個proposal就是一次寫入的申請,有了全域性編號意味著就有了順序。如果乙個節點(協議成為accepter)收到了兩個id的proposal:
same value
如果兩個寫入者寫入的是同乙個值,比如之前提到的資料重發場景。要想達到重發資料也成功的效果,節點就要求可以接收多個proposa。對應於協議裡面就如果acceptor發現proposal的value和已經接受的一致,但是id比已經接受的大,就也接受這個id。應該也適用於非重發,但是同時寫入的value一致的場景。
uncertainty
同時寫入a和b兩個資料,其中a的id小於b的id。結果到底是a還是b呢?按照前面的描述,其實不確定。如果a已經拿到了半數的選票,b就會失敗。但是這種情況對應用來說並非最佳選擇,畢竟有個先後順序。
two phase
這塊是最難以理解的,大家都會說有兩個階段。但從不解釋為啥要拆分成兩個階段(prepare和 accept)。我簡述下我的理解,(如果有其他理解或者權威資料的請你通知我):
給id更大的proposal多一次機會。第一階段拿到拿到過半票數後,也有可能被id更大的訊息搶走選票;
事先詢問。別一股腦去寫入,先問下是否具備寫入條件。如果id大的哥們已經拿到了過半選票,你還去寫入剩餘的一些戳,其實是沒有必要的,寫了大家也不認,還要再改寫。
協助達成所有節點的資料一致,如果id大的proposal未被accept,他可以改變自己proposal的值,發向其他的節點。演算法本身並沒有說明這一點。咱們也不去討論如果id大的寫入失敗了,業務層重新寫入資料的情況,我理解又是一次演算法的全過程了。
類似zookeeper,這種同時寫入,更多的是去解決多master同時存在的情況,通過id的增加,可以識別出新舊master,從而拒絕舊master的請求。這種玩法的極端情況情況下,新的master如果是prepare成功,accept失敗,是需要重試的。
分布式一致性演算法之Paxos
paxos的重要概念 提案 proposal proposal訊息包括提案編號 proposal id 和提案的值 最終一致值value paxos演算法角色 client 客戶端,主要是向分布式系統發出請求,並等待響應。例如 對分布式檔案伺服器中檔案的寫請求 proposer 提案發起者,提倡客戶...
分布式一致性
分布式一致性是指在分布式環境中對某個副本資料進行更新操作時,必須確保其他副本也會更新,避免不同副本資料不一致。分布式系統乙個重要的問題時解決資料複製,一是為了增加系統的可用性防止單點故障,二是提高系統可用性,通過負載聚恆,使分布在不同位置的資料副本能夠提供服務。理想狀態下,當然希望分布式系統能夠實現...
分布式一致性
分布式系統的乙個重要問題是資料的複製。對資料的複製一般有兩個原因 資料複製的主要難題是保持各個副本的一致性。即在更新乙個副本時,必須確保同時更新其他的副本,否則資料的各個副本將不再相同。一致性模型實質上是程序和資料儲存之間的乙個約定。正常情況下,乙個資料項上執行讀操作時,它期待該操作返回的是該資料在...