首页 > 解决方案 > Raft 如何保证日志的一致性?

问题描述

我在学习Raft,已经知道了Raft的基本机制。

当一个Leader被选举出来时,它负责将Followers的日志更新为Leader的日志。在更新 Follower 时,它会找到第一个<entry, term>向后匹配的,并使用以下日志更新 Follower。

Raft如何保证Leader和Follower在匹配前的日志<entry, term>一致?这种情况会不会发生:

                |
Leader          v  
Entry   : 1 2 3 4 5 6 7 8 9 10
Term    : 1 1 1 2 2 3 3 3 3 3 

Follower
Entry   : 1 2 3 4 5 6 7
Term    : 1 1 1 1 2 3 3

标签: algorithmdistributed-computingdistributed-systemraft

解决方案


Raft 算法的这个属性称为对数匹配。

如果两个日志包含具有相同索引和术语的条目,则日志在通过给定索引的所有条目中都是相同的

这是因为:

发送 AppendEntries RPC 时,领导者在其日志中包含新条目之前的条目的索引和期限。如果跟随者在其日志中没有找到具有相同索引和术语的条目,则它拒绝新条目。一致性检查作为一个归纳步骤:日志的初始空状态满足日志匹配属性,并且一致性检查在日志扩展时保留日志匹配属性。因此,每当 AppendEntries 成功返回时,领导者通过新条目知道跟随者的日志与自己的日志相同。

来源https://raft.github.io/raft.pdf


推荐阅读