背景
Paxos算法是最早的强一致性算法,1990年被Leslie Lamport提出,但是由于其难以理解和实现,导致没有被广泛使用。因此,2013年Raft算法被提出,功能与Paxos算法相同,更易于理解,实现简单,因此迅速被广泛推广使用,已经成为当前主流的强一致性算法。(从CAP角度,Raft算法选择了CP,舍弃了A,选主期间会出现短暂的不可用)
Raft算法
整体流程
Raft算法可以分为Leader Election选主和Log Replication日志复制两部分。算法的整体流程是:首先,集群中的节点选举出一个主节点;然后,由主节点处理客户端的所有请求,并负责将请求复制到所有的从节点,保证节点间的数据一致性。
节点状态
Leader Election
Raft算法通过心跳机制来进行选主,具体过程如下:
- 节点启动时,初始状态为Follower,并开始倒计时。如果Election Timeout时间内,收到Leader的心跳,则重新开始计时;如果超时,则发起选主;
- 开始选主后,节点的状态从Follower转变为Candidate,当前任期加1,向集群所有节点发送投票请求(包括节点本身);
- 集群中的其它节点接受到投票请求后,会根据投票信息进行判断:如果能同时满足1)投票中的任期大于等于当前节点的任期;2)对于投票中的任期,当前节点还未投票;3)投票中的数据索引大于等于当前节点数据索引,则同意投票请求;
- 如果某个节点的投票请求被过半节点同意,那么该节点成为新的Leader,向集群其它节点发送心跳阻止新的选主;如果投票期间,接收到合法Leader(任期大于等于当前节点任期)的心跳,则节点状态从Candidate转为Follower;如果超时或者没有超过半数,则任期加1,重新发起投票;
Log Replication
参考