在筏paper第5.4.2节
中如果领导者之前崩溃了 未来的领导者将尝试进入 完成复制条目。但是,领导者不能立即 得出结论,前一个词的条目是 一旦存储在大多数服务器上,它就会被提交。可能存在存储旧日志条目的情况 在大多数服务器上,仍然可以被a覆盖 未来的领导者。
作者提到要避免上述情况
消除类似图8中的问题,Raft 永远不会通过计数提交以前术语的日志条目 副本。仅记录领导者当前的条目 术语是通过计算复制品来实现的;一次进入 从现在这个词一直以这种方式承诺, 然后所有先前的条目都间接提交,因为 日志匹配属性。
但是不会出现同样的问题吗?
鉴于作者提供的以下情况
当S5
被选为领导者时,它只查看当前提交的日志(term3, index1)
,这将覆盖所有粉丝中的term2
个条目。
如何让领导者查看自己的提交日志来解决问题?
答案 0 :(得分:0)
阅读此图片上的标题。 (d)和(e)都是对由(a),(b)和(c)产生的对数状态的可能解决方案。问题是,即使在(c)条目(2,2)被复制到集群的大部分,这也说明当在(d)中选出S5时它仍然可以被覆盖。因此,解决方案是仅允许节点从他们自己的术语提交条目。换句话说,复制大多数节点上的条目不相等的承诺。在(c)中,条目(2,2)被复制到集群的大多数,但因为它不在领导者的术语(至少4)中,所以它没有被提交。但是在(e)中,在领导者从当前任期(4)复制一个条目之后,这可以防止(d)中的情况发生,因为S5不能再被选为领导者。
答案 1 :(得分:0)
在S1复制第4项后,期限高于2和3.自从Raft的领导者选举战略以来,S5将不再被选为领导者:
通过比较日志中最后一个条目的索引和术语,Raft确定两个日志中哪一个更新。如果日志包含具有不同术语的最后一个条目,则具有较晚术语的日志将更新。如果日志以相同的术语结束,那么较长的日志就更新了。
因此,在我看来,(e)中的附加日志条目4隐含地提升了所有条目'它之前的术语。因为我们唯一关心的是术语或最后一个条目,而不是条目2。
这就像提议者在Paxos的第2阶段所做的那样:
如果提议者从大多数接受者收到对其准备请求(编号为n)的响应,则它会向每个接受者发送一个接受请求,以获取编号为n且值为v的提议,其中v是值答案中编号最高的提案,如果答复中没有提出任何提案,则为任何值。
据说,建议学习价值2的建议数量较高。
答案 2 :(得分:0)
我认为图8(d)和(e)中的两种情况在Raft中都是合法的,因为该文件说:
为消除如图8所示的问题,Raft从未通过对副本数进行计数来提交先前条款中的日志条目。通过计算副本数,仅提交领导者当前任期的日志条目。
在图8(d)中,项2的条目不在领导者S5的本地日志中,并且它们没有提交给状态机。可以用术语3覆盖它们。可以通过计算副本数来仅将领导者当前日志中的条目视为已提交。
答案 3 :(得分:0)
如果我们允许提交上一个术语的条目,则在(c)
之后,将提交编号为2
的条目。之后,如果选择3
作为领导者,它将覆盖已提交的2
。因此,S5
和S1
将执行不同的命令。为防止这种情况,我们将不允许提交2
。因此,在所有状态机中执行的命令将变得一致。
答案 4 :(得分:-1)
我认为问题是领导者在少数关注者将日志应用于状态机后崩溃了。 在该图的(c)中,Leader将项2的日志复制到一半以上的节点,然后Leader将commitIndex更新为2并发送心跳。在领导者崩溃之前,只有S2收到心跳并将状态2的日志应用于状态机。根据本文,S5可以通过S3和S4的投票成为新的领导者,并尝试将条件3的日志附加到S2 〜S4。但是,不应执行此操作,因为S2已将索引2处的日志应用于状态机。 筏似乎无法解决这种情况