1. Error Budget 基础概念

Error Budget(错误预算)是站点可靠性工程(SRE)中连接系统稳定性与业务迭代速度的核心量化工具。它不是一个抽象概念,而是一个可计算、可监控、可决策的数值指标,直接决定了团队在给定时间窗口内能承受多大的“不可靠性”。

1.1 什么是 Error Budget

Error Budget 的定义可以浓缩为一句话:在 SLO 允许的范围内,系统可以发生故障的“额度”。

  • 本质:它是 SLO 与 100% 之间的差值所对应的可容忍错误量。
  • 单位:通常用错误次数、错误时间或错误请求占比来表示。
  • 作用:当 Error Budget 充足时,团队可以放心发布新功能;当 Error Budget 耗尽时,必须暂停发布,优先恢复稳定性。
核心思想:没有系统能做到 100% 可靠。Error Budget 给了团队一个明确的“容错空间”,避免因过度追求稳定性而扼杀创新。

1.2 SLO 与 SLI 的关系

要理解 Error Budget,必须先厘清两个基础概念:SLI(Service Level Indicator,服务等级指标)和 SLO(Service Level Objective,服务等级目标)。

概念 定义 示例 角色
SLI 衡量服务质量的具体量化指标 请求延迟 P99 ≤ 200ms、可用性 ≥ 99.9% “测量什么”
SLO SLI 需要达到的目标阈值 过去 30 天内,99.9% 的请求延迟 ≤ 200ms “目标是多少”
Error Budget SLO 未覆盖的可容忍错误量 30 天内允许 0.1% 的请求超时 “还剩多少额度”

三者形成一条清晰的链路:SLI → SLO → Error Budget。SLI 是原始测量数据,SLO 是设定的目标,Error Budget 则是 SLO 与完美之间的“缓冲地带”。

关键关系:SLO 越严格(如 99.99%),Error Budget 越小,发布风险越高;SLO 越宽松(如 99.0%),Error Budget 越大,发布自由度越高。

1.3 Error Budget 的计算公式

Error Budget 的计算基于 SLO 和总请求量(或总时间窗口)。以下是标准公式:

Error Budget = 总请求量 × (1 - SLO)

其中:
- 总请求量:在评估时间窗口内的所有合法请求总数
- SLO:以小数表示的目标值(如 99.9% 对应 0.999)

示例:
- 时间窗口:30 天
- 总请求量:10,000,000 次
- SLO:99.9%(0.999)
- Error Budget = 10,000,000 × (1 - 0.999) = 10,000 次错误

对于基于时间的 SLO(如可用性),公式略有不同:

Error Budget = 总时间 × (1 - SLO)

示例:
- 时间窗口:30 天 = 43,200 分钟
- SLO:99.9%(0.999)
- Error Budget = 43,200 × (1 - 0.999) = 43.2 分钟
注意:Error Budget 是滚动计算的。每次故障消耗额度后,剩余额度会实时更新。如果在一个窗口内多次故障导致额度耗尽,系统进入“冻结期”,禁止任何可能影响稳定性的变更。

1.4 Error Budget 消耗与剩余

实际运维中,我们更关心剩余 Error Budget,它决定了当前是否可以继续发布:

剩余 Error Budget = 初始 Error Budget - 已消耗 Error Budget

已消耗 Error Budget = 不符合 SLO 的请求数(或故障时间)

当剩余 Error Budget 降至 0 时,触发发布准入熔断,所有灰度发布或变更操作必须暂停,直到窗口滚动刷新或额度恢复。

Error Budget 生命周期与决策流程 ① SLI 采集 ② SLO 定义 ③ Error Budget 计算 ④ 消耗监控 ⑤ 剩余额度 > 0? ✅ 允许发布 🚫 熔断暂停 是 否 滚动窗口刷新后 额度自动恢复 或通过紧急修复补充

1.5 常见误区与避坑

  • 误区一:Error Budget 是固定不变的 —— 实际上它是滚动窗口内的动态值,随时间推移不断刷新。
  • 误区二:SLO 越接近 100% 越好 —— 99.999% 的 SLO 意味着 Error Budget 极小,任何微小故障都会触发熔断,反而降低发布效率。
  • 误区三:Error Budget 只用于发布决策 —— 它还可以用于容量规划、故障优先级排序、团队绩效考核等场景。
  • 误区四:忽略“消耗速率” —— 即使剩余额度为正,如果消耗速率过快(如短时间内连续故障),也应提前预警。
最佳实践:建议将 Error Budget 的消耗情况以仪表盘形式实时展示,并设置预警阈值(如剩余 20% 时发出警告),避免被动熔断。