介绍
etcd是一个高可用的 Key/Value 存储系统,主要用于分享配置和服务发现。它是一款云原生时代的首选元数据存储产品,已经成为云原生和分布式系统的存储基石。
简要基础架构图
Client层
- 组成
- client v2 API 客户端库
- client v3 API 客户端库
- 作用
- 提供了简洁易用的 API
- 支持负载均衡、节点间故障自动转移
- 极大降低业务使用 etcd 复杂度,提升开发效率、服务可用性
API 网络层
- client 访问 server的通信协议
- v2API
- HTTP/1.x 协议
- v3API
- gRPC 协议
- HTTP/1.x 协议(通过 etcd grpc-gateway 组件支持)
- server 节点之间的通信协议
- 节点间通过 Raft 算法实现数据复制和 Leader 选举等功能时使用的 HTTP 协议
Raft 算法层(基石和亮点)
- 核心算法组成
- Leader 选举
- 日志复制
- ReadIndex
- 作用
- 用于保障 etcd 多个节点间的数据一致性、提升服务可用性等
功能逻辑层(核心特性实现层)
- KVServer 模块
- 限速判断(保证集群稳定性,避免雪崩)
- 生成一个唯一的 ID,将此请求关联到一个对应的消息通知 channel,然后向 Raft 模块发起(Propose)一个提案(Proposal)
- 等待此 put 请求,等待写入结果通过消息通知 channel 返回或者超时。etcd 默认超时时间是 7 秒(5 秒磁盘 IO 延时 +2*1 秒竞选超时时间),如果一个请求超时未返回结果,则可能会出现 etcdserver: request timed out 错误
- MVCC 模块
- 读场景
- 写场景
- treeIndex 模块(内存树形索引模块)
- 保存用户 key 和版本号的映射关系
- boltdb 模块
- 基于 B+ tree 实现的 key-value 键值库,支持事务,提供 Get/Put 等简易 API 给 etcd 操作
- 每次修改操作,生成一个新的版本号 (revision),以版本号为 key, value 为用户 key-value 等信息组成的结构体
- 数据隔离
- boltdb 里每个 bucket 类似对应 MySQL 一个表
- 用户的 key 数据存放的 bucket 名字的是 key
- etcd MVCC 元数据存放的 bucket 是 meta
- Auth 鉴权模块
- Lease 租约模块
- Compactor 压缩模块
- Quota 模块(配额)
- Apply模块
存储层
- 预写日志 (WAL) 模块
- 可保障 etcd crash 后数据不丢失
- 快照 (Snapshot) 模块
- boltdb 模块
- 保存了集群元数据和用户写入的数据
每个人都有潜在的能量,只是很容易被习惯所掩盖,被时间所迷离,被惰性所消磨~