Raft共识算法入门教程


1 分布式基础概念

    1.1  数据副本与一致性问题

    1.2  分布式系统的进化史

    1.3  全面解读CAP定理

    1.4  CAP理论为什么不能同时满足?

    1.5  BASE原则

2 全面解读Raft共识算法

    2.1  全面解读Raft共识算法

    2.2  Raft日志的作用

    2.3  Raft日志复制

    2.4  Raft共识算法是否属于二阶段提交?

    2.5  Raft算法中的三种超时时间

    2.6  Raft算法动图展示

3 实战操练Raft共识算法

Raft 日志的作用

Raft是目前著名的分布式共识算法,它分为四大功能模块:

  • 领导者选举
  • 日志同步、心跳
  • 持久化
  • 日志压缩,快照

这四个模块彼此并不完全独立,如日志的同步情况左右着领导者选举,心态是日志同步的特例,持久化和快照又都是围绕着日志的存储展开。可以说,Raft的核心就是日志,掌握好日志的方方面面是学好Raft共识算法的重要条件。

心跳机制

领导者与追随者之间的日志同步有一种特殊情况:Entries为空,即无日志同步。既然没有日志需要发送,那么为什么要发送AppendEntries请求了?

因为领导者需要宣示自己的权利,如果领导者不发送请求,那么追随者会认为领导者「死亡」了,会自发的进行下一轮选举,霸道的领导者肯定不愿意这种情况发生,因此即使日志是空的,也要发送AppendEntries请求,这种特殊的场景被称为「心跳」。

备注:"请求"一词用的不妥,应该理解成命令或者指令,以显示leader的支配和领导权利。

日志的作用

Raft集群中的节点通过日志来保存数据,且日志是只可追加的(Append-only),如下图所示:

日志已提交与已应用的区别

日志分为两种状态:已提交和已应用。两者有什么区别了?

已提交表示日志已经追加到日志文件中了,已应用表示已经将日志应用到状态机上了。

已提交的日志被应用后才会生效,数据的可见性是由状态机来保证的。Raft使用了状态机来保证相同日志被应用不同节点后,数据是一致的。如下图所示:

状态机保证了不同节点在被应用了相同日志后,数据的可见性是一致的,这样就能保证集群数据的一致性,这也是Raft算法的根本目的所在。

领导者选举

请求者在发送RequestVote请求时,会附带上自己日志的最后序号和任期,回复者接收到这两条信息后,会将其与自己的任期和日志进行比较,来看看双方谁的日志比较完整。首先比较任期,任期大的更有话语权,如果任期相同,再比较日志序号。当请求者比当前节点的日子更完整,当前节点才能投出选票。

但请求者的日志序号大或者相等,那么upToDate为true,只有当upToDate为true 时,

日志快照

节点是无法容忍日志数据无限增加的。为了解决这个问题,Raft引入了快照机制,如下图: