3、误差预算理论基础
误差预算(Error Budget)是 SLO 治理的核心量化工具。它回答了“系统可以有多不可靠”这一关键问题,将抽象的可靠性目标转化为可跟踪、可决策的工程指标。本节将深入拆解误差预算的计算公式、消耗速率与剩余预算的监控方法,以及预算归零与燃尽率的实战意义。
3.1 误差预算的计算公式
误差预算的本质是 SLO 目标允许的最大不可用时间或失败请求量。其通用计算公式如下:
Error Budget = (1 - SLO Target) × Total Time Window
其中:
- SLO Target:以小数表示的目标值(如 99.9% 对应 0.999)。
- Total Time Window:滚动窗口时长(通常为 30 天,即 43200 分钟)。
以 30 天滚动窗口、99.9% 可用性 SLO 为例:
Error Budget = (1 - 0.999) × 43200 分钟 = 0.001 × 43200 = 43.2 分钟
这意味着在任意 30 天滚动窗口内,系统最多允许 43.2 分钟的总不可用时间。下表展示了不同 SLO 目标对应的误差预算量级:
| SLO 目标 | 30 天误差预算(分钟) | 30 天误差预算(秒) | 典型场景 |
|---|---|---|---|
| 99.9% | 43.2 | 2,592 | 内部工具、非关键业务 |
| 99.95% | 21.6 | 1,296 | 标准在线服务 |
| 99.99% | 4.32 | 259 | 核心交易、支付系统 |
| 99.999% | 0.432 | 25.9 | 电信、金融核心 |
Error Budget = Total Requests × (1 - SLO Target)。例如,30 天内 1 亿次请求,99.9% SLO 允许 10 万次失败。
3.2 消耗速率与剩余预算
误差预算不是静态的,它在滚动窗口中持续被消耗或恢复。理解消耗速率和剩余预算的动态变化,是实时运维决策的基础。
3.2.1 消耗速率(Burn Rate)
消耗速率衡量误差预算被消耗的快慢,定义为实际失败率与 SLO 允许失败率的比值:
Burn Rate = Actual Error Rate / Allowed Error Rate
当 Burn Rate = 1 时,表示消耗速度恰好与 SLO 允许的速率一致;大于 1 则意味着预算正在加速消耗。例如:
- 若 SLO 允许 0.1% 失败率,实际失败率为 0.5%,则 Burn Rate = 5。
- 若实际失败率为 0.05%,则 Burn Rate = 0.5,预算消耗放缓。
3.2.2 剩余预算(Remaining Budget)
剩余预算表示当前滚动窗口内尚未使用的误差预算额度,计算公式为:
Remaining Budget = Initial Budget - Consumed Budget
剩余预算通常以百分比形式展示,便于团队快速判断健康状况:
- 绿色区间(> 50%):健康,可进行正常发布。
- 黄色区间(20% - 50%):关注,需评估变更风险。
- 红色区间(< 20%):危险,应冻结变更并启动应急。
3.3 预算归零与燃尽率
当剩余预算降至零或负值时,即发生预算归零(Budget Exhaustion)。此时系统在滚动窗口内的不可用时间已超过 SLO 允许上限,SLO 正式违约。预算归零是最高优先级的运维事件,必须触发以下动作:
- 立即止损:回滚近期变更、扩容或降级非核心功能。
- 冻结发布:停止所有非紧急变更,直至预算恢复。
- 启动复盘:分析根本原因,更新告警阈值和应急流程。
3.3.1 燃尽率(Burn Down Rate)
燃尽率是预算归零的预警指标,定义为当前消耗速率下,剩余预算预计耗尽的时间:
Time to Exhaustion = Remaining Budget / Current Burn Rate
例如,剩余预算为 20 分钟,当前 Burn Rate 为 4,则预计 5 分钟后预算归零。燃尽率帮助团队从“剩余多少”转向“还能撑多久”,是更主动的预警方式。
3.3.2 预算恢复机制
误差预算在滚动窗口中具有自恢复特性。当系统恢复正常,旧窗口中的故障数据逐渐移出窗口,预算会自然回升。恢复速度取决于故障发生的时间位置:
- 近期故障:恢复较慢,需等待故障数据移出窗口。
- 远期故障:恢复较快,故障数据即将过期。
下表总结了预算归零前后的关键状态对比:
| 状态 | 剩余预算 | 燃尽率 | 推荐动作 |
|---|---|---|---|
| 健康 | > 50% | > 24h | 正常发布与运维 |
| 关注 | 20% - 50% | 4h - 24h | 评估变更风险,加强监控 |
| 危险 | < 20% | < 4h | 冻结变更,准备应急 |
| 归零 | ≤ 0 | 已耗尽 | 立即止损,启动复盘 |
burn_rate = rate(failure_count[5m]) / (total_count[5m] * (1 - slo_target)) 实时计算消耗速率。结合 Alertmanager 的 for 子句,可设置“燃尽率 < 2h 持续 5 分钟”触发告警,避免毛刺误报。