Raft介绍
属于Mutlti-Paxos算法,是其一种具体的实现,并且在当中做了优化:
- 日志必须是连续的
- 只支持领导者,跟随者,候选人三种状态
最重要的是,Raft算法是分布式系统中开发首选的共识算法,掌握了这个算法,能处理分布式系统大部分场景下的容错和一致性需求,比如分布式配置系统,分布式NoSQL存储,轻松就能突破单机的限制。
绝大多数的分布式中间件都采用的分布式算法,比如(Etcd, Consul等)
一句话总结:Raft算法是通过一切以领导者为准的方式,去保证一系列值的共识和各节点的日志一致。(一切以领导者为主)
主流程介绍
角色介绍:领导者、跟随者、候选人
需要注意的是,Raft算法是强领导者模型,集群中只能有一个霸道总裁。
详细过程的介绍:
细节介绍
节点的通讯规则
Raft算法中,节点之间的沟通方式通过RPC,在领导者的选举中,需要下面两种RPC:
- 请求投票RPC: 是候选人在选举期间发起,希望各个节点投票
- 日志复制RPC: 由领导者发起,用于复制日志和提供心跳信息
任期介绍
和现实的议会选举类似,领导者是有它的 “任期”, 好比说领导者挂了,集群通过选举,得到一个新的领导者,新的领导者的任期就会 + 1
选举规则
主要介绍了Raft的规则,有下面几个:
1、领导者周期性地向所有追随者发送心跳信息,确保自己领导者的地位,组织追随者发起新的选举。
2、如果在指定时间内,跟随者依旧没有收到领导者的消息,那么它会认为整个集群没有领导者,会推荐自己为候选人,向其他节点发送请求投票的RPC请求。
3、在一次选举中,赢得大多数选票的候选人,将晋升成为领导者。
4、在一个任期内,领导者一直都是领导者,直到他发生宕机,或者因为网络延迟,其他节点发起一轮新的选举。
5、在一次选举中,每一个节点最多会对一个任期编号投出一张选票,并且会按照 “先来先到”的原则去进行处理。
6、当任期编号相同时,日志完整性高的追随者,会拒绝投票给日志完整性较低的候选人。
随机超时时间介绍
在选举过程中,若出现未到指定票数,选举无效的场景,Raft算法会使用随机超时时间的方法,将超时时间都分开,保证绝大多数情况下,只有一个服务器节点先发起选举,而不是同时发起选举。