SLA/SLO/SLI 设计
核心概念
| 术语 | 全称 | 含义 | 示例 |
|---|---|---|---|
| SLI | Service Level Indicator | 服务质量指标 | 请求成功率、P99 延迟 |
| SLO | Service Level Objective | 服务质量目标 | 成功率 >= 99.9% |
| SLA | Service Level Agreement | 服务质量协议 | SLO + 违约赔偿条款 |
SLI(度量) → SLO(目标) → SLA(协议)
SLI 选择
| 服务类型 | 关键 SLI |
|---|---|
| API 服务 | 可用性(成功率)、延迟(P50/P99) |
| 存储服务 | 持久性、可用性、延迟 |
| 数据管道 | 新鲜度(数据延迟)、正确性 |
| 批处理 | 完成率、运行时长 |
SLO 设定与错误预算
错误预算 = 1 - SLO
SLO = 99.9% → 错误预算 = 0.1% → 每月允许 43.8 分钟停机
错误预算策略
- 预算充足:可以正常发布新功能、做变更
- 预算耗尽:冻结非紧急变更,专注稳定性改进
- 预算接近耗尽:减缓发布频率,加强 Code Review
Prometheus 实现 SLO 监控
PromQL 计算 SLI
# 可用性 SLI(30 天滚动窗口)
1 - (
sum(rate(http_requests_total{code=~"5.."}[30d]))
/
sum(rate(http_requests_total[30d]))
)
# 延迟 SLI(P99 < 500ms 的比例)
sum(rate(http_request_duration_seconds_bucket{le="0.5"}[30d]))
/
sum(rate(http_request_duration_seconds_count[30d]))
常见面试问题
Q1: 99.9% 和 99.99% SLA 在架构上有什么区别?
答案:
| 维度 | 99.9%(8.76h/年) | 99.99%(52min/年) |
|---|---|---|
| 部署 | 单 AZ 多副本 | 多 AZ / 同城双活 |
| 数据库 | 主从 + 自动切换 | 同步复制 + 秒级切换 |
| 发布 | 滚动更新 | 金丝雀 + Feature Flag |
| 故障恢复 | 分钟级 | 秒级自动恢复 |
| 成本 | 基础 | 2-3 倍 |
99.99% 要求消除一切单点故障,架构复杂度和成本显著提升。