简介
Raft是今比较流行的一个分布式选举算法。在它出来之前,业界只有Paxos一种算法。但是Paxos是非常难以理解,更不用说有统一的算法方案。Raft的出现,就是为了提供一个通俗易懂,容易实现的分布式方案。研究论文和相关源码已久,写下此文笔记,希望能对你也有一些启发。
基本原理
Server状态
集群的每个机器可以有3种角色状态
- Leader 每个集群只能有一个,处理所有client的请求,日志复制。
- Follower 普通的Server,完全被动的,只会对收到的消息进行回应。
- Candidate 候选人,当进入新一轮选举的时候,所有的候选人都会发起投票。重新选出一个新leader
三者之间的关系,可以互相转换,如果下图
- 最开始,所有的Server都是Follower。
- 如果Follower没有收到心跳,就会变成Candidate
- Candidate 开始进行新一轮的选举,其中一个成为新的Leader,其余的成为Follower。
- Leader如果收到更大的Term(任期)消息,就降级为普通的Follower。
Term
时间划分为不同的Term(任期)。每次导致新的选举发生,Term就会改变+1.一个Term包括两个阶段:选举和正常阶段。每个服务器都会保存当前的任期Current Term。用于发送和接受RPC消息时验证比较。
Log Entry
每一个client操作,对于Leader来说,都是增加一个Log Entry,然后复制同步到其他的Server。包括以下数据:
- term Leader收到log时的term
- index log下标。log存储结构是一个List
- command 操作指令
Persistent State 持久化状态
每个server都会在本地存储一些持久化状态,每次在相应rpc时先持久化
- currentTerm 当前Term,启动的时候是0
- voteFor 当前term收到的投票
- log[] 日志数据
选举过程
当一个Follower没有收到Leader的心跳时,就会投票开始新一轮的选举。所以当Leader出现故障时,可能有多个Follower变成Candidate开始投票。这里有个细节,就是开始的时间是不同的,是一个随机100-500ms,这样可以更快速产生新的Leader。
- 当前Term 增加1。