1. SLO 基础概念:服务等级目标
服务等级目标(Service Level Objective, SLO)是站点可靠性工程(SRE)与可观测性实践的核心度量。它定义了一个服务在特定时间窗口内应达到的可靠性水平,通常以百分比形式表示,例如“API 请求的 99.9% 在 200ms 内完成”。
理解 SLO 需要先厘清它与 SLA、SLI 的关系,以及为什么 SLO 是可靠性工程的基石。
1.1 SLI / SLO / SLA 三角关系
三个概念构成可靠性度量的完整链路:
| 术语 | 全称 | 定义 | 典型示例 |
|---|---|---|---|
| SLI | Service Level Indicator | 服务等级指标,是实际测量的服务质量数值 | 请求延迟 P99 = 180ms |
| SLO | Service Level Objective | 服务等级目标,是期望达到的可靠性阈值 | 99.9% 请求延迟 ≤ 200ms |
| SLA | Service Level Agreement | 服务等级协议,是对外承诺的法律/商业条款 | 99.95% 可用性,否则赔偿 10% 月费 |
关键区别: SLI 是“实际值”,SLO 是“目标值”,SLA 是“承诺值”。SLO 通常比 SLA 更严格(内部目标高于对外承诺),为可靠性留出安全缓冲。
1.2 SLO 定义的核心要素
一个完整的 SLO 定义包含以下维度:
- 指标类型:可用性、延迟、吞吐量、错误率、饱和度(USE 方法)
- 测量窗口:滚动窗口(如 30 天)、日历窗口(如月度)
- 目标阈值:如 99.9%、99.99%(“多少个九”)
- 合规条件:好事件 / 总事件 ≥ 阈值
- 排除条件:计划内维护、客户端错误(4xx)是否计入
# Prometheus 中 SLO 合规率的典型计算表达式
# 以 HTTP 请求延迟为例(好事件:延迟 ≤ 200ms)
slo_compliance = (
sum(rate(http_request_duration_seconds_bucket{le="0.2"}[5m]))
/
sum(rate(http_request_duration_seconds_count[5m]))
) * 100
1.3 为什么 SLO 对可靠性至关重要
SLO 将抽象的“可靠性”转化为可量化、可追踪、可告警的工程指标,其核心价值体现在:
- 定义“足够好”:避免追求 100% 可用性的不切实际成本,明确可接受的故障边界。
- 驱动错误预算:SLO 与错误预算(Error Budget)直接挂钩——100% - SLO = 允许的故障时间,指导发布节奏与风险决策。
- 对齐业务与工程:SLO 将用户体验(如页面加载快慢)映射为技术指标,使团队聚焦对用户真正重要的维度。
- 触发自愈与告警:基于 SLO 燃烧速率(Burn Rate)的告警比静态阈值更早发现潜在故障,为自动化自愈争取时间。
SRE 最佳实践: 始终从用户视角定义 SLI 和 SLO。例如,对于 Web 服务,优先关注“首页加载延迟”而非“服务器 CPU 使用率”——前者直接影响用户感知,后者只是内部信号。
1.4 SLI → SLO → 错误预算 关系图
1.5 常见 SLO 类型与示例
| SLO 类型 | SLI 示例(Prometheus 指标) | SLO 目标 | 典型窗口 |
|---|---|---|---|
| 可用性 | up{job="api-server"} == 1 |
99.99% | 30 天滚动 |
| 延迟 | histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m])) |
P99 ≤ 200ms | 7 天滚动 |
| 错误率 | sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m])) |
< 0.1% | 1 小时 |
| 吞吐量 | sum(rate(http_requests_total[5m])) |
≥ 1000 req/s | 5 分钟 |
常见陷阱: 不要定义无法测量的 SLO。如果无法通过 Prometheus 或其他可观测性工具采集到准确的 SLI,该 SLO 就是“纸面目标”,无法用于告警或自愈。始终先确认 SLI 的可观测性,再设定 SLO。
1.6 本章小结
- SLI 是实际测量值,SLO 是内部目标,SLA 是对外承诺。
- SLO 将可靠性量化为百分比,驱动错误预算机制,平衡创新速度与系统稳定。
- 在 Prometheus 生态中,SLO 通过
histogram_quantile、rate、sum等函数计算合规率,并作为燃烧速率告警的输入。 - 良好的 SLO 定义是故障自愈机制的前提——只有知道“什么是正常”,才能自动化地“恢复正常”。