2. 误差预算(Error Budget)原理

误差预算是 SRE 实践中最核心的量化工具,它将抽象的“可靠性”转化为可消耗、可补充、可预警的数值指标。理解误差预算的定义、计算公式以及消耗与补充机制,是构建 SLA 质量门禁的基础。

2.1 误差预算定义

误差预算(Error Budget)是指在 SLA 约定的时间窗口内,系统允许发生故障或不可用的最大累计时间(或失败请求比例)。它本质上是“可靠性目标”的倒数——如果 SLA 承诺 99.9% 可用性,那么 0.1% 的不可用时间就是误差预算。

核心思想: 误差预算将可靠性从“不可触碰”转变为“可量化消耗的资源”。只要消耗未超预算,发布、变更等风险操作就可以继续进行;一旦预算耗尽,必须暂停变更,优先恢复稳定性。
SLA 目标 可用性 误差预算(30天窗口) 误差预算(7天窗口)
三个九 99.9% 43.2 分钟 10.08 分钟
四个九 99.99% 4.32 分钟 1.008 分钟
五个九 99.999% 25.9 秒 6.05 秒
实践建议: 不要追求“五个九”的极端目标。误差预算越紧,运维僵化度越高,创新速度越慢。通常建议内部 SLO 目标比对外 SLA 宽松 10%~20%,为误差预算留出缓冲。

2.2 误差预算计算公式

误差预算的计算基于两个核心指标:SLO 目标和总可用时间。公式如下:

Error Budget = Total Time × (1 - SLO Target)

其中:
- Total Time = 时间窗口长度(秒、分钟或请求总数)
- SLO Target = 目标可用性(如 0.999)

示例(30天窗口,99.9% SLO):
Error Budget = 30 × 24 × 60 × 60 × (1 - 0.999)
             = 2,592,000 × 0.001
             = 2,592 秒
             = 43.2 分钟

在 Prometheus 中,我们通常使用 SLI(服务等级指标) 来度量实际表现,然后计算已消耗的误差预算:

消耗的误差预算 = max(0, 1 - (SLI / SLO))

其中:
- SLI = 实际观测到的成功率(如请求成功率、延迟达标率)
- SLO = 目标成功率

示例(SLI=99.8%,SLO=99.9%):
消耗的误差预算 = max(0, 1 - (0.998 / 0.999))
               = max(0, 1 - 0.998999)
               = 0.001001
               = 0.1001%
常见误区: 不要直接用“1 - SLI”作为消耗量。正确的计算是“1 - (SLI / SLO)”,它反映了与目标的相对偏差。当 SLI 高于 SLO 时,消耗为 0(预算未消耗)。

2.3 误差预算消耗机制

误差预算的消耗是持续累积的。每一次故障、每一个慢请求、每一次错误响应,都会消耗预算。消耗机制遵循以下原则:

  • 实时累积: 每次 SLI 低于 SLO 时,立即计算并累加消耗量。
  • 窗口滑动: 消耗量基于滑动时间窗口计算(如 30 天滚动窗口),旧数据随时间移出窗口。
  • 不可逆性: 已消耗的预算在窗口内不可撤销,只能等待窗口滚动后自然释放。

下图展示了误差预算在时间窗口内的消耗与补充过程:

误差预算消耗与补充机制(30天滑动窗口) Day 0 Day 7 Day 14 Day 21 Day 28 Day 30 总误差预算:43.2 分钟(100%) 已消耗:17.28 分钟(40%) 剩余:25.92 分钟(60%) 故障A 消耗 5min 故障B 消耗 8min 慢请求 消耗 3min 错误率 消耗 1.28min 补充机制:窗口滚动后,Day 0 的故障A(5min)移出窗口,预算自动释放

2.4 误差预算补充机制

误差预算的补充并非“充值”,而是通过时间窗口的自然滚动实现的。当旧数据移出滑动窗口时,对应的预算消耗被释放,预算余额自动恢复。

补充机制的关键特征:

  • 被动补充: 无需人工操作,时间窗口自动推进。
  • 线性释放: 每天释放 1/30(对于 30 天窗口)的预算容量。
  • 不可加速: 无法通过任何手段加速预算恢复,只能等待时间流逝。

下图展示了预算补充的线性过程:

误差预算补充曲线(30天窗口,每日释放 1.44 分钟) 0% 50% 100% Day 0 Day 7 Day 14 Day 21 Day 28 Day 30 23.3% 46.7% 70% 93.3% 补充速率恒定:每天释放 1/30 的预算容量,不受故障频率影响

2.5 误差预算与质量门禁的联动

误差预算的消耗状态直接驱动质量门禁的决策逻辑。门禁规则通常定义为:

预算消耗比例 门禁状态 允许的操作 触发动作
0% - 50% 绿色(安全) 正常发布、变更 无特殊动作
50% - 80% 黄色(警告) 允许发布,需审批 发送告警通知
80% - 100% 橙色(危险) 仅允许紧急修复 自动暂停非关键变更
100%+ 红色(耗尽) 禁止所有变更 触发应急响应流程
最佳实践: 在 Prometheus 中,使用 histogram_quantile 和 rate 函数实时计算 SLI,然后通过 recording rules 预计算误差预算消耗率,最后在 Alertmanager 中配置门禁规则。推荐使用 sloth 或 pyrra 等开源工具自动生成 SLO 规则。

通过误差预算的消耗与补充机制,SRE 团队能够将可靠性管理从“事后救火”转变为“事前量化控制”,实现数据驱动的变更决策和风险管控。