领导者变更可能导致日志的不一致,之前主要展示了会影响状态机安全的情况,这里展示另外可能出现的两种情况。

系统中通常有两种不一致的日志:缺失的条目(Missing Engries)和多出的条目(Extraneous Engries)
新的领导者必须使跟随者的日志跟自己的日志保持一致。对于缺失的条目,Raft算法会发送AppendEntries消息来补齐;对于多出来的条目,Raft算法会删除。
为了清理不一致的日志,领导者为每个跟随者保存变量nextIndex[],用来表示要发送给该跟随者的下一个日志条目的索引。对于跟随者i来说,领导者的nextIndex[i]的初始值为领导者最后一条日志的索引+1。
领导者通过nextIndex[]来修复日志。如果AppendEntries消息发现日志一致性检查失败,那么领导者递减对应的nextIndex[i]的值并重试。流程如图所示

缺失条目
对于跟随者1,此时属于缺失条目,其完整流程为:
(1) 一开始领导者根据自己的日志长度,记录nextIndex[1]= 10+1 =11,带上前一个日志条目的唯一标识:索引为10且任期为6.检查发现跟随者1的索引为10处没有日志,检查失败。
(2) 领导者递减nextIndex[1]的值,即nextIndex[1]=10,带上前一个日志条目的唯一标识:索引为9且任期为6。跟随者1的索引为9处还是没有日志,检查失败。
(3) 如此往复,直到领导者的nextIndex[1]=5,带上前一个日志的唯一标识:索引为4且任期为4的信息。检查发现与跟随者1处的日志匹配。接着领导者发送日志,将跟随者从索引5到10的日志补齐。
多出条目
对于跟随者2,此时属于多出的日志。
领导者将从nextIndex[2]=11处开始检查,一直检查到nextIndex[2]=4处,附带的日志条目信息为index=3且term=1,与领导者匹配。对于这种情况,删除后面所有的日志,Raft认为无关紧要的日志在之后也无关紧要,之后再由领导者补齐。

551



被折叠的 条评论
为什么被折叠?



