4. etcd 关键性能指标与监控数据采集原理

etcd 作为 Kubernetes 的控制面存储,其性能直接决定集群的稳定性和响应速度。本节将深入解析 etcd 的核心性能指标(延迟、吞吐、DB 大小、慢请求),并阐述 Prometheus 采集这些指标的底层原理。

4.1 etcd 核心性能指标全景

etcd 性能监控主要围绕四个维度展开:延迟(Latency)、吞吐(Throughput)、DB 大小(DB Size)和慢请求(Slow Requests)。下表总结了每个维度的关键指标及其含义:

维度 指标名称(Prometheus) 含义 告警阈值参考
延迟 etcd_request_duration_seconds 请求完成耗时,分位值(p99/p50)反映集群响应速度 p99 > 1s 告警
吞吐 etcd_server_requests_total 每秒处理的读写请求数(QPS) 低于基线 50% 或突增 200% 告警
DB 大小 etcd_mvcc_db_total_size_in_bytes etcd 数据目录的物理存储大小 超过 2GB 告警,超过 8GB 严重告警
慢请求 etcd_server_slow_read_indexes_total / etcd_server_slow_apply_total Raft 日志应用或读索引操作耗时超过 1s 的累计次数 任何非零值持续增长即告警
实践要点:在生产环境中,延迟和慢请求是反映 etcd 健康状态的最敏感指标。DB 大小超过 8GB 时,etcd 的 compaction 和 defragmentation 操作会显著影响写入性能。

4.2 延迟指标深度解析

etcd 延迟指标通过 etcd_request_duration_seconds_bucket 直方图暴露,Prometheus 在采集端计算分位值。关键观察点包括:

  • p50 延迟:反映正常负载下的典型响应时间,通常应 < 10ms。
  • p99 延迟:反映尾部延迟,是用户体验的关键指标,应 < 500ms。
  • 操作类型区分:type="write" 和 type="read" 标签分别对应写入和读取延迟。写入延迟受磁盘 fsync 影响较大。
延迟异常排查路径:
1. 检查磁盘 IO 延迟(etcd_disk_wal_fsync_duration_seconds)
2. 检查网络延迟(节点间 RTT)
3. 检查是否存在慢请求(etcd_server_slow_apply_total)
4. 检查 etcd 进程 CPU 和内存使用

4.3 吞吐指标与 DB 大小

吞吐指标 etcd_server_requests_total 按 grpc_method 标签区分操作类型(Range、Put、Delete、Txn 等)。DB 大小指标 etcd_mvcc_db_total_size_in_bytes 包含历史版本数据,需结合 compaction 策略分析。

指标 采集方式 典型基线(3 节点集群) 异常表现
写入 QPS Prometheus rate() 函数 1000 - 5000 突降可能表示 leader 切换或网络分区
读取 QPS Prometheus rate() 函数 5000 - 20000 突增可能触发 follower 读取限流
DB 大小 Gauge 直接采集 1GB - 4GB 持续增长超过 8GB 需手动 defrag

4.4 慢请求指标与 Raft 层关联

慢请求指标直接反映 Raft 共识层的健康状态:

  • etcd_server_slow_apply_total:Raft 日志条目应用到状态机耗时超过 1s 的累计次数。通常由磁盘 IO 瓶颈或 CPU 饥饿引起。
  • etcd_server_slow_read_indexes_total:读索引请求(用于线性化读取)耗时超过 1s 的累计次数。通常由网络延迟或 leader 过载引起。
关键告警规则:慢请求指标不应持续增长。如果 etcd_server_slow_apply_total 在 5 分钟内持续增加,说明 etcd 已经无法及时处理写入请求,可能导致集群不可用。

4.5 监控数据采集原理

etcd 通过 /metrics 端点暴露 Prometheus 格式的指标数据。采集原理分为以下步骤:

  1. 指标注册:etcd 启动时,内部组件(如 Raft 层、MVCC 层、网络层)向 Prometheus 客户端库注册自定义指标。
  2. 数据采样:etcd 在处理请求时,实时更新指标值。例如,每次 Raft 日志应用完成后,记录耗时到直方图。
  3. HTTP 暴露:Prometheus 客户端库在 /metrics 端点以文本格式输出当前所有指标的快照。
  4. Prometheus 拉取:Prometheus Server 按配置的 scrape_interval(通常 15s)向每个 etcd 实例的 /metrics 发起 HTTP GET 请求。
  5. 指标存储与计算:Prometheus 存储原始样本,并通过 PromQL 函数(如 rate()、histogram_quantile())计算延迟分位值、QPS 等派生指标。
采集原理关键点:
- etcd 的 /metrics 端点默认监听在 --listen-metrics-urls 指定的地址(通常与客户端端口分离)。
- 指标数据是瞬时快照,Prometheus 通过多次拉取计算变化率。
- 直方图指标(如延迟)需要 histogram_quantile() 函数在查询时计算分位值,不直接暴露 p99。

4.6 指标采集架构图

下图展示了 Prometheus 从 etcd 集群采集指标并生成告警的完整数据流:

etcd 指标采集与告警数据流 etcd 节点 1 /metrics 端点 etcd 节点 2 /metrics 端点 etcd 节点 3 /metrics 端点 Prometheus Server scrape_interval: 15s 存储原始样本 PromQL 查询 rate() / histogram_quantile() Alertmanager 告警规则评估 采集原理要点 瞬时快照 + 拉取模式 直方图需查询时计算

4.7 关键指标与 Raft 层对应关系

etcd 的性能指标与 Raft 共识算法的各个阶段紧密对应。理解这种对应关系有助于快速定位问题根因:

Raft 阶段 对应指标 常见瓶颈
Leader 选举 etcd_server_leader_changes_seen_total 网络分区、磁盘 IO 延迟导致心跳超时
日志复制 etcd_server_proposals_failed_total Follower 磁盘慢、网络丢包
日志应用 etcd_server_slow_apply_total CPU 饥饿、磁盘 fsync 延迟高
快照 etcd_server_snap_db_save_total_duration_seconds DB 过大、磁盘 IO 带宽不足
监控最佳实践:建议将 etcd 指标采集纳入 Argo CD 的 Application 健康检查体系。通过 Prometheus Operator 的 ServiceMonitor 自动发现 etcd 指标端点,并在 Argo CD 的 Application 中配置 prometheus.io/scrape: "true" 注解,实现指标采集的 GitOps 化管理。