一、背景概述
在分布式系统中,通常需要多副本进行备份,但是副本的同步一致一直是一个比较棘手的问题。Raft算法是一个能够代替Paxos的分布式一致性算法,能够管理日志复制(replicated log),他的性能与Paxos不相上下,但是却比Paxos更容易理解。
Paxos存在的问题:
- 难以理解(不过《Paxos Made Simple》比较容易理解)。一是因为paxos选择了single-degree Paxos作为基础,二是因为Multi-Paxos 的合成规则又增加了许多复杂性。
- 不能为构建实际的实现提供良好的基础,一是因为没有针对 multi-Paxos 的共识算法,二是因为Paxos 的架构对于构建实际系统来说是一个糟糕的设计。
一致性算法通常具有的属性:
- 能确保在所有非拜占庭条件下(比如网络延迟,分区和数据包丢失,重复和乱序)的安全性(不会返回错误结果)
- 若有2f+1个副本,则能容忍f台机器故障。
- 不依赖时钟保证日志的一致性(分布式情况下网络延迟等问题会导致可用性)。
- 通常只要超过一半的服务器响应成功调用,则认为命令已经完成。
Raft新特性:
- 强leader:日志只从leader流向其他服务器(简化了日志管理)
- Leader选举:使用随机计时器进行 leader 选举。 这只需在任何一致性算法都需要的心跳(heartbeats)上增加少量机制,同时能够简单快速地解决冲突。
- 成员变更:允许集群在配置更改期间继续正常运行。
Raft提高可理解的方式:模块分解(leader选举、日志复制、安全性)、减少状态空间。
二、复制状态机
复制状态机用于解决分布式系统中的各种容错问题,通常通过复制日志实现,每个服务器存储一个包含一系列命令的日志,其状态机按顺序执行日志中的命令。每个状态机处理日志的顺序相同,因此也能够得到相同的输出序列。
一致性算法的工作就是保证复制日志的一致性。 每台服务器上的一致性模块接收来自客户端的命令,并将它们添加到其日志中。 它与其他服务器上的一致性模块通信,以确保每个日志最终以相同的顺序包含相同的命令,即使有一些服务器失败。 一旦命令被正确复制,每个服务器上的状态机按日志顺序处理它们,并将输出返回给客户端。 这样就形成了高可用的复制状态机。
三、Raft基础
3.1 任期
Raft 把时间分割成任意长度的任期(term),每个任期从选举开始,一个或者多个 candidate 尝试成为 leader 。如果一个 candidate 赢得选举,然后他就在该任期剩下的时间里充当 leader。如果没选出leader,则任期很快结束,开启下一个leader,每个任期最多只能有一个leader。
在raft中,任期充当逻辑时钟,服务器节点可以通过任期发现一些过期的信息比如过时的 leader。任期单调递增,服务器之间通信的时候会交换当前任期号;如果一个服务器的当前任期号比其他的小,该服务器会将自己的任期号更新为较大的那个值。如果一个 candidate 或者 leader 发现自己的任期号过期了,它会立即回到 follower 状态。如果一个节点接收到一个包含过期的任期号的请求,它会直接拒绝这个请求。