架构
相关源文件
本文档提供了etcd架构和核心组件的高层概述。它描述了主要的架构元素以及它们如何相互作用,从而构建一个分布式、可靠的键值存储。
有关特定组件的实现细节,请参阅相应的子页面
系统概览
etcd是一个分布式、可靠的键值存储,它使用Raft共识算法来管理一个高可用的复制日志。它旨在为分布式系统存储关键数据,为跨集群机器的数据存储提供可靠的方式。
高层架构
此图显示了etcd的主要组件及其关系。总的来说,etcd包含:
- 客户端层:用户与etcd交互的接口
- API层:用于处理客户端请求的API服务器
- 服务器层:核心服务实现
- 存储层:持久化存储机制
- 共识层:Raft共识算法的实现
- 成员资格层:集群成员资格和通信
来源
核心组件
EtcdServer
EtcdServer 是管理etcd服务器的中心组件。它协调所有其他组件并处理客户端请求。
EtcdServer 处理API请求并管理内部组件,包括:
- Raft模块:实现Raft共识算法
- ApplierV3:将已提交的条目应用于存储
- KV:提供键值操作
- Lease:管理键的租约(有时限的键)
- Auth:处理身份验证和授权
- Watch:处理监视请求
来源
请求处理流程
etcd中的请求处理遵循读写操作的不同路径
-
读操作:可以直接从MVCC存储提供服务,无需经过Raft共识过程。这为读取操作提供了更低的延迟。
-
写操作:必须通过Raft共识过程,以确保集群之间的一致性。这会增加延迟,但可以确保所有节点最终拥有相同的数据。
来源
存储架构
etcd的存储系统由多个层组成,它们协同工作以提供持久、一致的存储。
多版本并发控制(MVCC)
MVCC存储提供:
- 版本控制:每次修改都会创建数据的新版本
- 快照:特定时间点的数据一致性视图
- 并发:读者不阻塞写者,反之亦然
- 事务:多操作的原子更新
MVCC存储维护一个B树索引以进行高效查询,并使用bbolt进行持久化存储。
来源
bbolt存储
etcd使用bbolt(前身为Bolt DB)作为其存储引擎,它是一个嵌入式的键值数据库,适用于Go应用程序。它提供:
- 单文件数据库:所有数据存储在单个文件中
- ACID事务:原子性、一致性、隔离性、持久性
- 零配置:无需设置或守护进程
- 桶:键/值对的有组织集合
来源
共识实现
etcd使用Raft共识算法来维护多节点之间的一致性。
Raft 共识
etcd的Raft实现的关键方面:
- 状态机:实现带有状态转换的核心Raft算法
- 写前日志:在应用提议之前记录它们
- 快照:周期性的状态捕获,以避免日志无界增长
- rafthttp传输:Raft节点之间的通信通道
来源
集群成员资格
集群成员资格管理特性:
- 动态成员资格:成员可以在运行时添加或删除
- 集群ID:每个集群的唯一标识符
- 健康检查:成员之间定期的健康检查
- Peer URLs:节点间通信使用的URL
来源
客户端-服务器通信
gRPC API
etcd主要通过gRPC暴露其API,这使得通信高效且语言无关。
主要的API服务包括:
- KV服务:基本的键值操作(Get, Put, Delete)
- Watch服务:监视键的变化
- Lease服务:创建和管理租约
- Auth服务:用户和角色管理
- Cluster服务:集群成员资格操作
- Maintenance服务:管理任务
来源
Watch机制
etcd中的Watch机制:
- 长连接:维护一个开放连接以流式传输更改
- 事件过滤:客户端可以监视特定的键或前缀
- 渐进式事件传递:事件按顺序传递
- 压缩:可以压缩历史事件以节省空间
来源
认证与授权
etcd提供了一个基于角色的访问控制(RBAC)系统用于身份验证和授权。
身份验证和授权特性:
- 用户管理:创建、删除和更新用户
- 角色管理:创建、删除和更新角色
- 权限分配:授予/撤销角色的权限
- 基于令牌的身份验证:JWT或简单令牌身份验证
- TLS支持:客户端证书身份验证
来源
主要功能
事务
etcd的事务系统允许通过条件执行进行原子操作。
- 比较:要检查的条件(例如,值相等、版本相等)
- 成功:如果满足条件,要执行的操作
- 失败:如果不满足条件,要执行的操作
这使得构建复杂的分布式协调原语成为可能。
来源
租约
租约提供带有时限的键生命周期
- 租约授予:创建具有生存时间(TTL)的租约
- 键附加:将键附加到租约
- 保持活动:延长租约的有效期
- 自动撤销:租约到期时,键会自动删除
此功能支持构建具有自动清理过时数据的分布式系统。
来源
模块组织
etcd的代码库组织成几个Go模块,具有明确定义的职责。
这种模块化结构有助于保持关注点的清晰分离以及组件之间明确定义的接口。
来源
总结
etcd的架构围绕以下原则设计:
- 一致性:通过Raft共识
- 可靠性:通过分布式复制
- 性能:通过对存储和读取路径的精心设计
- 易用性:通过定义良好的API
主要组件协同工作,提供了一个分布式键值存储,可以可靠地存储分布式系统的关键配置数据。
来源