天天看点

etcd源码解析之V2 server和raft核心运转

etcd是一个应用raft一致性算法的分布式KV存储数据库,使用go语言开发,在业界应用广泛,本文对etcd server部分的代码解析基于master分支的V2版本。

V2 server的启动需要配置--enable-v2,所以我从这个配置项跟踪起代码,从http server解析请求到刷快照落盘在到http server回包,以代码为维度生成以下流程图:

etcd源码解析之V2 server和raft核心运转

从图中可以看出,etcd的状态机完全依赖go语言中的channel。

server接受到请求后封装成MsgProc包通过管道发送给本进程,注册一个管道等到进程处理完回包。

raft commit请求后,构造一个ready信号给管道,server接受到管道后,写wal, 判断是否需要写快照,再构造applyc信号到管道,触发请求应用到存储层store, store更新后打包回包,唤醒之前等待处理完成的管道,回包给client。

从一个空server启动raft的流程图:

etcd源码解析之V2 server和raft核心运转

收到MsgProc请求,强一致性情况下:

Leader: 走raft流程

Follower: 转发给Leader

Candidate: 丢弃

其他细节根据代码和算法文档不再累述。

继续阅读