![包教包会!用一张白纸教你推导出 RAFT 算法](http://img.jiangsulong.com/220423/10304561K-5.jpg)
文章插图
图5 主家发送同步事件的基本规则
司马村长刚画完示意图,左村长就发现了问题:就算只比较前一页的事件一样不一样,也没有百分百的把握啊,远古时期年历容易出现偏差,地名也不一定对齐,传递消息时间又长,万一不同的地方连续出现类似的天灾一类的事件,说不定记录都差不多,前面反复说到的事件“相同”的这个“相同”要有明确的判断标准才行啊 。
大家再次陷入沉思,大概五分钟之后,又是欧阳村长说话了:要简单判断事件是不是“相同”,要把我们之前一个没用上的关键信息给用起来了 。按照我们之前的设定,理想情况下一个时期只会有一个主家负责记录事件,如果主家出事了,分家都收不到主家的信息了,可能选出一个新的村落做主家,每一个主家上任后负责记录的这段时间就叫主家的任期好了,我们给每一个任期遍一个号,叫任期号,任期号从 1 开始,每次新上任的主家的任期号就是上一个任期号加 1,这样每段任期就有唯一的任期号了 。
每一个主家记录事件的时候,给每个事件都记上自己当时的任期号并在同步事件的时候都带着事件对应的任期号,分家收到事件的时候,记录的时候也把对应的任期号记录在那一页上,这样下来,只要所有主家保证不修改自己之前记录下的任何一页上的事件,那可以简单推导出来:同一页上标注的任期号相同,这一页的记录就一定相同 。这时候顾村长表示这通操作不太理解了,这时不怎么说话的班村长拿起记事本给他演示了一下:
![包教包会!用一张白纸教你推导出 RAFT 算法](http://img.jiangsulong.com/220423/1030454404-6.jpg)
文章插图
图6 记事本每一页记录事件的样式
正常情况下任何时期我们里面的主家只有一个,对应的任期号 T 也只有一个,主家在第 N 页上记下事件的时候带上了自己的任期号 T,相当于告知大家这页的事件是我写的,只要主家保证自己记录下来的事件,自己在这一个任期内绝对不会改,那分发出去的任何一页上的事件,只要任期号相同就代表是同一个主家在同一个任期记录下来的,这个主家在这个任期里又绝不可能回去改这个事件,那这页上的事件也就是相同的了 。
所以我们以后表示一个事件只要用 S(N,T)这种形式就可以了,页码 N 和任期 T 都相等,事件一定“相同”,以后这就是事件“相同”的定义了,事件相同也就再也不用打引号了 。顺带一提,主家每次同步过来的事件里的任期号,分家也要找个地方记下来,这样下次分家被选为主家的时候,才能正确的把任期加 1 哦 。说到这里,大家都懂了,主家向分家同步记录下来的事件的步骤都差不多出来了,司马村长也飞快的完成了这阶段的记录 。(图片请双击放大浏览)
![包教包会!用一张白纸教你推导出 RAFT 算法](http://img.jiangsulong.com/220423/1030455949-7.jpg)
文章插图
图7 初步完成了复制事件机制的设计
司马村长记录的同时还补上了主家怎么确认一页上记录的事件是不是可以被安全送去刻到石碑上的相关操作规则,还把主家已经确认的最大安全页码加在了主家传给分家的消息里,这样分家也能结合自己的情况确定自己可以刻到石板上的最大页码了 。为了方便刻石碑,还规定了每个村落把已经刻好的最大页码以及可以安全刻下来的最大页码分别记录一下 。
最后他还提出来,可能以后有些人会向村落爆料一些事件,如果这时候这个村落不是主家,又不知道主家现在是谁,那还挺尴尬的,所以每次主家传消息的时候记得报一下自己是谁,这样就可以引导爆料群众直接去主家那里直接爆料了 。这些设定都很容易理解,大家纷纷直呼内行 。不过班村长还是指出了笔记上几处语句不通顺以及字写错的地方 。
四、选举争霸讨论到这里,大家都挺累的了,司马村长和欧阳村长相视一笑,有了这些设定,是时候短兵相接,快速讨论一下选举主家的规则了吧 。
司马:穿越过去以后,要是我们一段时间没收到左村长的消息,我们是不是就可以开始选新的主家了,但是万一这段时间其实是左村长觉得没发生什么值得记录的事件,那就不太好了,我们到时候搞出两个主家来,前面的规则都破了 。
欧阳:简单处理,主家的人,就算没有要记录的事件发生,也最少每个月给所有分家发个消息,就算消息里面没有要记录的事件也要发,算是报个平安吧 。哪个分家连续三个月没收到主家的消息,再发起选举不迟 。
推荐阅读
- 别再用手敲了,这个工具可以自动生成python爬虫代码
- 如何阻止对Web应用程序发起的DoS攻击?
- 每次打胰岛素都要换针头吗 胰岛素针可以反复用吗
- 用不锈钢的筷子好还是木筷子好 筷子用不锈钢的好吗
- 逾期很久的信用卡还清了还能继续用吗? 逾期过后的信用卡还清后还可以使用么
- 使用 UEFI 双启动 Windows 和 Linux
- Shell脚本技巧-优雅的判断用户输入值并设置默认值
- 离线应用的福音-浏览器数据库indexdb
- 程序安装包咋制作的?Qt程序打包三部曲,从应用程序到安装包
- fifa足球世界技术动作 fifa21实用过人技巧