Raft学习总结
-
1 Raft综述
-
1.1 起源
Raft协议起源于 2013 年 斯坦福 Diego Ongaro和John Ousterhout的论文《In Search of an Understandable Consensus Algorithm》。作者表示因为Paxos 晦涩难懂且缺乏工程实现,所以要设计个既容易实现又利于学生学习的一致性算法。Raft 的数据一致性等价于 Multi Paxos,可以用于取代Paxos,并且证明可以提供与Paxos相同的容错性以及性能。
Raft协议是一种基于日志复制的一致性算法,通过选举领袖的方式来实现的。Raft协议设计首要目标是易于理解,所以采用了分解法(Raft流程可分解为选主、日志复制和安全)和状态空间简化(相较于 Paxos,Raft 减少了未定状态的数量)。 -
1.2 节点状态
在Raft集群里,服务器可能会是这三种身份其中一个:
(1)Leader(领袖者):所有请求的处理者,Leader 接受 client的更新请求,本地处理后再同步至多个其他节点;
(2)Follower(追随者) :请求的被动更新者,从Leader接受更新请求,然后写入本地日志文件
(3)Candidate(候选人) :节点处于候选状态,正在竞选 Leader。
在正常情况下只会有一个领袖者节点,其他都是追随者节点。而领袖节点会负责所有外部的请求,如果是非领袖节点收到时,请求会被转发到领袖节点。
领袖节点会定时跟所有追随者节点发送心跳请求,让追随者知道集群领袖还在运作。而每个追随者都有一个倒计时器,当超过一定时间没有收到心跳,集群就会进入选举状态。
1.3 相关术语
(1)任期:Raft协议将时间分成了一些任意长度的时间片,每个时间片称为term(任期),term使用连续递增的编号的进行识别。任期出现切换的流程如下:追随者节点将自己维护的current_term_id加1,
将自己的状态转成Candidate发送RequestVote RPC消息(带上current_term_id) 给 其它所有节点进行拉。