观看视频
分享者
缪昌新
etcd raft 阅读
基于 etcd 版本:3.3.10
2019.3.2 晚上
总结
etcd里的raft模块只实现了raft共识算法,而像消息的网络传输,数据存储都由上层应用来完成。
下面是各个文件(夹)的功能简介:
- raftpb
用Protocol Buffer定义了一些需要序列化的数据结构,比如Entry
和Message
。
- log_unstable.go
unstable
数据结构表示用于还没有被用户层持久化的数据,它维护了两部分内容snapshot
和entries
。
- storage.go
这个文件定义了一个Storage
接口,应用层需要实现这个接口,以提供存储和查询日志的能力。
- log.go
维护本地日志信息。其中的committed
和applied
分别表示已提交和已经应用到状态机的日志索引。
- progress.go
Leader节点通过Progress
这个数据结构来追踪一个follower的状态,并根据Progress
里的信息来决定每次同步的日志项。
- raft.go
Raft协议的具体实现就在这个文件里。其中最重要的就是Step
函数,它用来处理不同的消息。所以以后当我们想知道raft对某种消息的处理逻辑时,到这里找就对了。
- node.go
node
的主要作用是应用层和共识模块(raft)的衔接。将应用层的消息传递给底层共识模块,并将底层共识模块共识后的结果反馈给应用层。