聚焦在 etcd 服务端的主流程,在去除了一些不太重要的模块后,其代码结构如下

.
├── embed       // 嵌入式 etcd,方便别的包调用
├── etcdmain    // etcd main 入口 main.go 调用了这里面的代码
├── etcdserver  // etcd 服务端代码
├── lease       // 租约相关
├── mvcc        // etcd 实现的 mvcc 数据库
├── pkg         // 通用库
├── raft        // etcd raft 实现
├── wal         // write append log 实现
├── main.go

通过这些目录我们大概想象一下这里面应该是 etcdserver 才是最核心的那部分代码,里面应该包含了对 raft,mvcc,wal,lease 的调用。讲道理我们应该先从 main.go 入手,来剖析整个 etcd 的启动流程,这是一个正确的阅读顺序。但是今天我不这么做

对于 wal,lease,mvcc,raft 这几个包来说它们是高度独立的,理论上它们能够脱离 etcdserver 单独工作,我决定先从这几个组件的底层逻辑入手,看看它们的原理,因为 raft 涉及到的内容会比较多,我把它放在了后面

架构

先来看一下 etcd 的整体架构,有一个大致的概念