- 响应来自候选人和领导人的请求
- 如果在超过选举超时时间的情况之前没有收到当前领导人(即该领导人的任期需与这个跟随者的当前任期相同)的心跳/附加日志,或者是给某个候选人投了票,就自己变成候选人
候选人(5.2 节):
- 在转变成候选人后就立即开始选举过程自增当前的任期号(currentTerm)给自己投票重置选举超时计时器发送请求投票的 RPC 给其他所有服务器
- 如果接收到大多数服务器的选票,那么就变成领导人
- 如果接收到来自新的领导人的附加日志(AppendEntries)RPC,则转变成跟随者
- 如果选举过程超时,则再次发起一轮选举
领导人:
- 一旦成为领导人:发送空的附加日志(AppendEntries)RPC(心跳)给其他所有的服务器;在一定的空余时间之后不停的重复发送,以防止跟随者超时(5.2 节)
- 如果接收到来自客户端的请求:附加条目到本地日志中,在条目被应用到状态机后响应客户端(5.3 节)
- 如果对于一个跟随者,最后日志条目的索引值大于等于 nextIndex(lastLogIndex ≥ nextIndex),则发送从 nextIndex 开始的所有日志条目:如果成功:更新相应跟随者的 nextIndex 和 matchIndex如果因为日志不一致而失败,则 nextIndex 递减并重试
- 假设存在 N 满足N > commitIndex,使得大多数的 matchIndex[i] ≥ N以及log[N].term == currentTerm 成立,则令 commitIndex = N(5.3 和 5.4 节)
图 2:一个关于 Raft 一致性算法的浓缩总结(不包括成员变换和日志压缩) 。
特性
解释
选举安全特性
对于一个给定的任期号,最多只会有一个领导人被选举出来(5.2 节)
领导人只附加原则
领导人绝对不会删除或者覆盖自己的日志,只会增加(5.3 节)
日志匹配原则
如果两个日志在某一相同索引位置日志条目的任期号相同,那么我们就认为这两个日志从头到该索引位置之间的内容完全一致(5.3 节)
领导人完全特性
如果某个日志条目在某个任期号中已经被提交,那么这个条目必然出现在更大任期号的所有领导人中(5.4 节)
状态机安全特性
如果某一服务器已将给定索引位置的日志条目应用至其状态机中,则其他任何服务器在该索引位置不会应用不同的日志条目(5.4.3 节)
文章插图
图 3:Raft 在任何时候都保证以上的各个特性 。5.1 Raft 基础
一个 Raft 集群包含若干个服务器节点;5 个服务器节点是一个典型的例子,这允许整个系统容忍 2 个节点失效 。在任何时刻,每一个服务器节点都处于这三个状态之一:领导人、跟随者或者候选人 。在通常情况下,系统中只有一个领导人并且其他的节点全部都是跟随者 。跟随者都是被动的:他们不会发送任何请求,只是简单的响应来自领导人或者候选人的请求 。领导人处理所有的客户端请求(如果一个客户端和跟随者联系,那么跟随者会把请求重定向给领导人) 。第三种状态,候选人,是用来在 5.2 节描述的选举新领导人时使用 。图 4 展示了这些状态和他们之间的转换关系;这些转换关系会在接下来进行讨论 。
文章插图
图 4:服务器状态 。跟随者只响应来自其他服务器的请求 。如果跟随者接收不到消息,那么他就会变成候选人并发起一次选举 。获得集群中大多数选票的候选人将成为领导人 。在一个任期内,领导人一直都会是领导人,直到自己宕机了 。
文章插图
图 5:时间被划分成一个个的任期,每个任期始于一次选举 。在选举成功后,领导人会管理整个集群直到任期结束 。有时候选举会失败,那么这个任期就会没有领导人而结束 。任期之间的切换可以在不同的时间不同的服务器上观察到 。
Raft 把时间分割成任意长度的任期,如图 5 。任期用连续的整数标记 。每一段任期从一次选举开始,就像章节 5.2 描述的一样,一个或者多个候选人尝试成为领导人 。如果一个候选人赢得选举,然后他就在接下来的任期内充当领导人的职责 。在某些情况下,一次选举过程会造成选票的瓜分 。在这种情况下,这一任期会以没有领导人结束;一个新的任期(和一次新的选举)会很快重新开始 。Raft 保证了在一个给定的任期内,最多只有一个领导人 。
推荐阅读
- 编译器的自动内存管理,静态的GC算法
- 图像对比度增强算法!为什么图像的对比度不宜过大?图像对比度的基本原理是什么?
- 对数运算法则 对数运算
- 对数的运算法则及公式 对数的运算
- 算法推荐时代,“儿童邪典片”危害不可低估
- 公元纪年法的算法
- 海量数据处理的算法 海量数据处理
- 女子标准体重计算公式:三种算法都不达标,问题可能出在自己身上
- 最小公倍数怎么求算法 最小公倍数怎么求
- AI绘画野蛮生长现隐忧 是“拼接”还是算法生成?