>文章来自于:https://reading.developerlearning.cn/reading/32-2019-03-02-etcd-raft/
分享者: 缪昌新
## 观看视频
https://youtu.be/sL02PsR20gE
*etcd raft 阅读*
etcd 版本:3.3.10
2019.3.2 晚上
### 总结
etcd里的raft模块只实现了raft共识算法,而像消息的网络传输,数据存储都由上层应用来完成。
下面是各个文件(夹)的功能简介:
* raftpb
用[Protocol Buffer](https://developers.google.com/protocol-buffers/)定义了一些需要序列化的数据结构,比如`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)的衔接。将应用层的消息传递给底层共识模块,并将底层共识模块共识后的结果反馈给应用层。
## 参考资料
1. [深入浅出 Raft - 基本概念](https://www.jianshu.com/p/138b4d267084)
2. [深入浅出 Raft - Membership Change](https://www.jianshu.com/p/99562bfec5c2)
3. [深入浅出 Raft - Leader 选举](https://www.jianshu.com/p/2b60542640e2)
4. [深入浅出 Raft - Optimization](https://www.jianshu.com/p/1bbd7162727d)
5. [Raft在etcd中的实现](http://blog.betacat.io/post/raft-implementation-in-etcd/)
6. [etcd contrib](https://github.com/etcd-io/etcd/tree/master/contrib)
7. [Etcd超全解:原理阐释及部署设置的最佳实践](https://mp.weixin.qq.com/s/kcWCxk0NbTuob0y6gN5emw)
有疑问加站长微信联系(非本文作者)