在 Raft 算法中,领导人是通过强制跟随者直接复制自己的日志来处理不一致问题的 。这意味着在跟随者中的冲突的日志条目会被领导人的日志覆盖 。5.4 节会阐述如何通过增加一些限制来使得这样的操作是安全的 。
要使得跟随者的日志进入和自己一致的状态,领导人必须找到最后两者达成一致的地方,然后删除跟随者从那个点之后的所有日志条目,并发送自己在那个点之后的日志给跟随者 。所有的这些操作都在进行附加日志 RPCs 的一致性检查时完成 。领导人针对每一个跟随者维护了一个 nextIndex,这表示下一个需要发送给跟随者的日志条目的索引地址 。当一个领导人刚获得权力的时候,他初始化所有的 nextIndex 值为自己的最后一条日志的 index 加 1(图 7 中的 11) 。如果一个跟随者的日志和领导人不一致,那么在下一次的附加日志 RPC 时的一致性检查就会失败 。在被跟随者拒绝之后,领导人就会减小 nextIndex 值并进行重试 。最终 nextIndex 会在某个位置使得领导人和跟随者的日志达成一致 。当这种情况发生,附加日志 RPC 就会成功,这时就会把跟随者冲突的日志条目全部删除并且加上领导人的日志 。一旦附加日志 RPC 成功,那么跟随者的日志就会和领导人保持一致,并且在接下来的任期里一直继续保持 。
如果需要的话,算法可以通过减少被拒绝的附加日志 RPCs 的次数来优化 。例如,当附加日志 RPC 的请求被拒绝的时候,跟随者可以(返回)冲突条目的任期号和该任期号对应的最小索引地址 。借助这些信息,领导人可以减小 nextIndex 一次性越过该冲突任期的所有日志条目;这样就变成每个任期需要一次附加条目 RPC 而不是每个条目一次 。在实践中,我们十分怀疑这种优化是否是必要的,因为失败是很少发生的并且也不大可能会有这么多不一致的日志 。
通过这种机制,领导人在获得权力的时候就不需要任何特殊的操作来恢复一致性 。他只需要进行正常的操作,然后日志就能在回复附加日志 RPC 的一致性检查失败的时候自动趋于一致 。领导人从来不会覆盖或者删除自己的日志(图 3 的领导人只附加特性) 。
日志复制机制展示出了第 2 节中形容的一致性特性:Raft 能够接受,复制并应用新的日志条目只要大部分的机器是工作的;在通常的情况下,新的日志条目可以在一次 RPC 中被复制给集群中的大多数机器;并且单个的缓慢的跟随者不会影响整体的性能 。
5.4 安全性
前面的章节里描述了 Raft 算法是如何选举和复制日志的 。然而,到目前为止描述的机制并不能充分的保证每一个状态机会按照相同的顺序执行相同的指令 。例如,一个跟随者可能会进入不可用状态同时领导人已经提交了若干的日志条目,然后这个跟随者可能会被选举为领导人并且覆盖这些日志条目;因此,不同的状态机可能会执行不同的指令序列 。
这一节通过在领导选举的时候增加一些限制来完善 Raft 算法 。这一限制保证了任何的领导人对于给定的任期号,都拥有了之前任期的所有被提交的日志条目(图 3 中的领导人完整特性) 。增加这一选举时的限制,我们对于提交时的规则也更加清晰 。最终,我们将展示对于领导人完整特性(Leader Completeness Property) 的简要证明,并且说明该特性是如何引导复制状态机做出正确行为的 。
5.4.1 选举限制
在任何基于领导人的一致性算法中,领导人都必须存储所有已经提交的日志条目 。在某些一致性算法中,例如 Viewstamped Replication,某个节点即使是一开始并没有包含所有已经提交的日志条目,它也能被选为领导人 。这些算法都包含一些额外的机制来识别丢失的日志条目并把他们传送给新的领导人,要么是在选举阶段要么在之后很快进行 。不幸的是,这种方法会导致相当大的额外的机制和复杂性 。Raft 使用了一种更加简单的方法,它可以保证在选举的时候新的领导人拥有所有之前任期中已经提交的日志条目,而不需要传送这些日志条目给领导人 。这意味着日志条目的传送是单向的,只从领导人传给跟随者,并且领导人从不会覆盖自身本地日志中已经存在的条目 。
Raft 使用投票的方式来阻止一个候选人赢得选举,除非这个候选人包含了所有已经提交的日志条目 。候选人为了赢得选举必须联系集群中的大部分节点,这意味着每一个已经提交的日志条目在这些服务器节点中肯定存在于至少一个节点上 。如果候选人的日志至少和大多数的服务器节点一样新(这个新的定义会在下面讨论),那么他一定持有了所有已经提交的日志条目 。请求投票(RequestVote) RPC 实现了这样的限制:RPC 中包含了候选人的日志信息,然后投票人会拒绝掉那些日志没有自己新的投票请求 。
推荐阅读
- 编译器的自动内存管理,静态的GC算法
- 图像对比度增强算法!为什么图像的对比度不宜过大?图像对比度的基本原理是什么?
- 对数运算法则 对数运算
- 对数的运算法则及公式 对数的运算
- 算法推荐时代,“儿童邪典片”危害不可低估
- 公元纪年法的算法
- 海量数据处理的算法 海量数据处理
- 女子标准体重计算公式:三种算法都不达标,问题可能出在自己身上
- 最小公倍数怎么求算法 最小公倍数怎么求
- AI绘画野蛮生长现隐忧 是“拼接”还是算法生成?