假設有一組可以提出提案的程序集合,那麼對於乙個一致性演算法來說需要保證以下幾點:
1:在這些被提出的天中,只有乙個會被選定。
2:如果麼有提案被提出,那麼久不會有被選定的提案。
3:當乙個提案被選定後,程序可以獲取這些被選定的提案資訊。
安全性需求如下:
1:只有被提出的提案才能被選定
2:只有乙個值被選定
3:如果某個程序認為某個提案被選定了,那麼這個提案必須是真的被選定的那個。
paxos演算法的目標就是保證最終有且只有乙個提案被選定,當被選定後,程序最終也能獲取到被選定的提案。
三種參與角色
proposer,acceptor,learner
最簡單的選定
允許以個accepetor, 所有的proposer只能傳送給這個acceptor,acceptor選擇它接收到的第一提案作為被選定的提案。簡單,但是一旦acceptor出現問題,整個系統就無法工作。
更好的選定,應該符合以下判定
p1:乙個acceptor必須批准它收到的第乙個提案。
p1引入的問題:不同的proposer分別提出多個提案。任意乙個acceptor出問題,都無法保證正確的提案。所以引入
以 [編號,value] 來標識乙個提案。
p2:如果編號為m0,value值為v0的提案被選定了,那麼所有比編號m0更高的,且被選定的提案,其value值必須也是v0。
p2a:如果編號為m0,value值為v0的提案被選定了,那麼所有比編號m0更高的,且被acceptor批准的提案其value值必須也是v0
p2b如果乙個提案[m0,v0]被選定後,那麼之後任何proposer產生的編號更高的提案,其value值為v0
proposer生成提案
階段一:
acceptor對於proposer產生的提案mn保持謹慎態度,proposer產生mn的prepare請求 要acceptor保證兩點 乙個是 不批准任何編號小魚mn的提案,二:如果已經批准了天,返回那個小於mn 且當前最大的提案。
階段二:
proposer的prepare收到超過半數以上的 積極響應的話。進行vn的選擇。類似的根據prepare返回的兩種情況。vn取值也是有兩種,一種是隨意指定(所有的acceptor還沒批准過)。另一種是批准的最大編號的vn。此時 proposer在進行真正意義的提案請求。
acceptor 批准提案
對於prepare請求: 任何時候響應乙個prepare請求
對於accept請求:不違背accept現有承諾的前提下,任意響應accept請求。
既:乙個acceptor只要尚未響應過任何編號大於mn的prepare請求,那麼它就可以接受這個編號為mn的提案。
提案的獲取
方案一:
關播提案,一旦acceptor批准了乙個提案,就廣播該天給所有的learner。此法請求超級多。
方案二:
引入主 learner 。批准的提案只發給主learner。主learner負責同志其他learner。此法避免不了learner的單點故障。
方案三:
引入組主learner 。批准的提案發給learner集合。通過集合通知給各個learner
提案申請出現的問題
死迴圈問題
proposer p1提出了編號為m1的提案,並且通過了prepare請求。準備正是提交。此時 proposer p2提出了m2的提案,率先完成了prepare請求。於是 acceptor承諾不批准小於m2的提案,此時p1的正是提案請求會被進行忽略。於是p1又進入了prepare請求。提出了m3提案。這又導致p2的m2被忽略。p2又進入prepare請求。提出了m4 如此迴圈往復。 p1 p2就陷入了死迴圈。
避免死迴圈
proposer指定乙個主proposer只有它能提交提案。proposer接受其他proposer的提案進行過濾。一旦發現當前流程中有乙個編號更大的提案被提出。那麼它就丟棄原來的編號小的提案。最終選擇乙個足夠大編號的天。 問題解決。
分布式一致性
分布式一致性是指在分布式環境中對某個副本資料進行更新操作時,必須確保其他副本也會更新,避免不同副本資料不一致。分布式系統乙個重要的問題時解決資料複製,一是為了增加系統的可用性防止單點故障,二是提高系統可用性,通過負載聚恆,使分布在不同位置的資料副本能夠提供服務。理想狀態下,當然希望分布式系統能夠實現...
分布式一致性
分布式系統的乙個重要問題是資料的複製。對資料的複製一般有兩個原因 資料複製的主要難題是保持各個副本的一致性。即在更新乙個副本時,必須確保同時更新其他的副本,否則資料的各個副本將不再相同。一致性模型實質上是程序和資料儲存之間的乙個約定。正常情況下,乙個資料項上執行讀操作時,它期待該操作返回的是該資料在...
分布式一致性方案
首先,先說一下。老外提出了乙個快取更新套路,名為 cache aside pattern 其中就指出 不是的。假設這會有兩個請求,乙個請求a做查詢操作,乙個請求b做更新操作,那麼會有如下情形產生 快取剛好失效 請求a查詢資料庫,得乙個舊值 請求b將新值寫入資料庫 請求b刪除快取 請求a將查到的舊值寫...