前段时间认真学习了 ETCD 源码实现,往后的一段时间,会陆陆续续的写一些学习记录。
ETCD 的使用方法、用途等,可以通过 Google 或者百度查询,这里只是记录源码相关的学习,如有错误,欢迎指正。
本章主要介绍 ETCD 的主要几个组成部分。
ECTD主要包括以下几个部分:
Storage
存储包括两部分组成,内存和磁盘。
index:键值索引(MVCC 多版本控制)
kv:原始键值对(MVCC 多版本控制)
snaphot:数据快照
metadata:元数据,主要记录当前节点的状态信息。
Transport
Transport 主要实现数据传输,其中包括两种传输方式,一是长连接(数据传输完成不关闭),二是短链接(数据传输完成就关闭)。
短连接主要用于传输大数据,比如数据快照。
Server
httpServer 或 grpc Server,用于接收外部请求。
Monitor
服务监控模块,各个模块上报自身状态数据,用户可以通过特定地址,查看服务的运行状态。
Raft
Raft 协议的具体实现。主要包括 Leader选举、日志同步等。
Node
一个 Node 代表一个节点,Node 会调用 Raft 进行 Leader 选举和日志同步。
当接收到提案或者其他消息时,会通过 Node 处理,将消息保存到本地(unstable消息),并最终交给上层模块处理。上层模块处理完成之后,在满足 Raft 协议的情况下, Node 会将消息更新为 stable 消息 。
RaftNode
Node 的上层模块,其主要作用用于处理 Node 提交的 Ready 实例 (包含一系列待处理消息的封装)。其中包括,追加消息自身内存、消息持久化、同步消息到其他节点、更新服务配置等等。
ETCDServer
最上层组件,主要调用各种组件来实现一个可以正常工作的ETCD实例。
PS:欢迎纠正