三个概念
SLI(Service Level Indicator,服务水平指标)
你要测量什么? 一个具体的、可量化的指标。
例如:
- 请求的成功率;
- 响应时间低于 200ms 的请求比例;
- 数据处理的延迟。
SLO(Service Level Objective,服务水平目标)
你要达到什么水平? SLI 的目标值。
例如:
- "99.9% 的请求在 500ms 内返回";
- "月度可用性 99.95%"。
SLA(Service Level Agreement,服务水平协议)
如果达不到,会有什么后果? 一个有商业/法律后果的承诺。
通常是与客户签订的合同:达不到 SLO 就退款、赔偿。
关系
SLI 是测量,SLO 是内部目标,SLA 是对外承诺。
一个常见的实践:
SLA 的承诺应该比 SLO 更宽松。
例如:内部 SLO 是 99.95%,对客户的 SLA 是 99.9%。
这样 SLO 提供了一个缓冲——当指标开始下滑时,团队在违反 SLA(触发赔偿)之前就能收到告警并介入。
选择好的 SLI
原则:从用户视角出发。
用户不关心"CPU 使用率"或"数据库连接数"——他们关心:
- 请求是否成功;
- 是否够快;
- 功能是否可用。
常见的 SLI 类型:
- 可用性:成功请求数 / 总请求数;
- 延迟:低于阈值 X 的请求占比(注意:用分位数或占比,而不是平均值——前文提到过平均值的误导性);
- 质量:如"返回完整结果而非降级结果"的比例;
- 吞吐量:系统能处理的 QPS;
- 新鲜度:数据的更新延迟(对数据管道重要)。
设定 SLO 的原则
一、不是越高越好
把可用性从 99.9% 提到 99.99%,成本可能增加数倍(需要更强的冗余、更严格的变更管理、更多的运维投入)。
"几个九"的商业价值,应该与其成本权衡。
几个常见的可用性等级对应的年停机时间:
| 可用性 | 年停机时间 |
|---|---|
| 99% | 约 3.65 天 |
| 99.9% | 约 8.8 小时 |
| 99.95% | 约 4.4 小时 |
| 99.99% | 约 53 分钟 |
| 99.999% | 约 5.3 分钟 |
二、应该是一个范围,而非单点
可以定义:
- 目标:99.95%(努力方向);
- 底线:99.9%(超过就要采取行动)。
三、SLO 应该有所有者
谁负责达成?谁有权在可靠性和功能速度之间做权衡?
错误预算(Error Budget)
这是 SLO 最有价值的应用之一。
如果 SLO 是 99.9%,那么就允许 0.1% 的失败——这 0.1% 就是错误预算。
用途:
- 只要错误预算还有剩余,就可以加快发布(接受一定风险);
- 当错误预算耗尽,冻结变更,把精力转向稳定性工作。
这把"可靠性 vs 速度"的争论,变成了一个数据驱动的机制——不再靠感觉争论,而是看预算还剩多少。
与告警的关系
SLO 应该驱动告警。
基于错误预算的告警(Google SRE 提倡的 多窗口、多消耗率告警):
- 不是"错误率 > X% 就告警",而是"错误预算的消耗速度过快就告警";
- 例如:在过去 1 小时内消耗了 2% 的月度预算 → 按这个速度,预算会在 2 天内耗尽 → 告警。
为什么这样更好:
- 它关注的是"是否威胁到 SLO",而不是任意设的阈值;
- 避免了短暂波动造成的误报;
- 也避免了长期缓慢劣化被忽略(用一个长窗口捕捉)。
一个常见错误
"我们的 SLO 是 100% 可用。"
这是不可能的,也是有害的——因为:
- 任何系统都会失败;
- 追求 100% 会让团队不敢做任何变更(因为任何变更都有风险);
- 反而降低了交付速度和长期质量。
更好的表述:"我们的目标是 99.9%,并且我们有明确的错误预算管理流程。"
一句话
SLO 把"系统要稳定"这个模糊的愿望,变成了一个可度量、可管理、可用于决策的工具。
说明:本文为 SRE 实践的知识整理。