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 告警引擎:

SLO 概念关系与告警链路 SLO 概念关系与告警链路 SLI 请求成功率 / P99 SLO 99.9% / ≤200ms 错误预算 43.2 分钟 / 30天 燃烧速率 14.4 / 6 / 1 Grafana 告警引擎 多窗口燃烧速率规则评估 自愈剧本触发 重启 / 扩容 / 流量切换

3.6 自愈剧本触发条件设计原则

基于上述概念,自愈剧本的触发条件应遵循以下原则:

  1. 燃烧速率优先: 使用多窗口燃烧速率(如 5m/30m/2h)而非单一 SLI 阈值,减少误触发。
  2. 错误预算消耗率: 当错误预算在短时间(如 10 分钟)内消耗超过 10% 时,立即触发。
  3. 分级响应: 不同燃烧速率对应不同自愈动作(如低速率仅记录,高速率自动重启)。
  4. 冷却期: 每次自愈后设置冷却窗口(如 5 分钟),避免重复触发耗尽错误预算。
实战案例:某电商平台设置 5 分钟窗口燃烧速率 ≥ 14.4 时触发自动扩容。该规则在双十一期间成功在 30 秒内完成扩容,避免了 SLO 违约。