paxos演算法學習

2021-08-28 17:40:59 字數 2165 閱讀 3681

paxos演算法可以說是大名鼎鼎,一方面是因為它是乙個很優秀的分布式一致性演算法,另一方面也是由於它的晦澀難懂。今天看到了乙個部落格(paxos演算法原理與推導)深入淺出的講了一下這個演算法,感覺收穫很大,於是藉此平台寫一下自己對該演算法的理解,同時也希望能夠通過自己寫的過程加深對這個演算法的理解。

乙個演算法自然要有乙個確定性的目標。作為分布式一致性演算法,paxos的目標是:

在paxos演算法中,主要有三種角色:proposer、acceptor和learner。同乙個程序可以扮演三種角色中的任一/二/三種。

proposer負責生成提案給acceptor,acceptor負責接受提案,learner負責學習接受的提案。在這個定義中,提案被定義為對乙個值具體是什麼的描述。

當乙個提案被半數以上的acceptor接受,我們稱為該提案被選定

為了能夠選出來乙個一致的值,我們需要對上面三個角色的行為做一定的約束。

首先,為了能夠產生選定的提案,需要下面的約束:

p1: 乙個acceptor必須接受它接收到的第乙個提案
但是,這個約束會產生乙個問題:假設有三個proposer,三個acceptor,每個acceptor接受了其中乙個的值,那麼沒有值可以被選定。所以,我們需要允許acceptor接受多個提案。為了後面描述,我們規定每個提案必須有個代表順序的編號n,這樣提案可以抽象為。

但是,這帶來乙個問題,由於允許acceptor接受多個提案,會有多個提案被選定。因此,我們引入以下約束來避免該問題:

p2: 如果某個值為v的提案被選定,那麼每個編號更高的被選定提案的值也必須是v
在具體實現的時候,p2可以用乙個更強的更具體的約束代替:

p2a: 如果某個值為v的提案被選定,那麼每個編號更高的被acceptor接受提案的值也必須是v
但是,考慮以下情況:如果乙個值v1被選定了,且acceptor 2,3,4,5都接受了該值。但acceptor 1掛了,後面起來後收到了v2的提案,這時候它不知道v1已經被選定了,因此又會接受v2,違反了p2a。所以p2a是在存在acceptor故障的情況下無法實現的,因此還需要更加強的約束:

p2b:如果某個值為v的提案被選定,那麼每個proposer之後編號更高的提案的值也必須是v
那麼p2b如何實現呢,可以使用p2c:

p2c:對於任一n和v,如果[n, v]被提出,必須存在乙個超過半數的acceptor的集合s,滿足下列條件之一:

1. s中的acceptor沒有接受過編號為n以下的提案

2. s接受過的提案中,編號最大的提案的值為v

可以看出,如果滿足p2c,那麼如果[n, v]被提出,那麼一定不會有超過半數的acceptor集合接受了值不為v的提案,也就是滿足了p2b。

但是,其實還有關鍵的一點:在上面的情況中,如果有超過半數的acceptor集合接受了值不為v的提案,那麼proposer的提案就需要跟隨已經被接受的提案。那麼跟隨哪個呢,這個需要proposer對acceptor已經接受提案的值來學習得出。

為了滿足p2c,我們提出下面的提案生成演算法:

proposer提出乙個新的提案編號n,然後向半數以上的acceptor發出請求,內容有兩點:1)請acceptor不再接受編號小於n的提案;2)如果acceptor之前接受過提案,那麼把其中編號最大的響應給proposer。

如果proposer收到了半數以上acceptor的響應,那麼就生成乙個提案[n, v],其中v是響應中帶值的提案中編號最大的那個v。如果響應中都不帶值,那麼v可以自選;生成後將提案發給半數以上的acceptor。如果沒有收到,那麼獲取新的n,回到步驟1.

對於acceptor,根據提案生成演算法,需要加強為如下約束:

p1a:乙個acceptor只要沒有響應過任何編號大於n的請求,那麼它就可以接受這個編號為n的提案
這樣就不違背proposer提出的要求。

在收到請求的時候,需要進行如下步驟以滿足約束:

如果提案編號n小於當前響應提案的最大編號resn,不響應或響應錯誤

如果不滿足1,則返回當前接受過的最大編號的提案(如果有的話),並且承諾不再接受編號小於n的提案。

如果收到的是提案,只要acceptor沒有對編號大於n的請求做過響應,那麼就接受該提案

綜上,可以得到paxos演算法。演算法分為兩階段:

Paxos 演算法簡介

拜占庭將軍問題 byzantine failure 是由萊斯利 蘭伯特提出的點對點通訊中的基本問題。意思就是,在存在訊息丟失的不可靠的通道上保證資訊的一致性是不可能的。所以在一般討論一致性的問題上時,比如paxos 演算法,都先假定不會存在拜占庭問題。paxos 是乙個分布式一致性演算法。主要解決的...

Paxos演算法 前世

paxos演算法是基於訊息傳遞且具有高度容錯特性的一致性演算法。我們將從乙個簡單的問題開始,逐步的改進我們的設計方案,最終得到paxos,乙個可以在逆境下工作的協議。一 客戶端 伺服器模型 我們從最小的分布式系統開始,在這個系統中,只有兩個結點,客戶端結點與服務端結點,客戶端結點能夠操作 儲存或更新...

Zookeeper與paxos演算法

一 zookeeper是什麼 官方說辭 zookeeper 分布式服務框架是apache hadoop 的乙個子專案,它主要是用來解決分布式應用中經常遇到的一些資料管理問題,如 統一命名服務 狀態同步服務 集群管理 分布式應用配置項的管理等。好抽象,我們改變一下方式,先看看它都提供了哪些功能,然後再...