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 天滚动窗口),旧数据随时间移出窗口。
- 不可逆性: 已消耗的预算在窗口内不可撤销,只能等待窗口滚动后自然释放。
下图展示了误差预算在时间窗口内的消耗与补充过程:
2.4 误差预算补充机制
误差预算的补充并非“充值”,而是通过时间窗口的自然滚动实现的。当旧数据移出滑动窗口时,对应的预算消耗被释放,预算余额自动恢复。
补充机制的关键特征:
- 被动补充: 无需人工操作,时间窗口自动推进。
- 线性释放: 每天释放 1/30(对于 30 天窗口)的预算容量。
- 不可加速: 无法通过任何手段加速预算恢复,只能等待时间流逝。
下图展示了预算补充的线性过程:
2.5 误差预算与质量门禁的联动
误差预算的消耗状态直接驱动质量门禁的决策逻辑。门禁规则通常定义为:
| 预算消耗比例 | 门禁状态 | 允许的操作 | 触发动作 |
|---|---|---|---|
| 0% - 50% | 绿色(安全) | 正常发布、变更 | 无特殊动作 |
| 50% - 80% | 黄色(警告) | 允许发布,需审批 | 发送告警通知 |
| 80% - 100% | 橙色(危险) | 仅允许紧急修复 | 自动暂停非关键变更 |
| 100%+ | 红色(耗尽) | 禁止所有变更 | 触发应急响应流程 |
最佳实践: 在 Prometheus 中,使用
histogram_quantile 和 rate 函数实时计算 SLI,然后通过 recording rules 预计算误差预算消耗率,最后在 Alertmanager 中配置门禁规则。推荐使用 sloth 或 pyrra 等开源工具自动生成 SLO 规则。
通过误差预算的消耗与补充机制,SRE 团队能够将可靠性管理从“事后救火”转变为“事前量化控制”,实现数据驱动的变更决策和风险管控。