您的领导者在第6学期,但没有一个日志条目来自第6学期;这在Raft中引用了一个特殊规则。领导者不会自动提交前一个词条,因为在某些情况下这样做是不安全的。第5.3和5.4节详细讨论了这一点(另见图8)。
从第5.4.2节:
消除类似图8中的问题,Raft 永远不会通过计数提交以前术语的日志条目 副本。只记录领导者的当前条目 术语是通过计算复制品来实现的;一次进入 从现在这个词一直以这种方式承诺, 然后所有先前的条目都间接提交,因为 日志匹配属性。有一些情况 领导者可以安全地得出一个较旧的日志条目 已提交(例如,如果该条目存储在每个条目上) 服务器),但Raft采取更保守的方法 为简单起见
您的示例完美地设置为显示为什么这是不安全的。我们假设S2 确实提交 然后我们通过将两个东西放入同一个插槽来打破它。
AppendEntries(commitIndex=1, [])
AppendEntries(commitIndex=1)
2
AppendEntries([4])
4
发生了什么?实质上,我们为同一个时段选出了两个不同的领导者。 (当S1更新时,S2当选为领导者。)
那么为什么领导者在没有等待后续请求的情况下提交自己的条款是否安全呢?因为不可能进入上述情况。让我们考虑两个节点(S2,S1)分别认为它们在第2和第3项中同时是领导者的情况。如果S2准备提交 2 在插槽1中,大多数在那里具有相同的值。这意味着没有多数人投票支持另一个在第1个插槽中有更高期限的东西。这意味着S1,被选为第3任期的领导者,必须拥有 2 在插槽1中。
(顺便说一句,我花了一分钟才弄清楚你是如何进入这种情况的。)
另外,Raft被称为“Paxos更易理解的版本”。我不同意:它似乎有这么多(如果不是更多)角落案例。但是,Raft的作者非常善于让工程师轻松地正确实现某些实用的东西。这与作者如何撰写筏纸有关。