4. SLO 与错误预算概念:SLI/SLO/SLA 定义、错误预算计算、燃烧速率与告警规则

在可观测性与站点可靠性工程(SRE)体系中,SLO(Service Level Objective) 与 错误预算(Error Budget) 是连接技术指标与业务决策的核心桥梁。本章将系统梳理 SLI/SLO/SLA 的定义层次、错误预算的数学计算模型、燃烧速率(Burn Rate)的告警触发逻辑,以及如何在多集群与多租户场景下落地这些概念。

4.1 SLI / SLO / SLA 定义与层次关系

三个概念构成从技术测量到商业承诺的递进关系:

术语 全称 定义 典型示例
SLI Service Level Indicator 服务质量的量化指标,直接测量 请求延迟 P99 ≤ 200ms;请求成功率 ≥ 99.9%
SLO Service Level Objective 对 SLI 设定的目标阈值,内部承诺 月度 P99 延迟 ≤ 200ms 达成率 99.5%
SLA Service Level Agreement 对外部客户或租户的正式承诺,含惩罚条款 月度可用性 ≥ 99.9%,否则退还 10% 费用
关键原则:SLO 必须比 SLA 更严格(通常严格 1~2 个数量级),为内部留出容错空间。例如 SLA 承诺 99.9%,SLO 应设为 99.95% 或更高。

下图展示了 SLI → SLO → SLA 的层次关系与数据流向:

SLI / SLO / SLA 层次关系 SLI 服务等级指标 延迟 / 成功率 / 吞吐量 SLO 服务等级目标 99.5% 请求 ≤ 200ms SLA 服务等级协议 99.9% 可用性承诺 层次说明: • SLI 是原始测量数据(如 P99 延迟 180ms) • SLO 是基于 SLI 设定的内部目标(如 P99 ≤ 200ms 达成 99.5%) • SLA 是对外承诺(如月度可用性 ≥ 99.9%),违反需承担赔偿

4.2 错误预算计算模型

错误预算(Error Budget)是 SLO 的衍生概念,定义为 1 - SLO,代表服务在给定时间窗口内允许的最大不可用或错误量。其核心公式如下:

错误预算 = 总时间窗口 × (1 - SLO)

示例(月度 99.9% SLO):
总时间窗口 = 30 天 × 24 小时 × 60 分钟 × 60 秒 = 2,592,000 秒
错误预算 = 2,592,000 × (1 - 0.999) = 2,592 秒 ≈ 43.2 分钟

错误预算的消耗与剩余状态直接驱动运维决策:

  • 预算充足(剩余 > 50%):允许正常发布、实验性变更。
  • 预算紧张(剩余 10%~50%):限制高风险变更,启动人工审核。
  • 预算耗尽(剩余 ≤ 10%):冻结所有变更,进入紧急修复模式。
多租户场景注意:每个租户应有独立的错误预算计算窗口。全局 SLO 达标不代表所有租户都健康,必须按租户边界拆分错误预算。

4.3 燃烧速率(Burn Rate)与告警规则

燃烧速率衡量错误预算消耗的速度,定义为:

燃烧速率 = 实际错误率 / 允许错误率

允许错误率 = 1 - SLO
实际错误率 = 错误请求数 / 总请求数

示例(SLO = 99.9%,实际错误率 = 0.2%):
允许错误率 = 0.1%
燃烧速率 = 0.2% / 0.1% = 2x

燃烧速率告警是 SRE 推荐的多窗口告警策略,通过短窗口和长窗口的组合检测异常:

告警级别 燃烧速率 时间窗口 触发条件 响应动作
Page(紧急) ≥ 14.4x 5 分钟 5 分钟内消耗 2% 月度预算 立即响应,on-call 介入
Ticket(告警) ≥ 6x 30 分钟 30 分钟内消耗 5% 月度预算 创建工单,日间处理
Warning(警告) ≥ 1x 6 小时 6 小时内消耗 25% 月度预算 记录事件,观察趋势

下图展示了燃烧速率告警的触发逻辑与时间窗口关系:

燃烧速率告警触发逻辑 SLI 实时数据 燃烧速率计算 ≥ 阈值? 触发告警 正常状态 多窗口告警策略: • 短窗口(5min / 30min)检测突发高燃烧速率,触发紧急 Page • 长窗口(6h)检测持续低燃烧速率,触发 Warning 或 Ticket • 组合使用避免误报,同时保证对慢速消耗的可见性

4.4 多集群与多租户场景下的 SLO 设计

在 Helm 面板化呈现多集群拓扑时,SLO 与错误预算需要按以下维度拆分:

  • 集群维度:每个集群独立计算 SLO 和错误预算,避免一个集群的故障影响全局视图。
  • 租户维度:每个租户(Namespace / 项目)拥有独立的 SLI 采集和 SLO 目标,支持租户边界隔离。
  • 服务维度:关键服务(如 API Gateway、数据库)单独设置 SLO,与基础设施 SLO 分层。
实践建议:在 Helm Chart 中通过 values.yaml 定义每个租户的 SLO 配置,使用 Prometheus ServiceMonitor 按标签(cluster、tenant、service)聚合 SLI 数据,再通过 Grafana 面板展示错误预算燃烧速率。

4.5 错误预算告警规则示例(Prometheus)

以下 PromQL 示例展示了基于燃烧速率的告警规则,适用于多租户场景:

# 紧急告警:5 分钟窗口燃烧速率 ≥ 14.4x
- alert: HighBurnRate
  expr: |
    (
      1 - (
        sum(rate(http_requests_total{status=~"5.."}[5m]))
        /
        sum(rate(http_requests_total[5m]))
      )
    ) / (1 - 0.999) > 14.4
  for: 2m
  labels:
    severity: page
  annotations:
    summary: "燃烧速率过高({{ $value | humanize }}x)"
    description: "租户 {{ $labels.tenant }} 在集群 {{ $labels.cluster }} 上错误预算快速消耗。"

# 警告告警:6 小时窗口燃烧速率 ≥ 1x
- alert: LowBurnRate
  expr: |
    (
      1 - (
        sum(rate(http_requests_total{status=~"5.."}[6h]))
        /
        sum(rate(http_requests_total[6h]))
      )
    ) / (1 - 0.999) > 1
  for: 10m
  labels:
    severity: warning
  annotations:
    summary: "持续低燃烧速率({{ $value | humanize }}x)"
    description: "租户 {{ $labels.tenant }} 在 6 小时内消耗了超过 25% 的月度错误预算。"
关键参数说明:
• 1 - 0.999 对应 SLO = 99.9% 的允许错误率(0.001)。
• for: 2m 防止瞬时抖动误触发告警。
• 标签 $labels.tenant 和 $labels.cluster 由 Prometheus 自动注入,实现多租户路由。

4.6 本章小结

  • SLI 是原始测量指标,SLO 是内部目标,SLA 是对外承诺,三者层层递进。
  • 错误预算 = 总时间窗口 × (1 - SLO),是服务健康度的量化货币。
  • 燃烧速率 = 实际错误率 / 允许错误率,多窗口告警策略(5min / 30min / 6h)平衡灵敏度与稳定性。
  • 在多集群与多租户场景下,必须按 集群 × 租户 × 服务 维度拆分 SLO 和错误预算,实现精细化可观测性。