etcd 是一个分布式可靠键值存储,专为分布式系统中最重要的关键数据而设计。本文档介绍了 etcd 的核心概念、架构和关键特性,以帮助开发人员理解该系统。
etcd 是一个高度一致的分布式键值存储,为跨集群机器存储数据提供了一种可靠的方式。它使用 Go 语言编写,并利用 Raft 共识算法 来管理一个高可用的复制日志,为访问具有强一致性保证的分布式数据提供了标准接口。
etcd 被广泛应用于生产环境中,尤其作为 Kubernetes 和其他需要可靠协调服务的分布式系统的主要数据存储。
来源:README.md21-30 README.md28-36
etcd 遵循客户端-服务器架构,其中多个 etcd 服务器实例组成一个集群。客户端使用 etcd 客户端库或 etcdctl 命令行工具与集群通信。
etcd 架构包含几个关键组件
来源:server/etcdserver/server.go209-301 server/etcdserver/raft.go80-148 server/etcdserver/v3_server.go59-102
此图说明了不同类型的请求是如何在 etcd 系统中处理的
来源:server/etcdserver/v3_server.go104-159 server/etcdserver/server.go1017-1077
EtcdServer 是核心协调组件,负责处理客户端请求、管理 Raft 共识协议以及集成所有其他 etcd 子系统。它在 server/etcdserver/server.go 中定义,并实现了包括 Server、RaftStatusGetter 和 Authenticator 在内的多个接口。
主要职责
来源:server/etcdserver/server.go209-301 server/etcdserver/server.go538-608
etcd 使用 Raft 共识算法在集群中保持一致性。raftNode 结构封装了 Raft 协议实现,位于 server/etcdserver/raft.go 中。
Raft 实现的关键方面
来源:server/etcdserver/raft.go80-155 server/etcdserver/server.go1017-1077
etcd 的存储系统包含多个层
MVCC(多版本并发控制):
bbolt 后端:
预写日志 (WAL):
快照生成器:
来源:server/etcdserver/server.go209-301 server/etcdserver/bootstrap.go168-178
etcd 提供全面的安全模型,包括身份验证和基于角色的访问控制(RBAC)
主要安全特性
来源:server/etcdserver/server.go381-384 server/etcdserver/v3_server.go84-102
客户端通过 etcdctl 命令行工具或客户端库与 etcd 交互。主要通信协议是 gRPC,并有一个用于 RESTful 访问的 HTTP/JSON 网关。
主要的客户端库是 clientv3,它提供了一个与 etcd 交互的 Go API。它包括
来源:server/etcdserver/v3_server.go59-102 README.md115-119
etcdctl CLI 提供了一种用户友好的方式,可以通过命令行与 etcd 进行交互。它支持客户端库提供的所有核心操作。
示例操作
put、get、delwatchlease grant、lease revokeuser add、role grantmember add、endpoint health来源:README.md32-34 README.md79-83
etcd 使用 Raft 共识在集群节点之间保持一致性。这使其能够容忍机器故障(包括领导者故障),同时维护数据完整性。
集群可以通过以下方式形成:
可以在集群运行时动态添加、删除或更新成员。新节点在被提升为完全投票成员之前,可以作为“学习者”添加。
来源: server/etcdserver/server.go161-196 server/etcdserver/bootstrap.go272-287 server/etcdserver/api/membership/cluster.go42-62
在一个基于 Raft 的系统中,例如 etcd
领导者选举过程确保任何时候只有一个领导者,从而防止了脑裂的情况。
来源: server/etcdserver/raft.go80-155 server/etcdserver/server.go475-497
etcd 通过 Prometheus 指标和内置的健康检查提供全面的监控功能。
/health, /livez, /readyzetcd 需要定期维护以确保最佳性能
来源: server/etcdserver/api/v3rpc/maintenance.go72-102 server/etcdserver/corrupt.go39-85
etcd 提供了一个具有强一致性保证的可靠分布式键值存储,使其非常适合存储关键配置数据和构建分布式系统。它结合了简洁性、安全性、性能和可靠性,已成为许多现代云原生架构(尤其是 Kubernetes)的基石。
有关 etcd 特定方面的更详细信息,请参阅这些相关的 wiki 页面