2. SLO 设计原则:如何定义有效的 SLO

SLO(Service Level Objective)是服务等级目标,是连接用户期望与系统行为的量化桥梁。一个无效的 SLO 会导致错误预算形同虚设,自愈剧本要么过度触发,要么永远沉默。本节从目标值设定、燃烧速率与错误预算三个维度,拆解有效 SLO 的设计原则。

2.1 目标值设定:从用户旅程反推阈值

SLO 的目标值不应来自“系统能跑多快”,而应来自“用户能忍受多慢”。设计步骤:

  1. 识别关键用户旅程:登录、搜索、下单、支付等核心流程。
  2. 定义良好事件(Good Event):请求成功且延迟在阈值内。
  3. 设定目标窗口:通常为 30 天滑动窗口。
  4. 确定目标百分比:常见值为 99.9%、99.95%、99.99%。
经验法则:SLO 目标值应比用户实际容忍度宽松 10%-20%。例如用户能接受 500ms 延迟,SLO 可设为 99.9% 请求在 400ms 内完成,留出缓冲避免频繁告警。
服务类型 典型 SLO 用户容忍度参考 错误预算(30天)
关键 API(支付/登录) 99.99% 延迟 < 200ms 4.32 分钟
核心业务(搜索/推荐) 99.9% 延迟 < 500ms 43.2 分钟
非关键(历史记录/报表) 99.5% 延迟 < 2s 3.6 小时

2.2 燃烧速率:错误预算的消耗速度

燃烧速率(Burn Rate)衡量错误预算消耗的快慢。它直接决定自愈剧本的触发时机与紧急程度。

燃烧速率公式:

Burn Rate = (1 - 实际 SLI) / (1 - SLO 目标)

例如:SLO 目标为 99.9%,实际 SLI 为 99.7%,则 Burn Rate = (1 - 0.997) / (1 - 0.999) = 0.003 / 0.001 = 3。意味着错误预算消耗速度是预期的 3 倍。

关键阈值:
  • Burn Rate < 1:健康状态,无需干预。
  • 1 ≤ Burn Rate < 2:轻度消耗,可触发低优先级自愈。
  • 2 ≤ Burn Rate < 5:中度消耗,触发中优先级自愈。
  • Burn Rate ≥ 5:严重消耗,触发高优先级自愈或人工介入。
燃烧速率与错误预算消耗关系 燃烧速率与错误预算消耗关系 时间(30天滑动窗口) 错误预算剩余 (%) Burn Rate = 0.5(健康) Burn Rate = 1.5(轻度) Burn Rate = 4(严重) 错误预算耗尽线 曲线越陡,错误预算消耗越快,自愈剧本触发优先级越高

2.3 错误预算:自愈剧本的“弹药”

错误预算 = (1 - SLO 目标) × 时间窗口。它是系统允许的“犯错时间”。自愈剧本的灰度执行策略必须围绕错误预算的剩余量动态调整。

错误预算状态与自愈策略对照表:

错误预算剩余 状态 自愈剧本执行策略 灰度比例
> 80% 充裕 仅执行低风险自愈(日志清理、缓存预热) 1% 流量
50% - 80% 正常 执行常规自愈(重启、限流、降级) 5% 流量
20% - 50% 紧张 执行高风险自愈(扩容、切流、回滚) 10% 流量
< 20% 危急 停止自愈,人工介入 0%(全量人工)
常见陷阱:不要将错误预算视为“可以浪费的资源”。频繁消耗错误预算会导致自愈剧本在真正需要时失去灰度空间。建议设置“错误预算警戒线”(如剩余 30%),提前触发人工复盘。

2.4 多指标 SLO 组合设计

单一 SLO 无法覆盖系统全貌。推荐使用 SLI 黄金信号 组合:

  • 延迟(Latency):请求响应时间,通常取 p50/p95/p99。
  • 流量(Traffic):QPS、RPS、并发连接数。
  • 错误(Errors):HTTP 5xx、超时、业务错误码。
  • 饱和度(Saturation):CPU、内存、连接池使用率。

组合示例:

# 支付服务 SLO 组合
slo_payment:
  latency_p99: 99.9% 请求 < 200ms
  error_rate: 99.99% 请求无 5xx
  saturation: CPU 使用率 < 80%
  window: 30d

当任一指标违反 SLO 时,错误预算独立计算,自愈剧本根据最差指标触发。

多指标 SLO 组合与自愈触发逻辑 多指标 SLO 组合与自愈触发逻辑 延迟 (Latency) 流量 (Traffic) 错误 (Errors) 饱和度 (Saturation) 独立错误预算计算(30天滑动窗口) 自愈触发:取最差指标 灰度执行自愈剧本 每个 SLI 独立计算错误预算,自愈剧本以最差指标为准触发灰度执行

2.5 设计检查清单

在定义 SLO 时,逐项核对以下问题:

  • 用户视角:SLO 是否反映真实用户体验?
  • 可测量性:SLI 是否可以从现有监控系统直接获取?
  • 目标合理性:SLO 是否比用户容忍度宽松 10%-20%?
  • 窗口选择:滑动窗口是否足够长以过滤毛刺,又足够短以反映近期状态?
  • 错误预算联动:自愈剧本的灰度比例是否与错误预算剩余量挂钩?
  • 多指标覆盖:是否覆盖延迟、流量、错误、饱和度四个黄金信号?
核心结论:有效的 SLO 是自愈剧本灰度执行的“红绿灯”。目标值设定决定绿灯范围,燃烧速率指示黄灯预警,错误预算剩余量控制红灯触发。三者联动,才能让自愈系统既不过度敏感,也不反应迟钝。