maemual/raft-zh_cn

5.4.2节中,是否存在已提交日志的覆盖情况

guhanjie opened this issue · 1 comments

我困惑的是:在文中5.4.2节中,如果Term=2,Index=2的日志在S1、S2、S3上已提交,但是并没有提交Term=4的日志,这样S5中的Term=3的日志是否会覆盖掉已经提交的Term=2的日志?

自问自答:
要回答上面的问题,要理解清楚committed到底是指什么,官方leaders rule定义了commited:

如果存在一个满足N > commitIndex的 N,并且大多数的matchIndex[i] ≥ N成立,并且log[N].term == currentTerm成立,那么令 commitIndex 等于这个 N (5.3 和 5.4 节)

注意上面的条件必须满足log[N].term == currentTerm

所以,上面的疑问:是否存在已提交日志的覆盖情况
如果Term=2,Index=2的日志对于Leader S1已提交,那时S1 Term至少为4,意味着大多数节点已经接收了Term=4的日志,如(e)所示,那此时S5是无法成为Leader的,因此不会被覆盖。

反之,如果S1在crash之前未commited Term=2,Index=2的日志,那么S5成为Leader后根据规则,是可以覆盖该日志的。

最后文中也有这样的描述:

领导人完全特性保证了领导人一定拥有所有已经被提交的日志条目,但是在他任期开始的时候,他可能不知道哪些是已经被提交的。为了知道这些信息,他需要在他的任期里提交一条日志条目。