raft - 关于 raft 算法的困惑

标签 raft

在论文《寻找可理解的共识算法》中,图8展示了(d)和(e)中的一个问题,即一些旧日志可能会被覆盖并且永远不会回来。

在第 5.4.2 节中,它说 “为了消除图 8 中的问题,Raft 从不通过计算副本数来提交以前术语的日志条目。通过计算副本数,仅提交来自领导者当前任期的日志条目;一旦以这种方式提交了当前术语中的条目,那么由于日志匹配属性,所有先前的条目都将被间接提交” .

我对那部分感到困惑,它在图 8 中是如何工作的?什么会发生,什么不会?

最佳答案

通过将规则添加到图 8。

Raft never commits log entries from previous terms by counting replicas.


所以现在我们从不提交以前条款的日志条目,让我们看看图 8 中会发生什么。我修改了图 8 以显示应用规则后的情况。
enter image description here
(a) 和 (b) 的作用相同。
从 (c) 开始,索引 2 处的日志条目追加到 第 2 学期 从步骤(a)开始,我画了一个黄色圆圈。所以它来自以前的条款 .因此,领导者不会根据规则复制该条目(带有我的黑色十字的黄色 2)。它必须从索引 3 处的条目开始复制。
这个规则在图 2“Rules for Servers”leader 的规则 3.1 中也有提到:

Send AppendEntries RPC with entries startting at nextIndex.


nextIndex 初始化为 last log index + 1 ,所以它应该从 (c) 处的日志索引 3 开始,而不是索引 2。
因此对于原始 (c) 处的假设过程,在 log 3(附加在第 4 项的粉红色)以多数复制之前,不可能将 log 2 附加到多数。 (d) 不会发生。
更新:2020-12-04
@coderx 和@OrlandoL 讨论了关于 (a)、(b) 以及 S5 如何不能成为领导者的评论。他们的讨论使这个答案更加完整,所以我在这里放了一个引用。
基本上,(a),(b)不是必须发生的条件,有些情况下S5不会产生领导者,例如S3,S4有相同的机会成为领导者。 (详情请看评论)
这些假设是正确的,即 S5 可能不会成为领导者,并且以下过程不会发生。
但是让我们回到论文图 8 并阅读该图的注释:

A time sequence showing why a leader cannot determine commitment using log entries from older terms. In (a) S1 is leader and partially replicates the log entry at index 2. In (b) S1 crashes; S5 is elected leader for term 3 with votes from S3, S4, and itself, and accepts a different entry at log index 2.


IMO, the author is talking about the case that S5 is elected leader.从而使整个过程成为场景。
正如@OrlandoL 所提到的,在 MIT 6.824 实验室中,您应该考虑所有条件以获得正确的 Raft 实现。
希望这可以帮助。

关于raft - 关于 raft 算法的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60397950/

相关文章:

hyperledger-fabric - 如何将新的订购者组织添加到现有的 Hyperledger Fabric 网络

去原子加载和存储

etcd - 如何使用 etcd 进行原子更新

apache-zookeeper - 在分布式存储中实现线性化是否需要复制日志

consensus - RAFT 共识协议(protocol) - 条目在提交之前是否应该持久

algorithm - 这种场景下raft是怎么处理log的呢?

distributed - Raft 是如何线性化的?

hyperledger-fabric - leader 不选择 hyperLedger fabric raft 订购服务

replication - LMAX Replicator Design - 如何支持高可用性?

raft:提交的条目可能会丢失?