raft算法-顺带处理前任的事-看似随心却是精心

今天在跑raft算法的时候,突然发现一个有意思的细节:如何处理前任未提交的日志。
我们都知道raft选举的时候会综合考虑任期(term)和日志索引(index),优先选择具备最新的数据的节点成为master,这个其实非常容易理解,这是为了最大化保持数据。
但这里面有个小细节就是,如下图所示,S3在任期7的时候提交了一个日志,但它还没来得及复制就挂了。

在这里插入图片描述
之后master切换到其他节点。如果此时其他节点再重新写数据的时候,会覆盖S3中index为4的日志,这点相信大家都很容易理解,毕竟它是一个未被提交的日志。那如果在这段时间内集群没有新数据提交,然后S3在任期12的时候又重新回到master位置,这时会raft会怎样处理呢?
这里回到文章的标题,raft的做法是:顺带处理前任的事。当成为master后他会将数据复制到其他节点但并不会立刻提交,而且在它提交本任期的日志的时候,顺带提交之前任期的日志。大家可能觉得这个好像没有差别啊,貌似没有差别啊。
其实这里充满设计者的智慧,设想一下,如果S3在启动的时候复制完日志立刻就提交的话,会存在一个问题:它复制的日志存在被覆盖的风险。还是看图说话吧
在这里插入图片描述
在任期2内黄色的被提交的日志,很有可能被任期3的所覆盖,为了避免这个问题,只有在e图中,任期4提交数据的时候顺带提交之前的日志,才是正确的打开方式。因为此时如果S1挂了,也没事,重新选举的时候,由于S1/S2/S3都是任期4,即便重新选举也是在他们三个中间,任期2黄色的数据就可以保证“已提交的日志不会丢失”这个规则。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章