理解Raft一致性算法—一篇学术论文总结
Posted java达人
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理解Raft一致性算法—一篇学术论文总结相关的知识,希望对你有一定的参考价值。
作者: Shubheksha
译者: java达人
来源: https://www.freecodecamp.org/news/in-search-of-an-understandable-consensus-algorithm-a-summary-4bc294c97e0d/
Raft:
-
领导者选举: 现有领导者失效时,需要选举新的领导者。 -
日志复制: 领导者需要通过复制保持所有服务器的日志与自己的同步。 -
安全性: 如果其中一个服务器在特定索引上提交了日志条目,那么其他服务器不能在该索引应用不同的日志条目。
基础
在正常操作中,只有一个领导者,其他所有服务器都是追随者。追随者是被动的:他们不会主动发出请求,而只是响应领导者和候选人的请求。领导者处理所有客户端请求(如果客户端与追随者联系,追随者将其重定向到领导者)。第三种状态候选人,在选举新的领导者时被使用。
如果一个服务器的当前任期号小于其他服务器,那么它将把当前任期更新为更大的值。如果候选人或领导者发现其任期已过期,则立即转化为追随者状态。如果服务器接收到带有过期任期号的请求,它将拒绝该请求。
-
候选人在选举期间使用RequestVote -
AppendEntry被领导者用来复制日志条目,也用作心跳(检查服务器是否启动的信号—它不包含任何日志条目)
领导者选举
-
候选人从大多数服务器获得选票并成为领导者。然后,它向集群中的其他成员发送心跳消息以建立权限。 -
如果其他候选人收到AppendEntries RPC,他们检查任期编号。如果任期大于他们自己的,他们接受该服务器为领导者并返回到追随者状态。如果任期号更小,则它们拒绝该RPC,保持候选人状态。 -
候选人中没有选出领导者。 如果同时超过一台服务器成为候选人,由于没有明显的多数票,投票可能会出现分歧。在这种情况下,其中一名候选人超时后, 新的选举开始。
Raft通过随机的选举超时时间来确保投票分歧是罕见的,即使出现了它们也能够快速解决。为了从一开始就防止投票分歧,选举超时时间是从固定的间隔中随机选择的(例如,150-300ms)。它被分发到服务器,因此在大多数情况下,只有一台服务器会超时;它赢得了选举,并在其他服务器超时之前发送心跳。同样的机制也用于处理投票分歧。每个候选人在选举开始时重启其随机的选举超时计数,并在开始下一次选举前等待超时;这降低了在新选举中再次出现投票分歧的可能性。
日志复制:
-
包含客户端指定的命令 -
有一个索引来标识日志中条目的位置(索引从1开始) -
有一个任期编号,用于在逻辑上标识条目何时写入
Raft维护以下属性,它们共同构成日志匹配特征
如果不同日志中的两个条目具有相同的索引和任期,那么它们存储的是相同的指令。 如果不同日志中的两个条目具有相同的索引和任期,那么日志中之前的所有条目都是相同的。
在Raft中,领导者通过强制追随者复制自己的日志来处理不一致。这意味着追随者日志中的冲突条目将被领导者日志中的条目覆盖。
领导者給每个追随者维护一个nextIndex,这是领导者将发送给追随者的下一个日志条目的索引。当领导者第一次被选举成功,它会根据日志条目的最后一个索引初始化所有nextIndex值。
使用这种机制,当被选举成功,领导者不需要采取任何特殊的行动来恢复日志一致性。它只需要开始正常操作,日志会自动收敛,以响应Append-Entries一致性检查的失败。领导者从不重写或删除自己日志中的条目。
(java达人语: 领导者可能在任意阶段挂掉,在这不同阶段如何处理,此文有详细论述https://www.cnblogs.com/mindwind/p/5231986.html)
安全性
Raft通过比较日志中最后一个条目的索引和任期来确定两个日志中哪个是最新的。如果日志的最后一个条目具有不同的任期,那么拥有较新任期的日志是最新的。如果日志以相同的任期结束,那么较长的日志是最新的。
集群成员:
为了确保配置更改机制的安全性,在过渡期间不能同时选举两名领导人。不幸的是,任何将服务器直接从旧配置切换到新配置的方法都是不安全的。
joint consensus允许各个服务器在不同的时间在不同的配置之间进行转换,而不会损害安全性。此外, joint consensus允许集群在整个配置更改期间继续为客户端请求提供服务。
-
日志条目被复制到在两个配置上的所有服务器。 -
新老配置中的所有服务器都可以成为领导者。 -
只有在新老配置中分别占有多数,才能达成一致(选出 领导者 和进行 Log 提交)。
现在,对于领导者来说,创建一个描述C<new> 的日志条目并将其复制到集群中是安全的。同样,一旦发现该配置,它将立即在每个服务器上生效。当在C<new>规则下提交新配置后,旧的配置就不相关了,不在新配置中的服务器可以被关闭。
java达人
ID:drjava
(长按或扫码识别)
以上是关于理解Raft一致性算法—一篇学术论文总结的主要内容,如果未能解决你的问题,请参考以下文章