1.角色
Raft采用主从设计
Leader:领导,与客户端交互,其他节点以它为基准进行共识
Follower:跟随者,与Leader交互进行同步,任何Follower都可能成为Leader
Candidate:候选者,当一个Follower无法与Leader取得联系时,就可以成为Candidate
2.目的和方法
与其他共识算法一样是做决策并努力提供一致性的。
3.过程
3.1选举
- 任何一个服务器都可以成为一个候选者Candidate,当它取不到Leader的联系时,它向其他服务器Follower发出要求选举自己的请求:
- 其他服务器同意了,发出OK。
注意如果在这个过程中,有一个Follower当机,没有收到请求选举的要求,因此候选者可以自己选自己,只要达到N/2 + 1 的大多数票,候选人还是可以成为Leader的。
- 这样这个候选者就成为了Leader领导人,它可以向选民也就是Follower们发出指令,比如进行日志复制。
- 如果一旦这个Leader当机崩溃了,那么Follower中有一个成为候选者,发出邀票选举。
值得注意的是,整个选举过程是有一个时间限制的,如下图:
Splite Vote是因为如果同时有两个候选人向大家邀票,这时通过类似加时赛来解决,两个候选者在一段timeout比如300ms互相不服气的等待以后,因为双方得到的票数是一样的,一半对一半,那么在300ms以后,再由这两个候选者发出邀票,这时同时的概率大大降低,那么首先发出邀票的的候选者得到了大多数同意,成为领导者Leader,而另外一个候选者后来发出邀票时,那些Follower选民已经投票给第一个候选者,不能再投票给它,它就成为落选者了,最后这个落选者也成为普通Follower一员了。
3.2日志复制
日志复制就是Raft进行决策(数据)共识的方法。
- 下面以日志复制为例子说明Raft算法,假设Leader领导人已经选出,这时客户端发出增加一个日志的要求,比如日志是”sally”:
- Leader要求Followe遵从他的指令,都将这个新的日志内容追加到他们各自日志中
- 大多数follower服务器将日志写入磁盘文件后,确认追加成功,发出Commited Ok:
- 在下一个心跳heartbeat中,Leader会通知所有Follwer更新commited 项目。
- 对于每个新的日志记录,重复上述过程。
如果在这一过程中,发生了网络分区或者网络通信故障,使得Leader不能访问大多数Follwers了,那么Leader只能正常更新它能访问的那些Follower服务器,而大多数的服务器Follower因为没有了Leader,他们重新选举一个候选者作为Leader,然后这个Leader作为代表于外界打交道,如果外界要求其添加新的日志,这个新的Leader就按上述步骤通知大多数Followers,如果这时网络故障修复了,那么原先的Leader就变成Follower,在失联阶段这个老Leader的任何更新都不能算commit,都回滚,接受新的Leader的新的更新。