3. SLO 目标设定:如何根据业务重要性设定 SLO 阈值

SLO(Service Level Objective)是服务等级目标,它定义了服务在特定时间窗口内应达到的可靠性水平。设定合理的 SLO 阈值是 SRE 实践的核心环节——阈值过高会导致成本失控,过低则无法保障用户体验。本章将系统讲解如何根据业务重要性分级设定 SLO,并深入解析错误预算的计算与消耗机制。

3.1 业务重要性分级与 SLO 阈值映射

不同业务模块对可靠性的敏感度差异巨大。核心交易链路与后台报表系统显然不应使用相同的 SLO 标准。我们采用“业务重要性-服务等级”四象限模型进行分级:

业务重要性等级 典型场景 推荐 SLO 阈值 年度最大不可用时间
L1 核心交易 支付、下单、登录鉴权 99.99% (四个9) 52.56 分钟
L2 关键业务 商品详情、购物车、搜索 99.95% 4.38 小时
L3 一般业务 用户评论、历史订单查询 99.9% (三个9) 8.76 小时
L4 辅助服务 推荐、广告、后台报表 99.5% 43.8 小时
实践建议: 不要对所有服务一刀切使用 99.99%。SLO 每增加一个 9,基础设施成本通常上升 2-3 倍。将非核心服务的 SLO 从 99.99% 降至 99.9%,每年可节省数百万的冗余资源投入。

设定 SLO 阈值时,还需考虑以下三个约束条件:

  • 用户期望基线: 通过客户端埋点数据,统计用户可感知的延迟与错误容忍度。
  • 技术实现成本: 多 AZ 部署、跨区域容灾、实时监控等投入是否在预算范围内。
  • 合规与合同要求: 金融、医疗等行业有明确的监管 SLA 底线,SLO 必须高于 SLA。

3.2 错误预算的概念与计算

错误预算(Error Budget)是 SRE 方法论中最重要的管理工具之一。它将“可靠性”从抽象目标转化为可量化的、可消耗的预算额度,从而平衡稳定性与创新速度。

核心公式:

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

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

错误预算的消耗与剩余状态,直接决定了团队是否可以发布新功能:

  • 预算充足(剩余 > 50%): 正常发布,鼓励创新。
  • 预算紧张(剩余 20%-50%): 限制高风险发布,优先修复稳定性问题。
  • 预算耗尽(剩余 ≤ 0%): 冻结所有发布,进入“错误预算燃烧”应急模式,全力恢复可靠性。
常见误区: 错误预算不是“允许故障的额度”,而是“可接受的不可用时间上限”。一旦预算耗尽,意味着服务已经违反了 SLO,必须立即启动复盘与改进流程,而不是继续消耗。

3.3 错误预算消耗速率与告警触发

仅监控剩余预算是不够的,我们需要关注消耗速率。如果预算在窗口初期就快速消耗,即使总量未超限,也预示着严重问题。我们引入“错误预算消耗率”指标:

消耗率 = 当前已消耗错误预算 / 窗口已过时间比例

示例:
- 30 天窗口,SLO = 99.9%,总预算 = 43.2 分钟
- 第 5 天结束时(窗口已过 16.7%),已消耗 15 分钟预算
- 消耗率 = 15 / (43.2 × 16.7%) = 15 / 7.21 ≈ 2.08
- 消耗率 > 1.0,说明预算消耗速度是预期的 2 倍,需触发告警

我们设定三级告警阈值:

告警级别 消耗率阈值 剩余预算 响应动作
Info > 0.8 > 30% 通知 SRE 团队关注
Warning > 1.2 10%-30% 启动应急响应,限制发布
Critical > 1.5 < 10% 全团队介入,冻结发布,启动复盘
关键洞察: 消耗率告警比剩余预算告警更灵敏。它能在预算耗尽前 3-5 天发出预警,为团队争取宝贵的响应时间。
错误预算消耗与告警流程 SLO 目标设定 计算总错误预算 实时消耗追踪 消耗率 = 已消耗 / 时间比例 告警级别判定 响应动作:通知 / 限制发布 / 冻结 💡 消耗率 > 1.0 即表示预算消耗速度超出预期,需触发 Warning 级别告警。 Critical 告警触发后,自动进入 MTTR 复盘流程(第 4 章详述)。

3.4 多窗口滑动计算与 SLO 违约判定

单一时间窗口的 SLO 计算容易受短期波动影响。我们采用多窗口滑动计算机制,同时追踪 1 小时、7 天、30 天三个窗口的 SLO 状态:

窗口类型 用途 违约判定条件 告警灵敏度
1 小时滑动窗口 实时异常检测 当前小时错误率 > (1 - SLO) × 3 高(分钟级)
7 天滑动窗口 短期趋势评估 7 天累计错误预算消耗 > 80% 中(小时级)
30 天滑动窗口 SLO 合规判定 30 天累计错误预算耗尽 低(天级)

SLO 违约判定逻辑:

IF (30 天窗口错误预算剩余 ≤ 0) THEN
    触发 SLO 违约事件
    自动生成复盘工单
    计算 MTTR 并关联违约时间线
ELSE IF (7 天窗口消耗率 > 1.2) THEN
    触发 Warning 告警
    通知 SRE 值班团队
ELSE IF (1 小时窗口错误率 > 阈值) THEN
    触发 Info 告警
    记录异常事件
END IF
实战要点: 30 天窗口的 SLO 违约是“硬性违约”,通常对应业务合同中的 SLA 处罚条款。7 天窗口的消耗率告警是“软性预警”,用于提前干预。1 小时窗口用于快速发现突发故障。
多窗口滑动 SLO 计算架构 请求日志流 1h 滑动窗口 7d 滑动窗口 30d 滑动窗口 聚合判定引擎 消耗率 > 阈值? 预算剩余 ≤ 0? 错误率超限? 告警 / 复盘工单 / MTTR 📌 三个窗口独立计算,聚合判定引擎采用“或”逻辑:任一窗口触发阈值即产生对应级别告警。 30 天窗口违约是唯一触发“SLO 违约事件”的条件,其余窗口仅用于预警。

3.5 错误预算的自动化告警配置

在 Prometheus 中,我们可以通过以下 Recording Rules 实现错误预算的自动化计算与告警:

# 计算 30 天窗口的错误预算消耗率
- record: job:slo_error_budget_consumption_rate:ratio_30d
  expr: |
    (
      1 - (
        sum(rate(http_requests_total{status=~"5.."}[30d]))
        /
        sum(rate(http_requests_total[30d]))
      )
    ) / (1 - 0.999)  # SLO = 99.9%

# 告警规则:消耗率超过 1.2 触发 Warning
- alert: ErrorBudgetConsumptionRateHigh
  expr: job:slo_error_budget_consumption_rate:ratio_30d > 1.2
  for: 5m
  labels:
    severity: warning
  annotations:
    summary: "错误预算消耗率过高 ({{ $value | humanize }})"
    description: "服务 {{ $labels.job }} 的错误预算消耗率已达 {{ $value | humanize }},请及时排查。"

# 告警规则:错误预算耗尽触发 Critical
- alert: ErrorBudgetExhausted
  expr: |
    (
      sum(rate(http_requests_total{status=~"5.."}[30d]))
      /
      sum(rate(http_requests_total[30d]))
    ) > (1 - 0.999)
  for: 10m
  labels:
    severity: critical
  annotations:
    summary: "错误预算已耗尽"
    description: "服务 {{ $labels.job }} 的 30 天错误预算已耗尽,SLO 违约事件已触发。"
自动化集成: 上述告警触发后,可通过 Webhook 自动创建 Jira 工单、发送 PagerDuty 通知、并触发 MTTR 复盘流程的初始化。我们将在第 4 章详细讲解告警到复盘的完整链路。

3.6 本章小结

  • SLO 阈值设定 必须基于业务重要性分级,L1-L4 对应 99.99% 到 99.5%,避免一刀切。
  • 错误预算 是 SLO 的量化表达,公式为:总时间 × (1 - SLO),用于平衡可靠性与创新。
  • 消耗率告警 比剩余预算告警更灵敏,三级阈值(0.8/1.2/1.5)实现分级响应。
  • 多窗口滑动计算 结合 1h/7d/30d 窗口,兼顾实时性与合规性。
  • 自动化告警配置 通过 Prometheus Recording Rules 实现,为后续 MTTR 复盘提供数据基础。