SLO 定义
定义把技术可靠性与用户幸福绑定的可测服务等级目标。
为什么
SLO 是使可靠性与速度权衡显式的数字。没有它,每队优化 100% 可用性,意味着无风险部署、无新功能、产品慢 — 或鲁莽部署而可靠性是感觉。有 99.9% over 28 天 SLO,团队得每月 43 分钟宕机错误预算:可花在部署、功能开关或实验上,只要未超预算产品速度不受限。预算烧完则部署冻结直到可靠性恢复。这把"该发布吗?"从政治争论变算术检查,这是 SRE 对组织最大贡献。
何时使用
当服务到生产且有用户时。每个面向用户服务从一个 SLO 开始;成熟后加更多。
如何做
1. 识别用户旅程及其 SLI - SLI = "好事件 / 总事件"(如成功结账 / 尝试结账) - 选失败 = "服务挂了"对用户而言的旅程 2. 设 SLO 目标和窗口 - 目标:99.9%(从这里开始;99.99% 花约 10 倍更多) - 窗口:28 天(长到平滑噪声,短到可行动) - 错误预算 = (1 - 0.999) × 28 天 = 43.2 分钟允许宕机 3. 定义 SLI 测量 - "成功" = HTTP 200 + 业务成功(订单真创建,非仅 200) - 从用户边缘测(RUM/合成),非服务器内部视图 4. 使预算可行动 - 燃烧率 >2x → 冻结风险部署,专注可靠性 - 燃烧率 <0.5x → 自由部署,有余量 - 向全队发布预算使非秘密 5. 季度审查调整 - 从不烧预算 → SLO 太松,收紧(或发布更多) - 总烧预算 → SLO 太紧,放松(或投资可靠性)
示例
# SLO:28 天 99.9% 结账尝试成功
slo:
service: checkout
sli: "successful_checkouts / attempted_checkouts"
target: 0.999
window: 28d
error_budget: 43.2m # (1 - 0.999) * 28d
# SLI 测量(Prometheus):
# successful = rate(http_requests_total{service="checkout",status="200",order_created="true"}[5m])
# total = rate(http_requests_total{service="checkout"}[5m])
# sli = successful / total
# 燃烧率告警:
# burn = (1 - sli) / (1 - 0.999)
# burn > 2 持续 1h → page(2x 快烧预算)
# burn > 1 持续 6h → 工单(1x 烧,慢性)
# 策略:
# 若 burn > 2 → 部署冻结(仅修复,无功能)直到 burn < 1
# 若 burn < 0.5 → 自由部署(风险变更有余量)常见问题
- ⚠SLO 设 100% — 零错误预算,每次部署是可靠性风险且速度归零;99.9% 是理智起点。
- ⚠从服务器内部视图(HTTP 200)测 SLI 而非用户边缘 — 200 但业务结果坏(订单未创建)算成功。
- ⚠SLO 无预算策略 — 数字存在但烧完无变化;价值在部署冻结策略非目标。
- ⚠每服务太多 SLO — 5 个 SLO 意味 5 个预算跟踪且无清晰信号;从一个开始,仅当第二旅程独立重要时加。
最佳实践
- ✓从 99.9% over 28 天开始 — 这给 43 分钟月错误预算平衡可靠性和速度;仅当用户要求时收紧。
- ✓从用户边缘(RUM 或合成)测 SLI,计业务成功非仅 HTTP 200 — 服务器视图藏用户可见失败。
- ✓使错误预算可行动:燃烧 >2x 冻结部署,<0.5x 允许风险变更 — 策略是价值非数字。
- ✓季度审查 SLO:从不烧预算则太松,总烧则太紧 — 从真实用户行为校准。