分布式一致性算法-Raft学习笔记
版权声明:本文为博主原创文章,未经博主允许不得转载。
手动码字不易,请大家尊重劳动成果,谢谢
Raft在Leader选举阶段使用term编号作为提案编号来执行paxos算法进行leader选举,为了防止活锁出现,Raft算法使用了随机定时器的策略避开了同时竞争Leader的可能。在日至提交阶段,算法保证了Leader要拥有全部日志,并且Client只能与Leader交流,提交日志。Leader利用两阶段提交和大多数集合确认的方式来确保日志被成功保存。其算法和Zookeeper的ZAB算法有一定相似性。
Raft算法中角色和存储
不同于Paxos算法,Raft算法中只有一种角色。这个角色可以有三种状态:
1、Follower
2、Candidate
3、Leader
在每台机器上都会存储:
1、currentTerm:当前节点所能看到的最大的term值,该值单调增加
2、votedFor:当前term里将票投给的对象,如果尚未投票则为空
3、log[]:日志条目,会按顺序作用于状态机
4、commitIndex:当前节点最后一个被提交的日志序号
5、lastApplied:当前节点最后一条被应用于状态机的日志序号,如果发现当前机器commitIndex > lastApplied则应该将本机log[]中序号为(lastApplied, commitIndex]的部分应用到状态机
6、snapshot:如果做了日志快照则会存储快照镜像
在状态为Leader机器上会额外存储:
1、nextIndex[]:针对每个其他节点,下一个需要发送的日志的序号
2、matchIndex[]:针对每个其他节点,当前所知的和Leader匹配的最大日志编号
Raft算法中的相关概念
1、Leader:当前集群中的领导者(干活最多的),一个Raft集群只能有一个Leader持久存在
2、Candidate:Leader候选人,当接收到多数投票后会成为Leader
3、Follower:跟随者,接受Leader的日志存储、应用请求,拥护Leader的地位
4、term:Leader的选举周期(假设所有机器都是从0开始),在一个Raft集群内单调递增。在一个term周