對paxos協議的介紹,可以通過leslie lamport的《paxos made ******》展開學習和了解。paxos演算法在允許失敗的分布式系統環境下,實現系統一致性。失敗的情況有很多,譬如由於網路問題導致的通訊資料丟失,參與paxos演算法的機器宕機等情況。paxos演算法將分布式系統一致性問題進行抽象,用以解決以下問題:
假設有一群程序,這些程序可提出一些value。使用一種一致性演算法,從這些被提出的value中選出唯一乙個值value。如果這些程序沒有提出過value,那麼就說明沒有value需要被選出。反之,如果乙個value被選出,那麼這些程序就需要接受這個value。在此問題上,需要有幾個要求需要被滿足:
這裡的value可能是任何的訊息資料。譬如在分布式系統中選舉leader的過程中,value就可以是標記leader的身份標識;譬如在分布式資料庫中,value可能是一次操作日誌(實際上paxos演算法的整個過程只能選舉出唯一乙個value,像資料庫操作日誌這樣隨時間遷移而變化的值,應該在paxos演算法基礎之上加以修改,才能滿足需求,譬如multi-paxos)
參與paxos演算法過程中共有三種角色,這三種角色可以在乙個程序中同時存在:
乙個提議者(proposer)將會傳送乙個提議(proposal)給一群投票者(acceptors)。當乙個投票者(acceptor)獲取到乙個提議(proposal)後,可能接受(accept)該提議(proposal),也可能拒絕該提議。當乙個提議獲取了大多數投票者的接受(accept)之後,則認為該提議(proposal)被選中。
在不保證資料可靠傳輸的網路環境下,為保證paxos能夠實現一致性需求,因此設定乙個要求:
\(p1.\) 乙個投票者(proposer)必須接受(accept)他收到的第乙個提議(proposal)。
但是該要求隱含了乙個問題,當多個提議者(proposers)同時提出多個提議(proposal)後,每個投票者(acceptor)都會收到乙個提議(proposal),但可能極有不存在乙個「大多數」的投票者(acceptor)具備相同的提議(proposal)。因此無法選擇其中乙個被「大多數」投票者(acceptors)接受(access)的值。因此乙個投票者(acceptor)必須允許接受(accept)多於乙個的提議(proposal)。為了區分不同的提議(proposal),因此乙個提議(proposal)應包含乙個序號和乙個value。不同的提議(proposal)具有不同的序號。
我們應允許多個提議(proposal)被選中,但是必須保證這些提議(proposal)具有相同的value。可通過提議(proposal)中的序號來保證這個需求的實現:
\(p2\) 如果乙個提議(proposal)的value \(v\)被選中,那麼演算法後續執行過程中大於這個提議(proposal)序號的提議(proposal)若被選中,那麼這個後續被選中的提議(proposal)的value也為 \(v\)
在此條件下,保證了只有單一的value會被選中。要求提議(proposal)的序號必須是有序的。為了一致性,提議(proposal)必須至少被乙個投票者(acceptor)接受(accept),因此滿足\(p2\)的要求需要滿足:
\(p2^a\) 如果乙個提議(proposal)的value \(v\)被選中,那麼在演算法後續執行過程中,任何乙個投票者(acceptor)所接受的高於當前提議(proposal)序號的提議(proposal)中,value的值也為\(v\)
由於乙個提議(proposal)可能被一些沒有接受過任何提議(proposal)的投票者(acceptor)所接受(accept)。根據\(p1\)的要求,這個投票者(acceptor)需要接受這個提議(proposal),但是卻違背了\(p2^a\),因此需要對\(p2^a\)進行加強:
\(p2^b\) 如果乙個提議(proposal)的value \(v\)被選中,那麼之後每乙個提議者(proposer)發出的高於當前提議(proposal)序號的提議(proposal)中,value都為\(v\)。
假設有一些提議(proposal)已經被選中,證明任何序號n > m的提議(proposal)的value都為\(v\):
假設每個發出序號在 \([m, n-1]\)之間的提議(proposal)都具有value \(v\)。既然序號為m的提議(proposal)被選中了,那麼必然有乙個集合c,它由「大多數」接受(accept)\(v\)的投票者(acceptor)組成,可以推出:c中每個投票者(acceptor)都接受(accept)了序號在\([m,n-1]\)中的乙個提議(proposal),被c中任意乙個投票者(acceptor)所接收(accept)的序號在\([m, n-1]\)中的提議(proposal)的value都是\(v\)。 因為任何由「大多數」投票者(acceptor)組成的集合s必然和c存在公共元素。可以通過滿足以下條件來確保序號為n的提議(proposal)的value為\(v\)。
\(p2^c\) 對於任意的n和v,如果乙個由n和v組成的提議(proposal)被發出。存在乙個由「大多數」投票者(acceptor)組成的集合s,要麼(a)s中沒有乙個投票者(acceptor)接受(accept)序號小於n的提議(proposal);要麼(b)s中的投票者(acceptor)接受(accept)與當前提議(proposal)中value相同的提議(proposal),並且這些已經接受過的提議(proposal)的最大序號都小於n。
獲取已經被接受(accept)的提議(proposal)非常簡單,但是對未來的接受(accept)情況的**非常困難。為了避免對未來進行**,提議者(proposer)通過承諾(prepare)的方式來實現控制。換句話說,提議者(proposer)通過預案(prepare)和承諾(promise)的方式來與投票者(acceptor)達成共識:不要接受任何小於n的提議(proposal)。
paxos演算法執行過程將分為兩個階段。
在第乙個階段過程中,可稱為演算法的預備階段:
提議者(proposer)向投票者發起預案(prepare),預案攜帶\(k\)值,\(k\)值及預案提出的提議(proposal)的序號,序號遞增並且不能重複,提議者(proposer)通過預案(prepare)告知投票者,不要接受(accept)小於\(k\)的提議(proposal)。
投票者(acceptor)獲取到預案(prepare)後,根據自身已經獲取到的提議(proposal)執行相關操作。
a) 如果投票者(acceptor)尚未接受(accept)過任何提議(proposal),則向提議者(proposer)反饋承諾,承諾該投票者(acceptor)不再接受小於k的提議(proposal);
b) 如果投票者(acceptor)接受過提議(proposal),取接受過的提議(proposal)中序號\(k_\)最大的提議進行進一步分析,如果\(k_ > k\),那麼投票者(acceptor)將告知該提議者(proposal)拒絕該預案(prepare); 如果\(k_ < k\) 那麼投票者將\(k_\)的值設定為 \(k\),並將已經接受(accept)過的最大序號的提議(proposal)封裝成為承諾(promise)返回給投票者(proposer)。
第二個階段可稱為演算法的選舉階段:
提議者(proposer)收到了投票者(acceptor)發來的響應,如果響應有超過半數的承諾(promise),則進一步分析:如果回覆的承諾(promise)中全部沒有包含之前的提議(proposal),則將value和預案(prepare)中的序號k打包成為提議(proposal)傳送給投票者(acceptor);如果回覆的承諾(promise)中存在之前的提議(proposal),則將這些之前的提議(proposal)中最大序號的提議(proposal)中的value與序號k打包成為提議(proposal)傳送給投票者(acceptor)。如果回覆的承諾(promise)沒有超過半數,則遞增序號k,重新執行演算法的預備階段。
投票者(acceptor)若收到提議者(proposer)發來的提議(proposal)。首先進行判斷發來的提議(proposal)中序號\(k\)與自身之前接受的提議(proposal)中最大序號\(k_\)進行比較:如果\(k < k_\) 則發回拒絕響應;如果 \(k >= k_\) 則將\(k_\)的值設定為\(k\),將\(v_\) 設定為 \(v\) 並返回接受(accept)響應告知提議者(proposer)。
若提議者(acceptor)獲取到超過半數的接受(accept),則將\(v\)告知所有的學習者(learner);若提議者(acceptor)沒有獲取到超過半數的接受(accept),則重新發起預備階段。
paxos協議學習筆記
想理解paxos得先知道paxos解決的問題是什麼。paxos解決的是2pc,3pc存在的節點阻塞,腦裂,低容錯性,單點問題。而且還能做到2pc,3pc不能做到的事,master選舉。3pc是主從結構,如果主節點崩潰了,3pc並沒有提供master選舉的演算法。假設有一系列proposer可以發起關...
Paxos演算法 Zookeeper使用協議
paxos演算法是分布式選舉演算法,zookeeper使用的 zab協議 zookeeper原子廣播 二者有相同的地方,比如都有乙個leader,用來協調n個follower的執行 leader要等待超半數的follower做出正確反饋之後才進行提案 二者都有乙個值來代表leader的週期。不同的地...
從paxos到zookeeper讀書筆記(第四章)
netty集群簡單的集群方案 zk用來實現服務發現的功能,通過高效能的netty網路框架作為伺服器,註冊到zk中,client請求到zk中選取可用的netty伺服器,選取策略有 輪詢 雜湊 ip分組 加權分組 均衡負載和服務發現的功能 netty伺服器關閉時主動到zk登出。zab演算法 zookee...