背景
提到Raft不得不提到Paxos,Paxos 协议是由 Leslie Lamport在1989年提出的一种分布式一致性协议,它是分布式系统领域中的经典协议之一。Leslie Lamport 是分布式计算领域的著名科学家,曾获得图灵奖等多项荣誉。Paxos 协议被称为经典协议,它提供了一种在异步网络模型下实现分布式系统状态机复制的解决方案,而这种解决方案被认为是具有通用性的。Paxos协议是许多后来的分布式一致性算法的基础,例如 ZooKeeper 和 Raft 等。
但是Paxos协议难以理解并且很难实现,只有理论意义,没有实践意义。于是Diego Ongaro和John Ousterhout于2013年开发的一种基于领导者的共识算法,允许分布式系统中各节点在出现故障时可以针对一系列的数值达成一致,以可靠、复制、冗余、容错而闻名。即Raft算法,Raft在容错和性能上等同于Paxos,但是比Paxos简单易理解,并具有可以落地的实践意义(Paxos只有理论意义,难以实现)。
基础概念
领导者(Leader):客户端请求由leader处理,如果请求发送到follower,会被重定向到Leader,同时管理日志复制和不断地发送心跳信息。
跟随者(Follower):普通成员,处理领导者和候选人发来的消息,发现领导者心跳超时,推荐自己成为候选人。
候选人(Candidate):Follower竞选Leader的中间状态任期编号(Term):每任领导者都有任期编号。当领导者心跳超时,跟随者会变成候选人,任期编号 +1,然后发起投票。任期编号小的服从编号大的。
心跳超时(heartbeat timeout):每个跟随者节点都设置了随机心跳超时时间,目的是避免跟随者们同时成为候选人,同时发起投票。
选举超时(election timeout):Follower发起选举的超时时间,如果Follower在election timeout时间内没有收到Leader心跳,那么认为Leader fail,发起选举。每个Follower的选举超时时间是随机的,在(150ms-300ms)之间,随机选举超时时间可以避免多个候选人同时结束选举未果,然后同时发起下一轮选举
节点通信:
RequestVotes RPC:由候选节点发送,用于在选举期间向其他节点请求选票;
AppendEntries RPC:这个RPC由leader发起,携带最新收到的命令。它还用作心跳消息。当follower收到此消息时,选举计时器将被重置。
Raft将共识协议分成三个部分
领导者选举(Leader election): Raft 集群存在一个主节点(leader),客户端向集群发起的所有操作都必须经由主节点处理。主节点负责处理数据更新和复制的任务,因此没有leader,集群将无法工作。需要先进行领导者选举再进行下述操作;
日志复制(Log replication): Leader节点会负责接收客户端发过来的操作请求,将操作包装为日志条目并在集群中进行同步操作来确保其他节点的日志与自己的日志一致。在保证大部分节点都同步了本次操作后,就可以安全地给客户端回应响应了;
安全性(Saft) :分布式系统中有很多种情况可能发生,算法需要设置多项安全属性(限制)为系统的正确性以及可用性提供安全保证。具体有哪些关键的安全属性以及Raft如何确保,后面将详细介绍。
领导者选举
1、角色
Raft中的成员有三个身份:领导者(Leader)、跟随者(Follower)和候选者(Candidate)。
领导者(Leader):客户端请求由leader处理,如果请求发送到follower,会被重定向到Leader,同时管理日志复制和不断地发送心跳信息。
跟随者(Follower):普通成员,处理领导者和候选人发来的消息,发现领导者心跳超时,推荐自己成为候选人。
候选人(Candidate):Follower竞选Leader的中间状态
角色状态流转图:

2、任期
raft根据角色状态将时间划分为不同的任期,在一个任期内最多只有一个leader,每个任期由单调递增的数字(任期编号)标识。
每一轮选举任期编号都会+1,每个任期开始都是选举,有的任期只有选举阶段没有正常运行阶段,是因为选举失败没有Candidate当选为Leader。
任期如下图所示:

Raft 任期具有如下特点:
- 跟随者在等待领导者心跳消息超时后,推举自己为候选人时,会增加自己的任期编号,比如节点 A 的当前任期编号为


1154

被折叠的 条评论
为什么被折叠?



