Contents

深入浅出etcd/raft —— 0x00 引言

本文为原创文章,转载请严格遵守CC BY-NC-SA协议

1. 引言

Raft算法,Diego Ongaro在《In search of an understandable consensus algorithm》中提出的一种新型故障容错共识算法。正如这篇论文的标题所说,Raft算法比经典的Paxos算法族更容易理解。

然而,即使读过Raft的论文、做过MIT6.824的Lab2,也很难理解成熟的工业级产品中Raft实现的一些细节。本系列文章旨在由浅入深地分析Etcd中Raft算法的实现,从Raft论文中的实现过渡到成熟的工业级产品中的经典Raft实现。

在阅读本系列文章前,读者需要:

  1. 阅读《In search of an understandable consensus algorithm (extended version)》,理解其中有关Raft的内容,本系列不会赘述Raft的一些基本概念。
  2. 学习go的基本语法,学习go语言并发编程与channel的使用方式。
  3. 准备Diego Ongaro的博士论文作为参考资料,在Etcd的实现中,引用了很多其中的优化方式。

本系列文章龟速更新。笔者也是第一次试图将对这种工业级产品的分析写出来分享给读者,因此难免把握不好分析的粒度。在更新后面的文章的同时,我也会对之前的文章进行更正与优化,使其更容易理解。

另外,本系列不会对引用的代码中的注释进行翻译,其原因有二:一来,etcd/raft模块中的注释描述的十分详细,建议读者要详细地阅读一遍etcd/raft模块中所有的注释;二来,笔者的水平有限,翻译的过程中难免会有词不达意的情况,而etcd/raft模块中的注释往往会提及很多细节,为了避免误导读者,就不做翻译了。不过相信能看到这里的读者都有丰富的英文论文阅读经验了,不需要笔者多此一举的翻译。

2. 目录

3. 施工路线图

本系列仍在施工中,之后可能反复修改其中内容与顺序等。本节中保存了当前的施工路线图。

  • 引言
  • raftexample分析
  • etcd/raft整体架构与状态机简要分析
  • 选举 —— etcd/raft中选举优化
  • 选举 —— etcd/raft实现分析
  • 日志 —— etcd/raft中日志实现
  • 日志 —— etcd/raft中日志复制
  • 日志 —— etcd/raft中快照
  • 集群变更 —— simple
  • 集群变更 —— joint
  • Linearizable Read —— Log Read、ReadIndex、Lease Read
  • 集群变更 —— joint(apply-time confchange修复issue#12359
  • 附录 —— etcd/raft中所有消息使用的字段描述(80%鸽了)