raft 笔记

leader选举

目标 :确保所以log的entry 传送方向是: leader -> follower
策略:选出的leader就包含所有term中已经提交的log entry


目标:选出包含所有term中已经提交的log entry的leader
策略:只向比自己更新的cadidate投票。

更新:
1 最后一条log entry 的term 大的更新。
2 在1 条件下,日志更长的更新。

如何提交之前任期内的log entry

image.png

如图的时间序列展示了为什么 leader 无法判断老的任期号内的日志是否已经被提交。在 (a) 中,S1 是 leader ,部分地复制了索引位置 2 的日志条目。在 (b) 中,S1 崩溃了,然后 S5 在任期 3 中通过 S3、S4 和自己的选票赢得选举,然后从客户端接收了一条不一样的日志条目放在了索引 2 处。然后到 (c),S5 又崩溃了;S1 重新启动,选举成功,继续复制日志。此时,来自任期 2 的那条日志已经被复制到了集群中的大多数机器上,但是还没有被提交。如果 S1 在 (d) 中又崩溃了,S5 可以重新被选举成功(通过来自 S2,S3 和 S4 的选票),然后覆盖了他们在索引 2 处的日志。但是,在崩溃之前,如果 S1 在自己的任期里复制了日志条目到大多数机器上,如 (e) 中,然后这个条目就会被提交(S5 就不可能选举成功)。 在这种情况下,之前的所有日志也被提交了。

在c状态下 对于 2 号log entry 是否已经做过commit(虽然副本数已经过半),leader能否做出判断?
答案: 不能

因为如果此时如果认为2 号log entry 已经提交,并且将2号应用与状态机,那么接下来的可能的发展方向是什么呢?
d 状态是一种发展方向,此时2号entry完全覆盖掉了,一个被commit(或者应用到状态机) 的entry竟然被覆盖掉了,what? 这能忍吗?显然不行。

如何避免?
我们发现如果朝着 e方向发展,在e的状态下,认为2是提交的完全没有问题(不可能再有任何情况会将2 覆盖掉)。
那么e是什么状态呢?
e 的状态在当前(最新的)任期内commit了一条新的 log entry。
所以:
老任期内的log entry被当前任期内的新(对新 log entry)commit 间接提交。
换句话说: 老任期内的log entry 能不能看做是被提交的还得依赖后面有没有新的log entry commit过。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 可进入我的博客查看原文。 Raft 算法是可以用来替代 Paxos 算法的分布式一致性算法,而且 raft 算法比...
    Jeffbond阅读 13,665评论 4 91
  • 最近看了Ongaro在2014年的博士论文《CONSENSUS: BRIDGING THEORY AND PRAC...
    山本聪阅读 4,731评论 3 11
  • 1 整体描述 在Raft被提出来之前,Paxos协议是第一个被证明的一致性算法,但是Paxos的论文非常难懂,导致...
    船_长阅读 7,441评论 0 7
  • 寻找一种易于理解的一致性算法(扩展版) 摘要 Raft 是一种为了管理复制日志的一致性算法。它提供了和 Paxos...
    yflau阅读 1,117评论 0 1
  • 一 SMR 副本状态机:每个服务器节点作为状态机,接收相同顺序的操作指令,产生相同的状态变更,构成一组强一致的副本...
    梦工厂阅读 810评论 0 4

友情链接更多精彩内容