Raft算法:(以下三个模块)
为了管理复制日志的一套算法
- 领导人选举
- 日志复制
- 安全性
Raft算法有两个阶段:1、leader选举阶段。2、日志复制阶段
领导人Leader选举
领导者(leader):处理客户端交互,日志复制等动作,一般整个过程中只有一个领导者
候选者(candidate):候选者就是选举过程中提名自己的实体,一旦选举成功,则成为领导
跟随者(follower):类似选民,完全被动的角色,这样的服务器等待被通知投票。
Raft使用心跳机制来触发选举。当Server启动时,初始状态都是follower。每个server有一个定时器,超时时间为election timeout(一般为150ms-300ms),如果某server没有超时的情况下收到来自领导者或者候选者的任何消息,定时器重启,如果超时,它就开始一次选举。
正常情况下的选举
- 初始状态都是下集群都中的节点都处于follower状态。
-
某一时刻,其中一个follower由于没有收到leader的心跳,率先发生election timeout进而发起选举。
-
当集群中超过半数的节点接受投票,canadidate节点将成为leader状态。
- 成为leader节点之后,leader将想follower节点同步日志并发送心跳,并且将所有任期加一。
异常情况
-
leader不可用:
-
当follower无法收到leader的心跳,follower发生election timeout,其状态变更为candidate,并向其他follower发起投票
-
当超过半数的follower接受投票后,该节点将成为新的leader并向其他follower同步日志
- 如果之前的leader再次加入集群,则两个leader会比较任期数,任期数小的将自己切换为follower并将不一致的日志清除,重新同步。
-
-
follower节点不可用
-
当某个follower无法接收心跳时,则无法再接收日志
-
当follower重新加入集群,则重新通过leader同步日志,并且将任期数修改成当下的任期数
-
-
多个 candidate 或者多个 leader
- 初始状态都是follower
- 如果两个节点同时成为candidate,candidate则会继续想其他的follower询问投票,由于follower都投票了,candidate会向其他candidate投票。若任期数相同,则candidate相互拒绝。由于第一次未选出 leader,candidate 将随机选择一个等待间隔(150ms ~ 300ms)再次发起投票。如果得到集群中半数以上的 follower 的接受,这一 candidate 将成为 leader。 稍后另一个 candidate 也将再次发起投票。由于集群中已经选出 leader,candidate 将收到拒绝接受的投票。在被多数节点拒绝之后,并已知集群中已存在 leader 后,这一 candidate 节点将终止投票请求、切换为follower,从 leader 节点同步日志。
Raft复制日志剖析
- 出现网络分区的时候,多数派可以正常同步日志
- 如果多数派都挂掉,则不会进行写操作。
可结合下面的一致性算法动画来理解
演示一致性算法动画:
http://thesecretlivesofdata.com/raft/
https://raft.github.io/