ETCD 集群模型

介绍 Pigsty 中 ETCD 集群的实体-关系模型,E-R 关系图,实体释义与命名规范。

ETCD 模块在生产环境中以集群的形式组织,这些集群是由一组通过 Raft 共识协议关联的 ETCD 实例组成的逻辑实体

每个集群都是一个自治的分布式键值存储单元,由至少一个 ETCD 实例 组成,通过客户端端口向外暴露服务能力。

在 Pigsty 的 ETCD 模块中有三种核心实体:

  • 集群(Cluster):自治的 ETCD 服务单元,用作其他实体的顶级命名空间。
  • 实例(Instance):单个 ETCD 服务器进程,在节点上运行,参与 Raft 共识。
  • 节点(Node):运行 Linux + Systemd 环境的硬件资源抽象,隐含式声明。

相比于 PostgreSQL 集群,ETCD 集群模型更为简单,没有服务(Service)和复杂的角色(Role)区分。 所有 ETCD 实例在功能上是对等的,通过 Raft 协议选举出 Leader,其余为 Follower。 在扩容的中间状态,还允许不参与投票的 Learner 实例成员存在。


具体样例

让我们来看一个具体的例子,以三节点的 ETCD 集群为例:

etcd:
  hosts:
    10.10.10.10: { etcd_seq: 1 }
    10.10.10.11: { etcd_seq: 2 }
    10.10.10.12: { etcd_seq: 3 }
  vars:
    etcd_cluster: etcd

上面的配置片段定义了一个如下所示的三节点 ETCD 集群,该集群中的相关实体包括:

集群Cluster
etcdETCD 三节点高可用集群
实例Instance
etcd-11 号 ETCD 实例
etcd-22 号 ETCD 实例
etcd-33 号 ETCD 实例
节点Nodes
10.10.10.101 号节点,对应 etcd-1 实例
10.10.10.112 号节点,对应 etcd-2 实例
10.10.10.123 号节点,对应 etcd-3 实例

身份参数

Pigsty 使用 ETCD 参数组为 ETCD 模块的每个实体赋予确定的身份。以下两项为必选参数:

参数类型级别说明形式
etcd_clusterstring集群ETCD 集群名称,必选身份参数有效的 DNS 名称,默认为固定值 etcd
etcd_seqint实例ETCD 实例编号,必选身份参数自然数,从 1 开始分配,集群内不重复

只要在集群层面定义了集群名称,实例层面分配了实例编号,Pigsty 就能自动根据规则为每个实体生成唯一标识符。

实体生成规则示例
实例{{ etcd_cluster }}-{{ etcd_seq }}etcd-1etcd-2etcd-3

ETCD 模块不会为主机节点赋予额外的身份标识,节点使用其原有的主机名或 IP 地址进行标识。


端口协议

每个 ETCD 实例会监听以下两个端口:

端口参数用途
2379etcd_port客户端端口,供 Patroni、vip-manager 等客户端访问
2380etcd_peer_port节点间通信端口,用于 Raft 共识协议

ETCD 集群默认启用 TLS 加密通信,并使用 RBAC 认证机制。客户端需要使用正确的证书和密码才能访问 ETCD 服务。


集群规模

ETCD 作为分布式协调服务,集群规模直接影响其可用性,需要有超过半数(仲裁数)的节点存活才能维持服务。

集群规模仲裁数容忍故障数适用场景
1 节点10开发、测试、演示
3 节点21中小规模生产环境
5 节点32大规模生产环境

因此,偶数节点的 ETCD 集群没有意义,超过五节点的 ETCD 集群并不常见,因此通常使用的规格就是单节点、三节点、五节点。


监控标签体系

Pigsty 提供了一套开箱即用的监控系统,在这个系统中使用上面的 身份参数 来标识各个 ETCD 实体对象。

etcd_up{cls="etcd", ins="etcd-1", ip="10.10.10.10", job="etcd"}
etcd_up{cls="etcd", ins="etcd-2", ip="10.10.10.11", job="etcd"}
etcd_up{cls="etcd", ins="etcd-3", ip="10.10.10.12", job="etcd"}

例如,上面的 clsinsip 三个标签,分别对应集群名、实例名与节点 IP,这三个核心实体的标识符。 它们与 job 标签,在 所有 VictoriaMetrics 采集的 ETCD 监控指标中都会出现并可用。 采集 ETCD 指标的 job 名固定为 etcd


最后修改 2026-01-09: add concept model docs (a842c29)