4. 配额校准(Quota Calibration)概念

配额校准是 etcd 在达到存储空间配额(Quota)边界时,自动触发的一种内部状态修正与空间回收机制。它并非简单的“空间不足报错”,而是一套包含告警、写阻塞、空间整理、状态恢复的完整闭环流程。理解校准的触发条件及其对读写性能的影响,是压测场景下避免服务抖动的前提。

核心认知: 配额校准的本质是 etcd 在“空间耗尽”与“可用空间恢复”之间的自愈过程。校准期间,集群的写入能力会暂时降级,但读取通常不受影响。

4.1 什么是配额校准

etcd 为每个集群预设了存储空间配额(默认 2 GB)。当后端数据库(backend)的键值对总大小加上历史修订版本(revision)占用的空间接近或达到配额时,etcd 会触发配额校准流程:

  • 告警(Alarm): 集群触发 NOSPACE 告警,状态写入 etcd 的 alarm 记录。
  • 写阻塞(Write Block): 所有写入操作(Put、Delete、Txn)被拒绝,返回 etcdserver: mvcc: database space exceeded 错误。
  • 空间整理(Compaction & Defrag): 运维人员或自动化工具执行历史版本压缩(Compact)和碎片整理(Defrag),释放后端存储空间。
  • 校准恢复(Calibration Recovery): 空间回落到配额安全线以下后,告警自动解除,写入能力恢复。
校准公式: 当前总空间 = 活跃键值对大小 + 未压缩的历史修订版本大小 + 空闲碎片空间。当“当前总空间 >= 配额阈值”时,校准流程启动。

4.2 校准的触发条件

触发配额校准的条件分为硬性阈值和软性预判两类,具体如下表所示:

触发类型 条件描述 阈值/判断依据 典型场景
硬性触发 后端数据库文件(backend.db)大小达到配额上限 默认 2 GB,可通过 --quota-backend-bytes 调整 大量写入未及时压缩,历史版本堆积
软性预判 当前空间使用率超过配额的一定比例(如 90%) 内部水位线:quotaBackendBytes × 0.9 高并发写入压测,空间增长趋势明显
碎片触发 压缩后空闲碎片过多,但总文件大小未降 碎片率 > 30% 时,即使已压缩也可能触发告警 频繁的 Put/Delete 操作导致存储空洞

在压测场景中,软性预判是最常见的触发路径。当写入速率超过压缩速率时,空间会持续增长,最终达到硬性阈值。

4.3 校准对集群读写性能的影响

配额校准对读写性能的影响呈现明显的“非对称”特征:写入完全阻塞,读取基本无感。具体影响维度如下:

  • 写入延迟(Write Latency): 校准期间所有写入请求被直接拒绝,延迟变为无穷大(返回错误)。校准恢复后,写入延迟会短暂升高(因 Defrag 后需要重建部分索引),但通常在 1-2 秒内恢复正常。
  • 读取延迟(Read Latency): 读取操作不依赖配额检查,校准期间读取延迟几乎不变。但若 Defrag 正在进行,读取可能因 IO 竞争出现轻微抖动(延迟增加 5-10 ms)。
  • 吞吐量(Throughput): 写入吞吐量降为 0;读取吞吐量不受影响,但 Defrag 期间 CPU 和磁盘 IO 负载上升,可能间接限制读取吞吐。
  • 集群可用性(Availability): 校准不会导致节点宕机或 Leader 切换,但写入不可用会直接影响依赖 etcd 的上层服务(如 Kubernetes API Server 的租约更新、服务注册)。
压测避坑: 在压测脚本中,必须监控 etcd_server_quota_backend_bytes 和 etcd_server_is_leader 指标。一旦发现 NOSPACE 告警,应立即停止写入压测,执行 Compact + Defrag,待校准恢复后再继续。否则压测数据会全部失败,影响复盘结论。
配额校准触发与影响流程 配额校准触发与影响流程 正常写入 空间持续增长 触发条件判断 写阻塞 读取正常 Compact + Defrag 校准恢复 说明:写阻塞期间所有写入请求返回错误;读取正常但 Defrag 时可能轻微抖动;校准恢复后写入能力自动恢复。

4.4 校准性能影响量化参考

基于 etcd v3.5 版本的压测数据,配额校准期间的关键性能指标变化如下表所示:

性能指标 校准前(正常) 校准中(写阻塞) 校准后(恢复) 备注
写入延迟(P99) 5-10 ms 无穷大(请求被拒绝) 10-20 ms(短暂升高) 恢复后 1-2 秒内回落
读取延迟(P99) 1-3 ms 1-5 ms(Defrag 时抖动) 1-3 ms Defrag 期间 IO 竞争
写入吞吐量(ops/s) 10000-15000 0 8000-12000(短暂下降) 恢复后 3-5 秒内回升
读取吞吐量(ops/s) 30000-50000 25000-45000(轻微下降) 30000-50000 Defrag 期间 CPU 负载上升
CPU 使用率 30-50% 60-80%(Defrag 时) 30-50% Defrag 为 CPU 密集型操作
磁盘 IO 延迟 2-5 ms 10-30 ms(Defrag 时) 2-5 ms SSD 场景下影响较小
压测建议: 在压测计划中,应预留 10-15% 的配额余量(例如配额设为 2 GB,实际使用不超过 1.8 GB),并配置自动化 Compact 策略(如每 5 分钟压缩一次历史版本),避免在校准期间进行高并发写入压测。若必须测试校准场景,建议单独设计“配额耗尽-校准恢复”的专项用例,与常规性能压测隔离。