包教包会!用一张白纸教你推导出 RAFT 算法( 五 )


左村长:我之前是主家,我收到你们的消息里面的任期号比我自己的大,我也要听你们的吗?
欧阳:简单处理啊,不管你是主家,还是你发起选举做了候选人,收到的消息里面的任期号比你们自己的大,就自觉一点,主动把自己村的地位降到分家,不就可以了吗?因为你们都错过了至少一个时代了,还想继续做主家,别人岂不是都要配合你们,这时候说不定别人好多你们错过的事件都刻到石碑上了 。顺便说一下啊,刚才我已经设定了每家等待个一定范围内的随机时间再发起选举的规则,选举冲突不容易发生了,我们刚穿越回去那会儿,也不用提前指定谁做第一个主家了,也用这种选举机制来选吧,这样左老师你压力也不用那么大了哈 。
左村长: 。。。
大家停下来消化了一下前面对话的内容,发觉欧阳村长说的这一套还真是能解决很多问题,司马村长开始整理笔记了 。

包教包会!用一张白纸教你推导出 RAFT 算法

文章插图
 
图9 根据针对选举的讨论完善出来的全套机制
这次因为新增的内容比较多了,司马村长把新增的内容都用红色笔来记了,还修复一些班村长之前吐槽的不通顺的语句,还补充了投票过程中容易想出来的一些细节 。写完以后大家看了一会,司马村长觉得十分满意了,最后达成的成果(5)就是大家的终极目标了,但是这时候顾村长又看出问题来了 。
顾村长:前面那个图 8 里面,要是通信方式全部被卡断的,不是作为主家的左村,而是作为分家的我们顾村的话,就有问题了 。我们顾村收不到任何消息,3 个月以后自己成为候选村,增大自己的任期号,发出去的选举消息你们也收不到,然后我们顾村继续提升自己的任期号,不断发起新的选举 。要是三年后,通信恢复了,我的任期号最大,你们收到我的选举请求,都要参见龙王了 。
欧阳:三年后我们收到你的选举消息,确实主家也要自认任期号不够看,自降为分家,但只要这三年里有新事件被主家安全确认过,你也不可能被投成新的主家 。因为我们投票还要看你最后的记录事件有没有我们的新 。你自己这三年记录不了任何事件,主家只要有新事件安全确认过,那至少有 3 家记录了这个新事件,这 3 家都不会投票给你,你最多 2 票,怎么当选主家呢?所以说,最后当主家的,一定还是记下了所有事件的村子 。反过来说,要是三年里面没新事件被安全确认,那你当上主家,也没什么问题,因为你也是记录了所有事件的,你当主家就当呗 。
当然了,你这样冒出来,打断本来干的好好的主家的工作,确实影响了大家对历史的记录,投票这段时间,都没有主家正常工作了,所以这点我们可以补一些限制规则,比如正式投票前让你发个民意调查什么的,要是你民意调查都过不了,就不要发什么选举来浪费大家时间了,当然这个规则可以以后补充清楚,因为民意调查也可能拖慢了正常需要发起选举的节奏 。
五、龙王归来欧阳村长说完以后,大家都很佩服其深谋远虑,这时候班村长拿出来一份打印材料,大家都瞥了一眼,居然是洋文的,标题很长:“In Search of an Understandable Consensus Algorithm” 。然后班村长发话了,今天晚上大家能制定出这样一个计划来,很了不起了,不过还有两个点大家是没想到的,一个是主家新上任的时候,主家已经确认安全的最大页码,不一定比分家都大,传递记录事件消息的时候,要特别注意,司马你记得笔记里复制规则那里其实是凭直觉蒙对的 。这一点我提示你们以后,你们仔细想想,应该都能想到的 。不过还有一种情况就不容易想到啦,你们过来看看这张图:
包教包会!用一张白纸教你推导出 RAFT 算法

文章插图
 
图10 超级复杂的轮流做主家(论文原文图8)
班村长开始解释了,我这个图上不同颜色的小方块代表不同任期记录下来的事件,小方块里的数字代表事件记录里的任期号是多少,abcd(e)代表顺序的4 个时间点,每个时间点上,谁的记录外面的框轮廓粗,谁就是当时的主家,比如(a)时期 S1 就是主家,(d)时期 S5 就是主家 。我们来看一下发生了什么啊,(a)这个时间点呢,S1 是主家,把他记录的第 2 页上的事件(黄色)同步给了 S2,然后他们村连同还在路上的信使都被灭了 。
到了(b)这个时间呢,S5 因为在选举中,得到 S3,S4 的支持当上了主家,并且他在第 2 页上记录了一个新事件(蓝色) 。这里都好理解吧,S5 赢得选举的时候,因为只有 S2 一个村有更新的事件,所以只要 S5 先发起选举,S5 就可以得到 3 票了,反正黄色事件之前也不可能被任何村子确认为安全,所以这个结果也合理嘛 。


推荐阅读