首页 文章

筏怎么处理从前一个提交的条目?

提问于
浏览
4

在筏paper第5.4.2节

如果领导者在提交条目之前崩溃,未来的领导者将尝试完成复制条目 . 但是,一旦领导者存储在大多数服务器上,就无法立即得出上一个条目的条目 . 可能存在这样的情况:旧的日志条目存储在大多数服务器上,但仍可被未来的领导者覆盖 .

提交人提到要避免上述情况

为了消除类似图8中的问题,Raft从不通过计算副本来提交先前术语的日志条目 . 通过计算副本,只提供领导者当前术语的日志条目;一旦以这种方式提交了当前术语的条目,则由于日志匹配属性而间接提交所有先前条目 .

但是不会出现同样的问题吗?

鉴于作者提供的以下情况

edge case

S5 被选为领导者时,它只查看其当前提交的日志 (term3, index1) ,这将覆盖所有粉丝中的 term2 条目 .

如何让领导者查看自己提交的日志来解决问题?

2 回答

  • 0

    阅读此图片上的 Headers . (d)和(e)都是对由(a),(b)和(c)产生的对数状态的可能解决方案 . 问题是,即使在(c)条目(2,2)被复制到集群的大部分,这也说明当在(d)中选出S5时它仍然可以被覆盖 . 因此,解决方案是仅允许节点从他们自己的术语提交条目 . 换句话说,在大多数节点上复制条目并不等于承诺 . 在(c)中,条目(2,2)被复制到集群的大部分,但由于它是's not in the leader'的期限(至少为4),所以它没有被提交 . 但是在(e)中,在领导者从当前术语(4)复制一个条目之后,这阻止了(d)中的情况发生,因为S5不能再被选为领导者 .

  • 0

    在S1复制第4项后,期限高于2和3.由于Raft的领导选举策略,S5将不再被选为领导者:

    Raft通过比较日志中最后一个条目的索引和术语来确定两个日志中哪一个更新 . 如果日志包含具有不同术语的最后一个条目,则具有较晚术语的日志将更新 . 如果日志以相同的术语结束,则更长的日志更新是更新的 .

    因此,在我看来,(e)中的附加日志条目4隐含地提升了它之前的所有条目 . 因为我们唯一关心的是术语或最后一个条目,而不是条目2 .

    这就像提议者在Paxos的第2阶段所做的那样:

    如果提议者从大多数接受者收到对其准备请求(编号为n)的响应,则它会向每个接受者发送一个接受请求,以获取编号为n且值为v的提议,其中v是最高值 - 答复中的编号提案,如果答复未报告任何提案,则为任何值 .

    也就是说,提出具有更高建议数的学习值2 .

相关问题