Raft协议起源于 2013 年 斯坦福 Diego Ongaro和John Ousterhout的论文《In Search of an Understandable Consensus Algorithm》。作者表示因为Paxos 晦涩难懂且缺乏工程实现,所以要设计个既容易实现又利于学生学习的一致性算法。Raft 的数据一致性等价于 Multi Paxos,可以用于取代Paxos,并且证明可以提供与Paxos相同的容错性以及性能。
Raft协议是一种基于日志复制的一致性算法,通过选举领袖的方式来实现的。Raft协议设计首要目标是易于理解,所以采用了分解法(Raft流程可分解为选主、日志复制和安全)和状态空间简化(相较于 Paxos,Raft 减少了未定状态的数量)。
在Raft集群里,服务器可能会是这三种身份其中一个:
在正常情况下只会有一个领袖者节点,其他都是追随者节点。而领袖节点会负责所有外部的请求,如果是非领袖节点收到时,请求会被转发到领袖节点。
领袖节点会定时跟所有追随者节点发送心跳请求,让追随者知道集群领袖还在运作。而每个追随者都有一个倒计时器,当超过一定时间没有收到心跳,集群就会进入选举状态。
为了更好的理解Raft协议,我们讲Raft 协议常见的几个名词先优先解释下
2.1 任期
Raft协议将时间分成了一些任意长度的时间片,每个时间片称为term(任期),term使用连续递增的编号的进行识别。任期出现切换的流程如下:
2.2 消息类型
2.3 倒计时器
追随者节点自身会维护一个倒计时器,用于监测跟领袖者节点的心跳,本质是一种超时机制的实现。倒计时器有以下特点:
2.4 复制状态机模型
在Raft协议中,复制状态机用于描述日志的变化,即:相同的初始状态 + 相同的输入 = 相同的结束状态。用于因此,在复制状态机模型下,只要保证了操作日志的一致性,我们就能保证该分布式系统状态的一致性。
Raft协议将一致性问题拆成数个子问题分开解决,让我们更容易理解和解决一致性问题:
Raft协议通过复制状态机模型保证操作日志的一致性,为了保证数据一致性,上述三个问题的处理需要额外增加对应的规则约束:
Raft协议只能顺序一致性,因此业界在使用时做了很多优化。比如TiKV中使用了Raft,但做了非常多的优化,提高了Raft性能。阿里的另PolarDB,也是使用了改进版的Parallel-Raft,使Raft实现了并行提交的能力。
林淮川
毕业于西安交通大学;奈学教育《百万架构师训练营》讲师、企业级源码内源负责人,前大树金融高级架构师、技术委员会开创者、技术总监;前天阳宏业交易事业部技术主管;多年互联网金融行业(ToB)经验。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。