关于选举当选后发空日志的理解问题

依据论文所述,一候选节点选举为Leader后,马上发送Initial Empty AppendEntries RPCs(heartbeat)给所有的Server,并且为了保持不超时,会每隔一段时间不断重复发送。我之前看到一些实现中,这个Empty AppendEntries也会发送Entry,但是是发送一个无data的Entry,所以这种情况下是发送无data的Entry还是发送长度为0的Entries[],为什么要存储一个无data的Entry呢,这样不是浪费了一个entry的空间吗。

是无data的entry。

如果之前有不在当前term的没有提交的日志项,可以通过此次通信之后提交。

举个例子,Leader将一个新的日志写入到了所有节点就宕机了,集群选举出了一个新的Leader。如果后来没有客户端的写入请求,那么commitIndex就一直不会更新,这个新的日志项就不会被commit,被apply到状态机,但其实已经同步到了所有的节点。

这个时候需要一个AppendEntries RPC,用来写入一个新的entry,顺便把之前的那个entry提交。

选举后立刻发送空日志的目的是进行一次广播,告诉其他节点自己当选了。防止在当选到发送日志(心跳)的间隙,有节点超时重置选举。

空长度的entry和长度为零的entry 只是一个占位而已,我感觉是互不影响,主要是解决存活状态通知其他节点,防止其他节点状态切换,这是我理解,希望对你帮助,哈哈哈,及供参考。