Raft算法
Raft算法和paxos算法有相同的功能和性能,但更容易理解,Raft将一致性算法分解成关键模块:Leader选举,日志同步,安全性,日志压缩,成员变更。
Raft中的角色

- Leader: 接受客户端请求,向Follower同步请求日志,日志同步到大多数节点上告诉Follower提交日志。
- Follower: 接受并持久化Leader同步的日志,在Leader告知日志可以提交之后,提交日志。
- Candidate: Leader选举过程中的临时角色。
Raft中最多只有一个Leader,正常工作期间只有Leader和Followers。Raft算法角色状态转换如下:

Leader选举
Raft使用心跳触发选举。集群中一台服务器启动时,初始化为Follower,Leader向所有Follower周期性发送心跳,如果Follower在选举超时时限内没收到Leader的心跳,就会等待一个随机时间然后转换为Candidate开始选举,并给自己投票。之后,它向集群中其他服务器发送RequestVote RPC:
- 若赢得多数选票,则选举为Leader。
- 收到了Leader的消息,则表示其他服务器抢先成为Leader。
- 没有服务器赢得多数的选票,Leader选举失败,等待选举时间超时后发起下一轮选举。
日志同步

Leader把请求作为日志条目,加入到它的日志中,然后并行向其他容器发起AppendEntries RPC复制日志条目,当这条日志复制到大多数服务器上,Leader将这条日志应用到它的状态机并向客户端返回执行结果。若Followers没有赋值日志成功,则Leader不断重试。如果一条日志被复制到大多数服务器上,就可以提交了。
Raft日志同步保证以下两点
- 如果不同日志的两个条目有着相同的索引和任期号,则它们所存储的命令相同。
- 如果不同日志的两个条目有着相同的索引和任期号,则它们之前的所有条目都是完全一样的。
//TODO
参考文献

浙公网安备 33010602011771号