Raft 协议
一、Raft概述
- 分布式系统开发首选的共识算法。
- Raft 算法是一切以领导者为准的方式,实现一系列值的共识和各节点日志的一致。
- 用于管理日志一致性的协议。
1.1 raft协议是什么?
分布式系统之于单机系统,优势之一就是有更好的容错性,分布式系统会对数据做备份(backup)。
一个系统的工作模式:接受客户端的command,系统进行处理,将处理的结果返回给客户端。由此可见,系统里的数据可能会因为command而变化。
实现备份的做法之一就是复制状态机(Repilcated State Machine,RSM)。它有一个很重要的性质——确定性(deterministic):
- 如果两个相同的、确定的状态从同一状态开始,并且以相同的顺序获得相同的输入,那么这两个状态机将会生成相同的输出,并且结束在相同的状态,
也就是说,如果能按顺序将command作用于状态机,它就可以产生相同的状态和相同的输出。
那么一个状态机如何实现呢?如下图所示(来自raft协议):
上图中,每个RSM都有一个replicated log,存储的是来自客户端的commands。每个RSM中replicate log中comands的顺序都是相同的,状态机按顺序处理replicate log中的command,并将处理的结果返回给客户端。由于状态机的确定性,因此每个状态机的输出和状态都是相同的。
上图有一个模块——Consensus Module。这个模块用于保证每个server 上 Log 的一致性!
- 如果不做任何保障,直接将command暴力写入,一旦服务器宕机或者出现其他故障,就会导致这个Log丢失,并且无法恢复。而出现故障的可能性是很高的,这就导致系统不可用
- raft 就是 Consensus Module的一个实现
因此,raft是一致性协议,是用来保障servers上副本一致性的一种算法。
为了让一致性协议变得简单可理解,Raft协议主要使用了两种策略。一是将复杂问题进行分解,在 Raft协议中,一致性问题被分解为:leader election、log replication、safety三个简单问题;二是减少状态空间中的状态数目。
1.2 Raft一致性算法
在Raft体系中,有一个强leader,由它全权负责接收客户端的请求命令,并将命令作为日志条目复制给其他服务器,在确认安全的时候,将日志命令提交执行。当leader故障时,会选举产生一个新的leader。在强leader的帮助下,Raft将一致性分解为三个子问题:
- leader选举:当已有的leader故障时必须选出一个新的leader;
- 日志复制:leader接受来自客户端的命令,记录为日志,并复制给集群中的其他服务器,并强制其他节点的日志与leader保持一致;
- 安全safety措施:通过一些措施系统的安全性,如确保所有状态机按照相同顺序执行相同命令的措施。