Raft术语总结
三种成员身份
raft提供三种成员身份,领导者(leader)、跟随者(follower)、候选人(candidate)
- 跟随者:相当于paxos中的acceptor,接收和处理leader的消息,当leader故障时,主动推荐自己为候选人
- 候选人:向其他节点发送请求投票消息(Request Vote),如果获得大多数选票,则晋升为leader
- 领导者:处理写请求,管理日志复制、发送心跳消息。
两种运行阶段
raft强化了leader的地位,把整个协议可以清楚的分割成两个部分,并利用日志的连续性做了一些简化:
- leader在时,由leader向follower同步日志。
- leader挂掉了,选一个新leader,leader选举算法。
两类rpc消息
- 请求投票消息(request vote),用于选举leader。
- 追加条目消息(append entry),用于心跳消息或日志复制消息。该包含当前最大的日志项。
raft与multi-paxos的区别
- 不是所有节点都能当选leader
只有日志最完整的才能当选leader,而multi-paxos则不需要保证这一点,也意味multi-paxos需要额外的流程从其它节点获取已经被提交的日志。 - 日志是连续的
日志的连续性蕴含了这样一条性质:如果两个不同节点上相同序号的日志,那么这和这之前的日志必然也相同的 - 简化的二阶段
Leader选举
在节点刚启动状态下,都处于follower状态。同时每个节点会为自己设置一个等待leader心跳消息的随机超时时间。当在超时时间之内没有收到来自leader的心跳信息时,则会推荐自己为candidate。随后增加自己的任期编号,并以candidate的身份发起请求投票消息,推荐自己为leader,当获得大多数选票后,晋升leader,发送心跳消息。
选举过程
例如,存在A、B、C三个节点的raft集群刚启动时,都处于follower状态,其中A超时时间为100ms,B超时时间为200ms,C超时时间为300ms。
节点信息
由于集群中不存在leader,A、B、C三个节点都不会收到来自leader心跳信息。其中,A节点的超时时间最小,则最先修改自己状态为candidate,并增加自己的任期编号为1,发起请求投票消息。