ETCD 源码初探


前言

什么是ETCD

最简单粗暴来说,ETCD是个 map<string,string> . 但又没有这么简单。
它支持的两个能力使得它在配置分发和服务发现等领域相当有用。
其一是支持 Raft 协议。 其二是支持 revision 即键值的历史版本。

为啥看源码

我好奇这个 revision 的实现是否是算法竞赛中大名鼎鼎的主席树。
如果是,为了生产应用做了哪些改造。
(至少,配合了 range 功能的话,必然是线段树套主席树)
如果不是,为啥,是啥。

补充:我发现了这个blog https://blog.betacat.io/post/mvcc-implementation-in-etcd/ 有一些,没有我想要的那么详细。

研究对象和工具

对象:使用git clone 的 etcd 源代码,分支 release-3.4 , id 2702f9e5

工具:git ,vscode

过程

研究启动过程以找到关键算法

这样子,我发现 KV 的初始化是在 mvcc.New(...) 中进行的。
其中,我注意到有且仅有一个参数是指针传入的,即 srv.consistIndex 这是一个 64为无符号整型,被原子操作包裹着。 根据名字猜测,和持久化有关。

下面来看 mvcc 的实现。

结果

根据官方文档,最终的存储是 将 键和版本号合并存储在后端中。可能是因为序列化问题吧。毕竟主席树持久化到磁盘还挺麻烦。