一致性协议-RAFT简述
01
—
Paxos
一致性协议有很多,如ZAB、raft、multi-paxos、VR等这些被称之为Leader-based一致性协议,它们都是由经典的paxos算法优化发展而来。Paxos通过对多个提案进行表决,从中选定一个提案作为最终的共识,并且一旦这个提案被选定之后,结果不会再发生改变。参与表决的角色有Proposer(主动发起请求)与Acceptor(被动响应请求),Learner只关注表决结果,不参与表决过程。由于paxos很复杂,这里只简单说下关键的名词:
[n,v]
由两部分组成:
Proposer
:主动发起提案
Acceptor
:对提案进行表决
Learner
:被动接受表决结果
prepare
:被某个 Proposer 提出
accept
:被某个 Acceptor 通过
chosen
:被半数以上 Acceptor 通过
Follower
:所有节点都
以follower状态启动,如果没有收到leader的消息则会变成candidate
Candidate
:主动发起投票,如果得到大部分的选票则变成leader
Leader
:系统的所有修改都需要经过leader
4)集群中的节点现在已经对系统状态达成共识;
选举
在Raft中有两个控制选举的超时时间。前面我们说到最开始所有节点都以follower启动,当启动等待一定时间(150~300ms)后节点A会变成candidate(term+1);
首先该候选人A会给自己投票,然后会向其他节点(B、C)发起投票请求;
如果其他节点还未投票(自己的term<=候选人的term),会投票给候选人A(term+1);
候选人A获得大多数投票(N/2+1)便成为leader;
此后leader就可以给followers发送Append Entries等指令;
leader通过心跳方式进行日志复制通知,followers响应每一个Append Entries;
这个选举的任期将持续到当A节点不可用,某一个follower停止接受心跳并成为下一个候选人;
如此往复,以上是leader选举过程。
日志拷贝
当leader收到客户端对系统更改的请求,leader通过心跳使用相同的Append Entries消息来完成;
首先,leader记录该变更到自己节点的日志中,然后在下次心跳将更改发送给followers;
当一个entry被过半节点认可,该变更会被提交并响应给客户端;
以上是一个变更通过日志拷贝的方式同步到其他节点。
当然,选举和日志拷贝远没那么简单。还涉及到如何保证安全性、选举限制、延迟提交、脑裂、状态机复制等,Raft又是如何规定和解决的呢?