ETCD探索
梗概
这篇文章旨在从源码角度分析ETCD MVCC、Lease、Watch的实现,帮助我们更好的使用ETCD。
ETCD是什么?
这是ETCD官网给出的解释,ETCD是一个KV存储。现在有太多的KV存储中间件,我们为什么要选择ETCD呢?原因就是这句话:"distributed", "reliable",ETCD是一个分布式的、可靠的KV存储。相比于Redis,ETDC不够快,但足够安全,可靠。每一个中间件都有自己的特点,我选择ETCD有两个原因:
- ETCD是GO写的,所以GO用起来很方便。(不用ZK的原因)
- 扩容方便。
在讨论之前,我们先看下ETCD的目录结构
- auth 访问权限
- client/clientv3 GO客户端SDK
- contrib 里面放着raftexample实现
- embed 主要是config
- etcdctl
- etcdmain 入口程序
- etcdserver 主server
- functional/hack 一些很杂的东西,比如CMD、DockerFile之类的
- integration 和etcd集群相关
- lease 租约
- logos
- mvcc ETCD的底层存储,包含Watch实现
- pkg ETCD使用的工具集合
- proxy ETCD支持的grpc、http
- raft raft模块
- scripts/security/tests/tools/version 顾名思义
- wal 日志模块
我认为,以上这些目录中,属于ETCD核心的仅有lease、mvcc、raft、etcdserver,其余都是辅助的功能。其中etcdserver是其他模块的整合。
另外ETCD之所以是"distributed"、"reliable",依赖于raft的实现。raft是一个共识算法,我之前读过一篇关于raft的论文(读的中文版,依然不懂),结合ETCD-raft的代码,依然有很多模棱两可的地方,所以这里不打算讨论raft模块的实现。我一开始写了一些关于怎么直接使用ETCD-raft的文章,后来发现了一篇讲解更好的,那我就不再赘述这部分了,这里直接贴出来。
想了解raft的同学:
- google或baidu: 6.824 raft,可以搜到raft的那篇论文
- http://thesecretlivesofdata.c... raft动画
- https://raft.github.io/ 手动模拟raft
以上三者结合着看,我感觉是学习raft最直接的方法了
如何使用ETCD-raft模块:
https://zhuanlan.zhihu.com/p/...
这篇文章我认为已经很详细的说明raft模块的使用,建议阅读
那么这次我想与大家讨论的是ETCD中MVCC、Watch、Lease这三者的实现,讨论ETCD是如何实现这些功能的。涉及到的数据结构有BTree、ADT(红黑树)、优先级队列。
目录
有疑问加站长微信联系(非本文作者)