paxos算法簡單理解

本文是看了知乎上面一位牛人的回答有感而發。現在將原文地址鏈接如下:https://www.zhihu.com/question/19787937

首先我們需要了解什麼是paxos算法:paxos算法是一種分佈式一致性算法,主要任務是爲了解決分佈式中的一致性問題,那麼什麼是分佈式中的一致性問題,可以看看上一篇博客:分佈式事務中的算法策略

概念介紹:

A. 法定集合: 法定集合就是指的超過一半數目的集合就稱爲法定集合。這裏引出法定集合是由於法定集合的概念是paxos算法的基礎---任意兩個法定集合中必定有一個公共元素。

B. 相互平等: (後面會提到)就是每一個進程都有權利進行值的設定。不存在有上帝進程。

C. 活性: 分佈式一致性算法總能達到一致稱爲活性。


舉例場景: 存在進程p1-p3,變量v,使用paxos算法來使得所有進程都對v達到一致。

決定條件: 就是什麼情況下達到一致,當法定集合中的元素決定了他們共同的v值時達到一致。

安全保證: 如果法定集合已經決定了v值,那麼v的值將不能變化。

論證條件: 

A。接受多值: 就是說每一個進程必須能夠接受多個值,原因: 假設一個進程只能接受一個值,那麼如果每個進程都給自己的v設了不同的值,那麼根據條件分佈式不能達到一致。違背了活性的要求。

B. 安全性: 如果p1,p2都設置了自己的v值爲c,那麼根據判斷條件我們可以知道現在已經達到了一致(法定集合已經確定了v值),那麼現在p3進程設定了v=d,並設定p2的v=d,那麼根據條件又達到了一致性,這顯然是不符合安全保證的(法定集合的v值不能變化)。

C. 學會拒絕: 出於活性的考慮,我們不能只接受一個值,每一個進城都要能夠接受多值。那麼就勢必會導致安全性問題。所以需要節點學會拒絕,就是當法定集合中的v值已經被決定爲c之後,當p3再想設置p2的v值的時候,p2就應該拒絕這個要求。同時可以得出一個結論: 如果法定集合決定了v的值那麼其他節點將沒有權利對自己的v值進行設定,而是隻能設定爲c。

D: 無權選擇: 根據上面的論證,我們得知,存在一些節點沒有權利設置自己的v值,那麼我們如何決定這些節點(假設爲pi)的v值,pi又如何得知現在法定集合決定的v值呢?

方案一: 進程之間相互通信告知自己現在的v值,那樣pi就可以根據一致性判斷條件來決定哪一個v值是被法定集合決定的了。但是這個方案並部可行,原因是如果判斷的過程中p1進程掛了,只有p2和pi存活,那麼如何選擇現在的值?強行默認爲一個值K,那樣的話不滿足安全性問題。如果只是繼續等待不滿足活性問題。

方案二:如何選值:  現在法定集合Q1已經決定了v值爲c,那麼pi進程隨機組成一個法定集合Q2,那麼Q1和Q2中必然存在一個公共節點pj,我們現在所需要做的就是讓pi的v爲Q2中pj和值還是其他節點pn的值。

E: 如何拒絕: 上面的論證拋出了一個問題,就是方案二中的pi如何選值的問題:存在這種情況:  當pi詢問法定集合Q2的各個進程時,得到的回答都是我們尚未決定v值,那麼可以得出現在整個分佈式還未達到一致,那麼現在pi將能夠有權限決定自己的值是多少。那麼問題來了,如果同時有兩個節點pi,pj都獲得了決定自己值的權限,那麼將會出現這種情況Q2和pj所在法定集合Q3存在共同節點pn,pi和pj會同時對pn賦值。爲了安全性考慮,我們需要pn能夠決定拒絕哪一個值。

F: 上面的論證留下的兩個問題:如何選值,如何拒絕。爲了描述清晰,我們提出兩個概念: 提議者,接受者。提議者負責如何選值,接受者負責如何拒絕。提議者首先向接受者進行詢問,得到一個法定集合的進程恢復,如果已經決定了v的值,那麼只用設定v的值即可,如果沒有決定那麼有權設定v=c。此時不妨讓接受者負責寫入v的值。提議者嘗試令接受者寫入自身v的值的過程叫做提議。這個過程中提議者發送給接受者的消息稱之爲提案,顯然提案包括自身的v值。

那麼提議者向接受者發出提議會導致安全性問題,接下來就是如何拒絕的問題了。

針對上面認證過程中的如何決定情況,我們應該如何選擇一個v來拒絕呢?我們提出一種方法,就是在每個提案中添加一個字段proposer-id來表示現在提案的id,由接受者來決定選擇哪一個提案。不防設選擇proposer_id大的來選擇。但是出現一個問題,如果現發送過來的提案的proposer-id是小的,那麼會導致pn兩次接受提案,顯然不合理。解決辦法是,給pn設置一個初始值,如何設置這個值呢?設置哪一個值比較合理。其實這裏需要有一個預提案的過程,在這個預提案過程中我們將設置pn的初始值爲提案中較大的一個。並且再接受提案的過程中忽略提案id小於pn初值的提案。

待續:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章