Jal*_*Jal 3 algorithm computer-science distributed-system consensus raft
在官方筏网页上考虑这种模拟
为什么term 2 index 1不承诺S2 (leader),S3并S4同意日志?我运行这几分钟以确保所有通信都已发生.
奇怪的是,如果我再添加一个日志条目,term 6 index 2那么term 2 index 1将提交.
有谁知道什么是阻止term 2 index 1提交的规则?
您的领导者在第6学期,但没有一个日志条目来自第6学期; 这在Raft中引用了一个特殊规则.领导者不会自动提交前一个词条,因为在某些情况下这样做是不安全的.第5.3和5.4节详细讨论了这一点(另见图8).
从第5.4.2节:
为了消除类似于图8中的问题,Raft从不通过计算副本来提交先前术语的日志条目.通过计算副本,只提供领导者当前术语的日志条目; 一旦以这种方式提交了当前术语的条目,则由于日志匹配属性而间接提交所有先前条目.在某些情况下,领导者可以安全地断定提交了较旧的日志条目(例如,如果该条目存储在每个服务器上),但Raft采用更保守的方法来简化
您的示例完美地设置为显示为什么这是不安全的.让我们假设S2 确实提交,然后我们通过将两个东西提交到同一个槽中来打破它.
AppendEntries(commitIndex=1, []).AppendEntries(commitIndex=1).
2 现在在两台主机上提交.AppendEntries([4]).
AppendEntries([4]).
2在插槽1处覆盖其值.AppendEntries([4]).4当地
提交AppendEntries([4]).
发生了什么?实质上,我们为同一个时段选出了两个不同的领导者.(当S1更新时,S2当选为领导者.)
那么为什么领导者在没有等待后续请求的情况下提交自己的条款是否安全呢?因为不可能进入上述情况.让我们考虑两个节点(S2,S1)分别认为它们在第2和第3项中同时是领导者的情况.如果S2准备好2进入插槽1,则多数具有相同的值.这意味着没有多数人投票支持在插槽1中有更高期限的任何其他任何东西.这意味着S1,在第3阶段当选为领导者,必须2在第1个插槽中.
(顺便说一句,我花了一分钟才弄清楚你是如何进入这种情况的.)
另外,Raft被称为"Paxos更易理解的版本".我不同意:它似乎有这么多(如果不是更多)角落案例.但是,Raft的作者非常善于让工程师轻松地正确实现某些实用的东西.这与作者如何撰写筏纸有关.