2. SLO 目标设定:如何为不同服务设定合理的 SLO 目标,错误预算的概念与计算

2.1 从 SLI 到 SLO:定义可靠性基线

SLO(Service Level Objective,服务等级目标)是围绕 SLI(Service Level Indicator,服务等级指标)设定的具体目标值。它不是“尽可能高”,而是“足够好”——在用户满意与运维成本之间找到平衡点。

核心公式:
SLO = SLI 的阈值 + 时间窗口
例:过去 30 天内,99.9% 的请求延迟 ≤ 200ms。

设定 SLO 时,必须明确三个要素:

  • 指标(What):选择哪个 SLI(延迟、错误率、吞吐量、饱和度)。
  • 阈值(How good):具体数值(如 99.9%、200ms)。
  • 窗口(When):评估周期(滚动 30 天、28 天、7 天)。

2.2 错误预算:可靠性的“货币”

错误预算(Error Budget)是 SLO 的衍生概念,它将抽象的可靠性目标转化为可量化的“失败额度”。

错误预算 = 100% - SLO
例如:SLO = 99.9%,则错误预算 = 0.1%。这意味着在评估窗口内,服务最多允许 0.1% 的请求失败。

错误预算的核心价值在于:

  • 决策依据:预算充足时,可以放心发布新功能;预算耗尽时,必须冻结变更、优先修复稳定性。
  • 量化风险:将“系统是否稳定”的模糊判断,转化为“还剩多少失败额度”的精确数字。
  • 对齐团队:开发团队与 SRE 团队基于同一份预算进行协作,避免“开发追求速度,SRE 追求稳定”的对立。

2.3 错误预算计算与消耗模型

错误预算的计算基于滚动时间窗口,常见窗口为 30 天。以下为计算示例:

参数 值 说明
SLO 目标 99.9% 可用性目标
错误预算 0.1% 允许失败的比例
窗口总请求数 10,000,000 30 天内总请求量
总错误预算 10,000 10,000,000 × 0.1%
已消耗错误 6,000 当前窗口内实际失败数
剩余错误预算 4,000 10,000 - 6,000
预算消耗率 60% 6,000 / 10,000
常见误区:错误预算不是“每天重置”,而是滚动窗口。今天的失败会影响未来 30 天的预算余额,直到该请求滑出窗口。

2.4 不同服务的 SLO 设定策略

并非所有服务都需要 99.99% 的可用性。SLO 应与服务的业务价值、用户容忍度、成本成正比。以下为典型服务的 SLO 建议:

服务类型 推荐 SLO 错误预算(30天) 用户容忍度 典型场景
核心支付/交易 99.99% 0.01%(约 4.3 分钟) 极低 银行转账、订单扣款
用户认证/登录 99.95% 0.05%(约 21.6 分钟) 低 SSO、OAuth 服务
核心 API/微服务 99.9% 0.1%(约 43.2 分钟) 中等 商品查询、订单列表
推荐/搜索 99.5% 0.5%(约 3.6 小时) 较高 首页推荐、搜索结果
日志/监控/非关键 99.0% 1.0%(约 7.2 小时) 高 内部审计、调试日志

2.5 SLO 设定流程:四步法

  1. 识别关键用户旅程:找出对用户影响最大的核心链路(如“登录→搜索→下单→支付”)。
  2. 选择关键 SLI:为每个旅程选择 1-2 个最能反映用户体验的指标(如“下单接口的 P99 延迟”)。
  3. 设定初始 SLO:基于历史数据(过去 1-3 个月)的 P99/P95 值,取略高于当前表现的目标。
  4. 迭代调整:运行 1-2 个窗口后,根据错误预算消耗速度、用户反馈、业务需求进行微调。
经验法则:初始 SLO 不要定得太高。从 99.9% 开始,逐步向 99.95%、99.99% 演进。过高的 SLO 会导致频繁告警和无效的运维投入。

2.6 SLO 与错误预算的关系图

以下 SVG 展示了 SLO、错误预算、时间窗口之间的核心关系:

SLO 与错误预算关系图 SLO 与错误预算关系模型 SLO 目标 99.9% 可用性 30 天滚动窗口 计算 错误预算 0.1% 失败额度 = 100% - SLO 消耗 预算消耗 实时追踪 预算充足(< 80%) 允许发布新功能、变更 预算耗尽(≥ 100%) 冻结变更,优先修复 关键说明: 1. SLO 设定后,错误预算自动确定,无需额外计算。 2. 预算消耗率 = 实际失败数 / 总错误预算 × 100%。 3. 当消耗率接近 100% 时,应触发告警并启动应急流程。

2.7 多层级 SLO 架构

在微服务架构中,单一 SLO 往往不够。建议采用分层 SLO 体系,从用户视角逐层分解:

多层级 SLO 架构图 多层级 SLO 分解架构 用户体验 SLO 首页加载 < 2s,成功率 ≥ 99.9% 服务 SLO(微服务级别) 商品服务 P99 200ms | 订单服务 P99 300ms | 支付服务 P99 500ms 基础设施 SLO 数据库可用性 99.99% | 网络延迟 < 5ms | 计算节点 CPU 饱和度 < 70% 原则:上层 SLO 由下层 SLO 组合推导。用户体验 SLO 不达标时,逐层排查下层服务与基础设施。 每个层级独立计算错误预算,下层预算耗尽会直接影响上层可用性。

2.8 设定 SLO 的常见陷阱

陷阱 表现 后果 正确做法
追求完美 所有服务 SLO 设为 99.999% 成本爆炸,频繁误告警 按业务重要性分级设定
忽略长尾 只关注平均延迟,忽略 P99 用户体验差,但指标好看 使用 P95/P99 作为 SLI
窗口过短 使用 1 小时或 1 天窗口 预算波动剧烈,难以决策 使用 28-30 天滚动窗口
静态不变 SLO 设定后从不调整 脱离实际业务需求 每季度复盘并微调
忽略依赖 只设定自身 SLO,不考虑下游 上游达标,下游拖垮整体 建立依赖链 SLO 级联

2.9 实践建议:从零开始设定 SLO

快速启动清单:
1. 选择 1 个核心用户旅程(如“用户下单”)。
2. 提取 2 个 SLI(成功率 + P99 延迟)。
3. 基于过去 30 天数据,取 P95 值作为初始 SLO。
4. 计算错误预算,设置 80% 消耗告警阈值。
5. 运行 2 周后,根据告警频率和用户反馈调整。

记住:SLO 不是合同,而是沟通工具。它的目的是让团队在“多快发布”和“多稳运行”之间做出有数据支撑的决策。错误预算则是这个决策的量化仪表盘。