Raft
Raft算法:最初是一个用于管理复制日志的共识算法,它是一个为真实世界应用建立的协议,主要注重协议的落地性和可理解性.
面向多个决策达成一致的问题,分解了Leader选举,日志复制和安全方面的考虑,并通过约束减少了不确定的状态空间
一个Raft集群通常包含5个服务器,允许系统有两个故障服务器.服务器处于leader,follower和candidate这三个状态之一.
Leader(领导者):仅有一个,决定日志的提交,日志只能Leader向Follower单向复制.处理所有的客户端请求,若服务端请求Follower则将该请求转发给Leader
Follower(跟随者):是被动的,不会对自身发出请求,只对leader和candidate的请求做出响应
Candidate(候选领导者):该状态用来选举Leader
共识过程:
1.首先选举一个Leader,接着赋予Leader完全的权力管理记账.
a.开始所有结点都是Follower,在随机超时发生后未收到来自Leader或Candidate消息,则转变角色为Candidate,提出选举请求.
b.最近选举阶段(Term)中得票超过一半者被选为Leader
c.如果未选出,随机超时后进入新的阶段重试.Leader负责从客户端接收log,并分发到其他节点
2.Leader从客户端接收记账请求.完成记账操作,生成区块并复制到其他记账节点.
a.Leader会找到系统中日志最新的记录,并强制所有的Follower来刷新到这个记录,数据的同步是单向的
3.Leader可能失效或与其他节点失去联系.这时,系统就会选出新的Leader
Leader选举:
1.任何一个服务器都可以成为candidate,它向其他服务器follower发送要求选举自己的请求
2.其它服务器发出OK后,只要有N/2+1的服务器同意,就可成为leader
记账过程
1.Leader已经选出,客户端发出增加日志的请求
2.Leader要求Follower遵从它的指令,都将这个新的日志追加到他们各自日志中
3.大多数Follower服务器将交易记录写入账本后,确认追加成功,发出确认成功信息
4.在下一个心跳(150-300ms)中,Leader会通知所有Follower更新确认的项目