【发布时间】:2017-03-11 23:25:59
【问题描述】:
为了让自己相信 Paxos 和 Raft 等标准算法的复杂性是必要的,我们必须了解为什么更简单的解决方案不能令人满意。假设,为了在 N 台机器的集群中就事件流达成共识(即实现复制的时间增长日志),提出了以下算法:
当一台机器想要在日志中附加一条消息时,它会广播元组
(msg, rnd, prev),其中msg是消息,rnd是一个随机数,prev是它的ID日志中的最后一条消息。当机器接收到一个元组时,它会将
msg作为prev的子元素插入,形成一棵树。如果一个节点有多个孩子,只有
rnd最高的那个才被认为是有效的;有效消息通过树的路径就是主链。如果一条消息是主链的一部分,并且它足够老,则认为它是确定的/最终的。
如果一台机器尝试提交一条消息,但一段时间后,它不在主链上,这意味着另一台机器大致同时广播了一条消息,所以你重新广播它直到它就在那里。
看起来简单、高效且对崩溃具有弹性。这个算法行吗?
【问题讨论】:
-
除非您可以使“足够老”更精确,否则它更像是一种最终一致性算法,例如基于八卦的协议而不是 Paxos,其中接收来自大多数组的确认的进程可以知道他们的写入将持续存在。基于 Gossip 的算法确实比 Paxos 更简单。网络搜索找到infoscience.epfl.ch/record/89531/files/paper.pdf,它从一个非常简单的基于八卦的协议开始并对其进行修改,以逐步改进它。
-
同意@mcdowella。 “足够老”可以采用比特币分类帐语义:具有最长链的分类帐语义,但这不是真正共识,并且在开放环境中容易受到攻击。
标签: algorithm architecture consensus