1. Error Budget 概念:SLO、SLI 与预算计算
Error Budget(错误预算)是现代站点可靠性工程(SRE)的核心量化工具,它将系统可靠性从“尽力而为”的定性目标转化为可度量、可交易、可触发自动化流程的数值指标。理解 Error Budget 的前提是厘清 SLI 与 SLO 的定义及其数学关系。
1.1 SLI、SLO 与 Error Budget 的定义
| 术语 | 全称 | 定义 | 示例 |
|---|---|---|---|
| SLI | Service Level Indicator (服务等级指标) |
对服务质量某一维度的实际测量值,通常是比率或延迟分位数。 | 请求成功率 = 99.95% P99 延迟 = 200ms |
| SLO | Service Level Objective (服务等级目标) |
SLI 的目标阈值或范围,是团队承诺的可靠性边界。 | 月度请求成功率 ≥ 99.9% P99 延迟 ≤ 300ms |
| Error Budget | 错误预算 | SLO 允许的最大不可用时间或失败次数,即 1 − SLO 对应的额度。 | SLO = 99.9% → 月度 Error Budget = 0.1% × 总请求量 |
核心关系:SLI 是“实际值”,SLO 是“目标值”,Error Budget 是“目标允许的偏差总量”。当 SLI 持续低于 SLO 时,Error Budget 被消耗;当 Budget 耗尽(超支),即触发 Runbook 自愈流程。
1.2 Error Budget 计算公式
Error Budget 的计算基于 SLO 定义的窗口期(通常为 30 天滚动窗口)。通用公式如下:
Error Budget = 总事件量 × (1 − SLO)
其中:
- 总事件量 = 窗口期内所有有效请求/操作的总数(或总时间秒数)
- SLO = 以小数表示的目标值(如 99.9% = 0.999)
消耗量 = 总事件量 − 成功事件量
剩余 Budget = Error Budget − 消耗量
Budget 消耗率 = 消耗量 / Error Budget × 100%
示例计算:
- 月度总请求量 = 10,000,000 次
- SLO = 99.9%(允许失败率 0.1%)
- Error Budget = 10,000,000 × 0.001 = 10,000 次失败
- 当前实际失败次数 = 8,500 → 剩余 Budget = 1,500 次(消耗率 85%)
- 当前实际失败次数 = 10,500 → Budget 超支,触发自愈流程
实践要点:Error Budget 通常以“时间”或“请求数”为单位。对于延迟类 SLO,建议使用“请求数”计算;对于可用性类 SLO,可使用“分钟数”或“秒数”计算。窗口期推荐使用滚动窗口而非固定日历月,避免月初重置导致风险盲区。
1.3 SLI → SLO → Error Budget 层级关系
1.4 多维度 SLO 与 Error Budget 聚合
实际生产环境中,一个服务通常定义多个 SLI 维度(可用性、延迟、吞吐量、错误率),每个维度对应独立的 SLO 和 Error Budget。当任一维度的 Budget 超支时,都应触发自愈流程。
| SLI 维度 | 典型指标 | SLO 示例 | Error Budget 计算(月) |
|---|---|---|---|
| 可用性 | 请求成功率 | ≥ 99.95% | 0.05% × 总请求量 |
| 延迟(P99) | P99 响应时间 | ≤ 300ms | 超出阈值的请求数 ≤ 1% × 总请求量 |
| 错误率 | 5xx 占比 | ≤ 0.1% | 0.1% × 总请求量 |
| 吞吐量 | QPS 达标率 | ≥ 目标 QPS 的 95% | 5% × 时间窗口 |
常见误区:不要将多个维度的 Error Budget 合并为一个“总预算”。每个维度独立计算、独立触发。例如:可用性 Budget 未超支但延迟 Budget 已耗尽,同样需要立即执行自愈流程。合并计算会掩盖单一维度的风险。
1.5 Error Budget 的滚动窗口与重置机制
Error Budget 通常采用 滚动时间窗口(Sliding Window)计算,而非固定日历周期。滚动窗口的优势在于:
- 避免月初重置风险:固定窗口在每月 1 日重置 Budget,可能导致月初大量部署或变更,忽略上月末的残留风险。
- 持续反映近期状态:滚动窗口始终包含最近 N 天的数据,对突发故障更敏感。
- 自愈触发更及时:Budget 消耗率持续上升时,滚动窗口能更快达到超支阈值。
常见窗口配置:
| 窗口类型 | 窗口长度 | 适用场景 | 重置行为 |
|---|---|---|---|
| 滚动窗口 | 30 天 / 7 天 | 生产核心服务 | 持续滑动,无固定重置点 |
| 固定窗口 | 自然月 | 非关键内部服务 | 每月 1 日重置 |
| 混合窗口 | 滚动 7 天 + 固定月 | 需要快速反馈的服务 | 双重计算,取较严格者 |
1.6 Error Budget 超支阈值与触发条件
在 Runbook 自愈流程设计中,需要定义明确的超支判定条件。通常设置两级阈值:
| 阈值级别 | Budget 消耗率 | 触发动作 | 响应时效 |
|---|---|---|---|
| 预警阈值 | ≥ 70% | 发送告警通知,启动人工评估 | 15 分钟内 |
| 超支阈值 | ≥ 100% | 触发 Runbook 自愈流程,自动执行 | 立即(1 分钟内) |
| 严重超支 | ≥ 150% | 升级告警,自动回滚或限流 | 立即(30 秒内) |
设计原则:Error Budget 超支触发 Runbook 自愈流程的核心逻辑是“量化 → 监控 → 判定 → 执行”。本章后续内容将详细展开每个环节的工程实现与最佳实践。