爲了說服自己,像Paxos和Raft這樣的標準算法的複雜性是必要的,我們必須理解爲什麼更簡單的解決方案不能令人滿意。假設,爲了達成共識WRT事件流的N機的羣集(即執行復制的時間成長日誌),下面的算法:這個簡單的一致性算法的工作?
當一臺機器要追加消息發送到日誌,它廣播元組
(msg, rnd, prev)
,其中msg
是消息,rnd
是一個隨機數,而prev
是日誌中最後一條消息的ID。當一臺機器收到一個元組時,它將
msg
作爲prev
的子元素插入,形成一棵樹。如果一個節點有多個孩子,只有最高的那個孩子被認爲是有效的;通過樹的有效消息的路徑是主鏈。
如果一條消息是主鏈的一部分,並且已經足夠大,它就被認爲是決定/最終的。
如果一臺機器試圖提交一條消息,並且一段時間後它不在主鏈上,這意味着另一臺機器幾乎在同一時間廣播了一條消息,所以您重新播放它直到它在那兒。
看起來簡單,高效和靈活的崩潰。這個算法會起作用嗎?
除非您可以使「足夠老」更精確,否則它更像是最終一致性算法,比如基於八卦的協議,而不是Paxos,其中接收來自大多數組的確認的進程可以知道他們的寫入將會持續。基於八卦的算法往往比Paxos簡單。網絡搜索發現https://infoscience.epfl.ch/record/89531/files/paper.pdf,它以一個非常簡單的基於八卦的協議開始並對其進行修改,以逐步改進它。 – mcdowella
同意@mcdowella。 「足夠老」可以承擔比特幣分類賬語義:鏈條最長的一種,但這不是真正的共識,並且在開放的環境中可以接受攻擊。 –