概述
Raft : raft is a consensus algorithm for managing a replicated log.
分布式存储系统通常通过维护多个副本来进行容错,提高系统的可用性。要实现此目标,就必须要解决分布式存储系统的最核心问题:维护多个副本的一致性。
一致性(consensus): 它是构建具有容错性(fault-tolerant)的分布式系统的基础。 在一个具有一致性的性质的集群里面,同一时刻所有的结点对存储在其中的某个值都有相同的结果,即对其共享的存储保持一致。集群具有自动恢复的性质,当少数结点失效的时候不影响集群的正常工作,当大多数集群中的结点失效的时候,集群则会停止服务(不会返回一个错误的结果)。
一致性协议通常基于replicated state machines,即所有结点都从同一个state出发,都经过同样的一些操作序列(log),最后到达同样的state。
架构
typical architecture for consensus systems
如上图所示,所有的节点以相同的顺序处理日志,那么最终x、y、z的值在多个节点中都是一致的。
consensus系统中每个结点有三个组件:
状态机: 当我们说一致性的时候,实际就是在说要保证这个状态机的一致性。状态机会从log里面取出所有的命令,然后执行一遍,得到的结果就是我们对外提供的保证了一致性的数据。
Log: 保存了所有修改记录。
一致性模块: 一致性模块算法就是用来保证写入的log的命令的一致性,这也是raft算法核心内容
基本概念
角色
在Raft中,节点有三种角色:
-
Leader:负责接收客户端的请求,将日志复制到其他节点并告知其他节点何时应用这些日志是安全的
-
Candidate:用于选举Leader的一种角色
-
Follower:负责响应来自Leader或者Candidate的请求
角色转换如下图所示:
-
所有节点初始状态都是Follower角色
-
超时时间内没有收到Leader的请求则转换为Candidate进行选举
-
Candidate收到大多数节点的选票则转换为Leader;发现Leader或者收到更高任期的请求则转换为Follower
-
Leader在收到更高任期的请求后转换为Follower