我们线上发版时会触发leader shutdown,观察会有小概率导致no leader,具体原因如下:
leader通过找到最大的next index来确定transfer leader的candidate,next index通过下面逻辑计算得到
next_index = r->_next_index - r->_flying_append_entries_size;
这里如果一个replicator已经发出去但没有收到ack,另一个没发出,但没发出的作为candidate,则这次transfer leader就会失败,导致短暂的no leader,等到下次选主恢复。
这里要修复的话,就需要日志多的节点再拒绝掉上一次vote后,能够识别出这次vote是transfer leader导致,尽快触发自身投票,减少no leader的时间