第 32 期 Go 夜读之 etcd raft 源码阅读

etcd raft 阅读

etcd 版本:3.3.10

2019.3.2 晚上

总结

etcd里的raft模块只实现了raft共识算法,而像消息的网络传输,数据存储都由上层应用来完成。

下面是各个文件(夹)的功能简介:

  • raftpb

Protocol Buffer定义了一些需要序列化的数据结构,比如EntryMessage

  • log_unstable.go

unstable数据结构表示用于还没有被用户层持久化的数据,它维护了两部分内容snapshotentries

  • storage.go

这个文件定义了一个Storage接口,应用层需要实现这个接口,以提供存储和查询日志的能力。

  • log.go

维护本地日志信息。其中的committedapplied分别表示已提交和已经应用到状态机的日志索引。

  • progress.go

Leader节点通过Progress这个数据结构来追踪一个follower的状态,并根据Progress里的信息来决定每次同步的日志项。

  • raft.go

Raft协议的具体实现就在这个文件里。其中最重要的就是Step函数,它用来处理不同的消息。所以以后当我们想知道raft对某种消息的处理逻辑时,到这里找就对了。

  • node.go

node的主要作用是应用层和共识模块(raft)的衔接。将应用层的消息传递给底层共识模块,并将底层共识模块共识后的结果反馈给应用层。

参考资料

  1. 深入浅出 Raft - 基本概念
  2. 深入浅出 Raft - Membership Change
  3. 深入浅出 Raft - Leader 选举
  4. 深入浅出 Raft - Optimization
  5. Raft在etcd中的实现
  6. etcd contrib
  7. Etcd超全解:原理阐释及部署设置的最佳实践

观看视频