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,待校准恢复后再继续。否则压测数据会全部失败,影响复盘结论。
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 分钟压缩一次历史版本),避免在校准期间进行高并发写入压测。若必须测试校准场景,建议单独设计“配额耗尽-校准恢复”的专项用例,与常规性能压测隔离。