Raft 简介及学习资料汇总

Raft简介

Raft是一个分布式一致性协议。简单的说,就是一个集群里面的所有节点都维护一个复制状态及(Replicated State Machine),要求这个状态机对于每一个给定的输入,总是产生相同的输出;这样,如果所有节点都以相同的顺序执行相同的输入,最终所有节点都会得到相同的输出。Raft协议接收来自不同客户端的请求,以相同的顺序把这些请求存储到所有节点上。每一个请求都以log的形式持久化到磁盘中,当大多数节点都存储了一条log之后,就把这个log提交到状态机执行(这个说法不严谨,需要一个额外的限制来绕过一个corner case)。

Raft和Multi Paxos

Raft和Multi Paxos非常相似,都会选择一个节点作为Leader接受所有客户端的请求,主要的不同点在于:

  • Paxos允许任何节点当选为Leader,log之间可能会有缺失的值,需要比较复杂的实现来补齐。
  • Raft只允许log最全的节点当选Leader,log 保持连续,中间不存在缺失的值。

Raft实现

Raft的实现很多,其中Golang的实现主要是两个

  • Etcd Raft – 使用最广泛的Raft实现,但是它只实现了核心的Raft协议,存储、消息序列化和网络传输都需要用户自己实现。后续的分析基于这个库。
  • Hashicrop Raft – 主要是consul在用,完整的实现了WAL、SnapShot、存储、序列化。

学习资料汇总

updatedupdated2022-02-222022-02-22