我目前正在实施Raft一致性算法,我遇到了以下问题。考虑有4个节点(A,B,C和D),因此可以提交超过2票的日志条目。现在我们启动集群并使用term = 0
选举领导者A.然后发生以下事情:
LogEntry
X.term = 1
选举。RequestVote
RPC。LogEntry
X.因此集群中没有领导者。LogEntry
X复制到B.LogEntry
X,即(index = 0, term = 0)
。然而,根据筏纸,领导者A不能提交X,尽管它是由自己生成的,并且大多数人同意X.
Raft从不通过计算副本来提交以前术语的日志条目。通过计算副本,只提供领导者当前术语的日志条目;LogEntry
s要复制,所以LogEntry
X仍未提交。我的问题是:
领导者完整性属性保证领导者拥有所有已提交的条目,但在其任期开始时,它可能不知道这些是什么。要找出答案,需要从其术语中提交一个条目。 Raft通过让每个领导者在其术语开始时向日志中提交空白的无操作条目来处理此问题
在你的情况下,在第7步之后,A
将创建一个NoOp
日志条目,它将成功复制它,提交它,因此所有以前的条目都将被提交。