4. SLO 与错误预算概念:SLI/SLO/SLA 定义、错误预算计算、燃烧速率与告警规则
在可观测性与站点可靠性工程(SRE)体系中,SLO(Service Level Objective) 与 错误预算(Error Budget) 是连接技术指标与业务决策的核心桥梁。本章将系统梳理 SLI/SLO/SLA 的定义层次、错误预算的数学计算模型、燃烧速率(Burn Rate)的告警触发逻辑,以及如何在多集群与多租户场景下落地这些概念。
4.1 SLI / SLO / SLA 定义与层次关系
三个概念构成从技术测量到商业承诺的递进关系:
| 术语 | 全称 | 定义 | 典型示例 |
|---|---|---|---|
| SLI | Service Level Indicator | 服务质量的量化指标,直接测量 | 请求延迟 P99 ≤ 200ms;请求成功率 ≥ 99.9% |
| SLO | Service Level Objective | 对 SLI 设定的目标阈值,内部承诺 | 月度 P99 延迟 ≤ 200ms 达成率 99.5% |
| SLA | Service Level Agreement | 对外部客户或租户的正式承诺,含惩罚条款 | 月度可用性 ≥ 99.9%,否则退还 10% 费用 |
关键原则:SLO 必须比 SLA 更严格(通常严格 1~2 个数量级),为内部留出容错空间。例如 SLA 承诺 99.9%,SLO 应设为 99.95% 或更高。
下图展示了 SLI → SLO → SLA 的层次关系与数据流向:
4.2 错误预算计算模型
错误预算(Error Budget)是 SLO 的衍生概念,定义为 1 - SLO,代表服务在给定时间窗口内允许的最大不可用或错误量。其核心公式如下:
错误预算 = 总时间窗口 × (1 - SLO)
示例(月度 99.9% SLO):
总时间窗口 = 30 天 × 24 小时 × 60 分钟 × 60 秒 = 2,592,000 秒
错误预算 = 2,592,000 × (1 - 0.999) = 2,592 秒 ≈ 43.2 分钟
错误预算的消耗与剩余状态直接驱动运维决策:
- 预算充足(剩余 > 50%):允许正常发布、实验性变更。
- 预算紧张(剩余 10%~50%):限制高风险变更,启动人工审核。
- 预算耗尽(剩余 ≤ 10%):冻结所有变更,进入紧急修复模式。
多租户场景注意:每个租户应有独立的错误预算计算窗口。全局 SLO 达标不代表所有租户都健康,必须按租户边界拆分错误预算。
4.3 燃烧速率(Burn Rate)与告警规则
燃烧速率衡量错误预算消耗的速度,定义为:
燃烧速率 = 实际错误率 / 允许错误率
允许错误率 = 1 - SLO
实际错误率 = 错误请求数 / 总请求数
示例(SLO = 99.9%,实际错误率 = 0.2%):
允许错误率 = 0.1%
燃烧速率 = 0.2% / 0.1% = 2x
燃烧速率告警是 SRE 推荐的多窗口告警策略,通过短窗口和长窗口的组合检测异常:
| 告警级别 | 燃烧速率 | 时间窗口 | 触发条件 | 响应动作 |
|---|---|---|---|---|
| Page(紧急) | ≥ 14.4x | 5 分钟 | 5 分钟内消耗 2% 月度预算 | 立即响应,on-call 介入 |
| Ticket(告警) | ≥ 6x | 30 分钟 | 30 分钟内消耗 5% 月度预算 | 创建工单,日间处理 |
| Warning(警告) | ≥ 1x | 6 小时 | 6 小时内消耗 25% 月度预算 | 记录事件,观察趋势 |
下图展示了燃烧速率告警的触发逻辑与时间窗口关系:
4.4 多集群与多租户场景下的 SLO 设计
在 Helm 面板化呈现多集群拓扑时,SLO 与错误预算需要按以下维度拆分:
- 集群维度:每个集群独立计算 SLO 和错误预算,避免一个集群的故障影响全局视图。
- 租户维度:每个租户(Namespace / 项目)拥有独立的 SLI 采集和 SLO 目标,支持租户边界隔离。
- 服务维度:关键服务(如 API Gateway、数据库)单独设置 SLO,与基础设施 SLO 分层。
实践建议:在 Helm Chart 中通过 values.yaml 定义每个租户的 SLO 配置,使用 Prometheus ServiceMonitor 按标签(cluster、tenant、service)聚合 SLI 数据,再通过 Grafana 面板展示错误预算燃烧速率。
4.5 错误预算告警规则示例(Prometheus)
以下 PromQL 示例展示了基于燃烧速率的告警规则,适用于多租户场景:
# 紧急告警:5 分钟窗口燃烧速率 ≥ 14.4x
- alert: HighBurnRate
expr: |
(
1 - (
sum(rate(http_requests_total{status=~"5.."}[5m]))
/
sum(rate(http_requests_total[5m]))
)
) / (1 - 0.999) > 14.4
for: 2m
labels:
severity: page
annotations:
summary: "燃烧速率过高({{ $value | humanize }}x)"
description: "租户 {{ $labels.tenant }} 在集群 {{ $labels.cluster }} 上错误预算快速消耗。"
# 警告告警:6 小时窗口燃烧速率 ≥ 1x
- alert: LowBurnRate
expr: |
(
1 - (
sum(rate(http_requests_total{status=~"5.."}[6h]))
/
sum(rate(http_requests_total[6h]))
)
) / (1 - 0.999) > 1
for: 10m
labels:
severity: warning
annotations:
summary: "持续低燃烧速率({{ $value | humanize }}x)"
description: "租户 {{ $labels.tenant }} 在 6 小时内消耗了超过 25% 的月度错误预算。"
关键参数说明:
•
•
• 标签
•
1 - 0.999 对应 SLO = 99.9% 的允许错误率(0.001)。•
for: 2m 防止瞬时抖动误触发告警。• 标签
$labels.tenant 和 $labels.cluster 由 Prometheus 自动注入,实现多租户路由。
4.6 本章小结
- SLI 是原始测量指标,SLO 是内部目标,SLA 是对外承诺,三者层层递进。
- 错误预算 = 总时间窗口 × (1 - SLO),是服务健康度的量化货币。
- 燃烧速率 = 实际错误率 / 允许错误率,多窗口告警策略(5min / 30min / 6h)平衡灵敏度与稳定性。
- 在多集群与多租户场景下,必须按 集群 × 租户 × 服务 维度拆分 SLO 和错误预算,实现精细化可观测性。