【问题标题】:Would this simple consensus algorithm work?这个简单的共识算法会起作用吗?
【发布时间】:2017-03-11 23:25:59
【问题描述】:

为了让自己相信 Paxos 和 Raft 等标准算法的复杂性是必要的,我们必须了解为什么更简单的解决方案不能令人满意。假设,为了在 N 台机器的集群中就事件流达成共识(即实现复制的时间增长日志),提出了以下算法:

  1. 当一台机器想要在日志中附加一条消息时,它会广播元组(msg, rnd, prev),其中msg是消息,rnd是一个随机数,prev是它的ID日志中的最后一条消息。

  2. 当机器接收到一个元组时,它会将msg 作为prev 的子元素插入,形成一棵树。

  3. 如果一个节点有多个孩子,只有rnd最高的那个才被认为是有效的;有效消息通过树的路径就是主链。

  4. 如果一条消息是主链的一部分,并且它足够老,则认为它是确定的/最终的。

  5. 如果一台机器尝试提交一条消息,但一段时间后,它不在主链上,这意味着另一台机器大致同时广播了一条消息,所以你重新广播它直到它就在那里。

看起来简单、高效且对崩溃具有弹性。这个算法行吗?

【问题讨论】:

  • 除非您可以使“足够老”更精确,否则它更像是一种最终一致性算法,例如基于八卦的协议而不是 Paxos,其中接收来自大多数组的确认的进程可以知道他们的写入将持续存在。基于 Gossip 的算法确实比 Paxos 更简单。网络搜索找到infoscience.epfl.ch/record/89531/files/paper.pdf,它从一个非常简单的基于八卦的协议开始并对其进行修改,以逐步改进它。
  • 同意@mcdowella。 “足够老”可以采用比特币分类帐语义:具有最长链的分类帐语义,但这不是真正共识,并且在开放环境中容易受到攻击。

标签: algorithm architecture consensus


【解决方案1】:

如果机器按顺序发送两个元组并且第一个丢失(包丢失/损坏或其他),我认为你有问题

在这种情况下,假设机器 1 的 prev elemtent id 为 10,然后再发送两个 (msg,rnd,10)=11 和 (msg,rnd,11)=12 到机器 2。

机器 2 仅接收 (msg,rnd,11) 但其树中没有 prev id 11。 机器 3 接收两者,因此将其插入到主树中。

此时,分布式树之间会出现不同步。

我建议在机器 x 将包插入树中后向发送者发送一个 ack,他等待它发送下一个。

这种方式发送者需要将之前的消息重新发送到在给定时间范围内未能确认的机器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-04
    • 2010-09-27
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多