2017-02-09 49 views
2

在paxos算法的第二階段,如果接受者之前已經選擇了一個值,則提議者發出一個接受請求,其號碼爲n,值爲v,它來自接受者。我的問題是提案人爲什麼這樣做?因爲一旦選擇了一個值,它就是永久的並且不能改變,所以在這種情況下,提議者只是學習了在準備請求的響應中發送的選擇值。爲什麼它會要求接受已經接受的價值?爲什麼提議者發送的接受請求具有與接受者相同的值?

回答

2

所選擇的值必須與最後一位領導者提出的值一致,否則所選擇的值可能會丟失。一種有益的思考方式是新提案人選擇與舊提案人合作。如果它不合作,那麼就會出現矛盾,我們可能會在分佈式系統中出現不一致。

實施例:

考慮節點A,B和C作用多的Paxos的所有角色。節點A是領導者並提出V1。想象一下,網絡發生故障,只有節點A和節點B能夠通信,節點A只有最少數量的消息可以通知節點A選擇了V1。

當節點A從節點B聽到它知道V1被選擇,因爲它有大多數(節點A和B)。它將消息發送給節點B和C,以說明該值的選擇,但是如本例中所述,節點A沒有進一步的消息通過。節點A執行業務操作,例如從數量爲V1的銀行賬戶中支付資金。節點A然後崩潰。

節點C現在成爲領導者,並不知道正確的銀行賬戶餘額,也沒有任何關於甚至建議付款的事實。節點B知道在V1中建議付款,但不知道它是否被選中,因爲它從未聽過節點A的結果。因此,節點B也不知道正確的銀行賬戶餘額。

您描述的機制恰恰是節點C在選擇值V1時與節點A進行協作的方式。如果沒有進一步的信息丟失,B和C將進入一致的狀態,即他們同意從銀行賬戶中支付的金額。

很明顯,如果節點C不是通過節點B發現值V1並提出一些新值,那麼我們就會有矛盾。銀行賬戶將被破壞爲付款V1不會在帳戶上的每個節點B和C.

的平衡反映

討論

有一個關於你所要求的機制的詳細討論關於我的博客文章,其中描述了the leader takeover phase

在上面描述的事件中,事件中假定有一些標準的實現細節。例如,有人可能會說:「不要在沒有更多消息的情況下從銀行賬戶轉移資金,以確認所有節點都知道該值已被選中」。然而,Paxos被證明只需要最少數量的消息是安全的,崩潰應該是罕見的。這意味着在實施Paxos時,在正常運行期間使用最少數量的消息通常是最佳的,並且在故障情況下依賴算法在整個系統中恢復一致的狀態。

有趣的是,可以選擇一個值,但沒有活節點知道它。在上面的例子中,節點A運行時間足夠長,以查看來自節點B的消息並在銀行賬戶之間轉移資金。然而,它可能在從節點A聽到之前崩潰。除節點B外,它將接受V1,但節點不知道該值已被選擇,直到節點C發現V1並選擇它爲止。

有趣的是,系統的客戶,觀察銀行賬戶的那些東西,或從銀行賬戶接收支付的其他系統也是分佈式系統的一部分。如果在這個例子中沒有從銀行賬戶支付款項,那麼放棄V1並不是問題。然而,選擇價值觀的副作用是相當正常的。觀察系統的第三方系統或用戶Web瀏覽器實際上是分佈式系統的一部分。

相關問題