3. SLO 基础概念:SLI、SLO、错误预算、燃烧速率
在构建自愈剧本之前,必须理解 SLO 体系的核心度量与约束。SLO 不是单一数字,而是一套由 SLI → SLO → 错误预算 → 燃烧速率 构成的量化决策链。本节逐一拆解这四个概念,并说明它们如何驱动告警与自动化恢复。
3.1 SLI:服务等级指标
SLI(Service Level Indicator)是衡量服务质量某一维度的原始度量。常见的 SLI 类型包括:
| 维度 | 典型 SLI | 计算方式 |
|---|---|---|
| 可用性 | 请求成功率 | 成功请求数 / 总请求数 × 100% |
| 延迟 | P99 响应时间 | 排序后第 99 百分位的延迟值(ms) |
| 吞吐量 | 每秒请求数(RPS) | 时间窗口内请求总数 / 窗口时长 |
| 错误率 | 5xx 占比 | 5xx 响应数 / 总响应数 × 100% |
实践建议:SLI 必须可被 Prometheus 或同类系统持续采集,且粒度至少达到 1 分钟。自愈剧本通常以 1m/5m 窗口的 SLI 作为输入。
3.2 SLO:服务等级目标
SLO(Service Level Objective)是 SLI 的目标阈值,即“我们希望服务达到什么水平”。例如:
- 可用性 SLO: 99.9%(三个九)
- 延迟 SLO: P99 ≤ 200ms
- 错误率 SLO: 5xx 占比 ≤ 0.1%
SLO 通常以滚动窗口(如 30 天)评估,而非瞬时值。这意味着短时抖动不一定会触发 SLO 违约,但持续偏离会累积错误预算。
3.3 错误预算:SLO 的“可犯错额度”
错误预算 = 1 − SLO。以 99.9% 可用性 SLO 为例,30 天内的错误预算为:
总时间 = 30 × 24 × 60 × 60 = 2,592,000 秒
错误预算 = 2,592,000 × (1 − 0.999) = 2,592 秒 ≈ 43.2 分钟
当实际不可用时间超过 43.2 分钟,SLO 即违约。错误预算的消耗速率是告警与自愈触发的核心依据。
关键原则:错误预算不是“预留的故障时间”,而是风险量化工具。消耗越快,越需要立即干预。
3.4 燃烧速率:告警紧迫度的量化
燃烧速率(Burn Rate)表示错误预算消耗的速度,单位是“每小时消耗多少个 SLO 窗口的错误预算”。计算公式:
燃烧速率 = (窗口内错误时间 / 窗口总时间) / (1 − SLO)
例如:SLO = 99.9%,1 小时内错误时间为 36 秒:
燃烧速率 = (36 / 3600) / 0.001 = 0.01 / 0.001 = 10
这意味着按当前速率,错误预算将在 1/10 小时内(6 分钟)耗尽。Grafana 告警通常使用多窗口燃烧速率规则:
| 燃烧速率 | 窗口长度 | 告警严重度 | 自愈触发建议 |
|---|---|---|---|
| ≥ 14.4 | 5 分钟 | Critical | 立即执行自愈剧本 |
| ≥ 6 | 30 分钟 | Warning | 预检查,准备自愈 |
| ≥ 1 | 2 小时 | Info | 记录,不触发自愈 |
避坑提示:不要仅依赖单一短窗口(如 1m)的燃烧速率。短窗口噪声大,容易误触发自愈。推荐使用“多窗口 + 多速率”组合规则。
3.5 概念关系图
下图展示 SLI → SLO → 错误预算 → 燃烧速率的完整链路,以及它们如何输入 Grafana 告警引擎:
3.6 自愈剧本触发条件设计原则
基于上述概念,自愈剧本的触发条件应遵循以下原则:
- 燃烧速率优先: 使用多窗口燃烧速率(如 5m/30m/2h)而非单一 SLI 阈值,减少误触发。
- 错误预算消耗率: 当错误预算在短时间(如 10 分钟)内消耗超过 10% 时,立即触发。
- 分级响应: 不同燃烧速率对应不同自愈动作(如低速率仅记录,高速率自动重启)。
- 冷却期: 每次自愈后设置冷却窗口(如 5 分钟),避免重复触发耗尽错误预算。
实战案例:某电商平台设置 5 分钟窗口燃烧速率 ≥ 14.4 时触发自动扩容。该规则在双十一期间成功在 30 秒内完成扩容,避免了 SLO 违约。