基础
什么是Raft算法?
Raft是一种用于替代Paxos算法。相比于Paxos,Raft的目标是提供更清晰的逻辑分工使得算法本身能被更好地理解,同时它安全性更高,并能提供一些额外的特性。Raft能为在计算机集群之间部署有限状态机提供一种通用方法,并确保集群内的任意节点在某种状态转换上保持一致。Raft算法的开源实现众多,
在Go、C++、Java以及 Scala 中都有完整的代码实现。Raft这一名字来源于"Reliable, Replicated, Redundant, And Fault-Tolerant"(“可靠、可复制、可冗余、可容错”)的首字母缩写。[3]集群内的节点都对选举出的领袖采取信任,因此Raft不是一种拜占庭容错算法,是一种故障容错算法
by 维基百科
用通俗的话来说,Raft算法是在兰伯特 Multi-Paxos思想的基础上,做了一些简化和限制,比如增加了日志必须是连续的,只支持领导者、跟随者、候选人三种状态,在理解和算法实现上都相对容易许多。
除此之外,Raft算法是现在分布式系统开发首选的共识算法,基本上全新的分布式系统选择了Raft算法。所以说掌握Raft算法是很有必要的,我们可以通过Raft算法,来探寻分布式系统的具体实现,也可以得心应手的处理绝大部分场景的容错和一致性需求,比如分布式配置系统,分布式NoSQL存储等等。
如果要用一句话概括Raft算法,我觉得是这样的:
从本质上说。Raft算法是通过一切以领导者为准的方式,实现一系列值的共识和各节点日志的一致。
节点有哪些状态 ?
一个 Raft 集群包括若干服务器,以典型的 5 服务器集群举例。在任意的时间,每个服务器一定会处于以下三个状态中的一个:
Leader
:负责发起心跳,响应客户端,创建日志,同步日志。Candidate
:Leader 选举过程中的临时角色,由 Follower 转化而来,发起投票参与竞选。Follower
:接受 Leader 的心跳和日志同步数据,投票给 Candidate。
在正常的情况下,只有一个服务器是 Leader,剩下的服务器是 Follower。Follower 是被动的,它们不会发送任何请求,只是响应来自 Leader 和 Candidate 的请求。
下图展示了这三个节点状态之间的变更情况
在讲解完领导人选举之后,会针对该图做出详细的解释。
什么是日志?
我们可以发现不同角色之间数据交互就是通过一种叫日志的东西来完成的。
日志由日志项组成,日志项是一种数据格式,它主要包含用户指定的数据,也就是指令,还包含一些附加信息,比如索引值,任期编号。
什么是term?
我们发现上图有一个单词叫做term。
raft 算法将时间划分为任意长度的任期(term),任期用连续的数字表示,看作当前 term 号。每一个任期的开始都是一次选举,在选举开始时ÿ