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


到了(c)时期,S5 这个村子连同信使都被灭了,他们记录下来的事件一个村子都没传递到,而 S1 那边出现了幸存者,凭着记录的黄色事件,在连续将任期号提升到 4 以后,赢得了选举,并且在第 3 页上记录下来了新的事件(粉色) 。在将新事件传递给 S3 的时候,因为被拒绝所以退而求其次将将第 2 页上的黄色事件同步给了 S3,这样 S3 在第 2 页上也记录下了黄色事件,黄色事件也就有 3 个村子记录下来了,按照你们前面的讨论,S1 就要对黄色事件做安全确认了 。
要是 S1 确认黄色事件安全,将其刻到石碑上,之后再次被灭村,S5 那边的幸存者,凭借自己在第二页上记录下来的蓝色事件,至少可以在连续提升自己任期号到 5 以后,在选举中得到 S3 和 S4 的支持 。因为 S3 虽然记录了黄色事件,但黄色事件的任期号是 2,蓝色事件的任期号是 3,蓝色事件在规则中是更新的 。S5 赢得选举做了主家以后,在(d)这个时候,是可以把第 2 页上的蓝色事件复制到其他所有村子记事本的第 2 页上的,蓝色事件在第 2 页上被确认安全的话,和之前在第 2 页上已经被 S1 确认甚至被刻到石碑上的黄色事件就冲突了 。
所以说你们前面讨论的规则里面还是有一个关键漏洞的 。不过你们也别那么痛苦的一副表情了,你们继续看图吧 。如果 S1 没有那么快被屠村,没有(d)这个时刻的事情,而是到了(e)这个时间点上,完成了复制粉色事件给 S2,S3 的任务,这时候 S1 确认粉色事件是安全的并刻到石碑上 。之后不管发生什么事情,S5 的蓝色事件在选举中都是不如 S1,S2,S3 最后记录的粉色事件新的(任期号直接分胜负),也就再也选不上主家了 。
总结一下呢,就是主家只能确认自己当前任期内的事件是否安全,而不能确认之前任何一个任期内的事件是否安全,而根据你们最早就得出的成果(1),一页上的事件被确认安全了,那这一页之前所有页上记录的事件也就安全了,所以过往任期中的事件是可以通过当前任期的事件安全性被确认的 。司马你的纸给我,我来修改一下吧 。

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

文章插图
 
图11 集中大家的智慧讨论出来的最终方案
班村长写完以后继续说到,我把改动都用蓝色标记出来了,复制记录事件的规则里面,司马刚才是凭直觉写对了“要确认主家的安全页码大于自己的”这类规则的,所以这个我也标出来了 。最重要的,就是最后达成的成果,我改了一下,可不是随便一页上的事件有超过 3 个村子记录了,就可以确认安全哦 。切记切记 。我在这里隐忍了三个小时了,听你们说了这么多,现在我要回去睡觉了 。
剩下的村长沉思了大半个小时,然后对着班村长离去的方向拱手作揖,“参见龙王” 。
六、推广总结到这里呢,这个穿越时空的小故事就差不多结束了 。之前看过 raft 论文或者现在再去看的同学,应该都可以轻松的把故事里面的名词和论文中的对应起来了,多多少少对论文中一开始就出现的协议规则是怎么来的能有一些新的理解了 。写这个故事的时候,通过好友之间讨论的形式来构造的情节,希望通过这种方式能让更多同学对分布式共识算法产生兴趣,消除恐惧,在自己业务里面合适的场景中用上这种能力来提升服务的质量,当然因为水平有限出现的一些错误也请大家多多包涵指正 。
感谢所有不吝三连支持的同学 。最后把这篇文章送给这些年来在一线研发岗位上一起奋斗战友,过去和你们每一次为了更完美的解决方案的讨论,都让我受益良多,很多场面我会永远记得,以这个故事向纯粹的你们致敬 。
后记司马:左老师,除了我给你们的笔记上提到的那些东西,你还准备带些什么宝贝一起穿越啊?
左村长:我要带上我最喜欢的愤怒的小鸟周边,哈哈哈!




推荐阅读