Files
cs-note/hhs/MS/05-部署运维/04-SRE实践/02-错误预算深度解析.md
T
2026-05-24 11:42:38 +08:00

114 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
tags: [sre, error-budget, budget-allocation, sre-alerting]
create time: 2026-05-18 00:50
---
# Error Budget 深度解析 — 稳定性与速度的平衡杠杆
## 概述
Error Budget(错误预算)是 SRE 体系中最具实操价值的概念之一。它将抽象的"SLO 目标"转化为具体的可消耗量,为产品迭代的快慢提供量化依据。更多背景见 [[../04-SRE实践/01-SLI-SLO-SLA详解]]。
## 计算方式
```
可用率 = (总时间 - 故障时间) / 总时间 × 100%
错误预算 = 1 - SLO
SLO = 99.9% → 错误预算 = 0.001
每月可容忍故障 = 30 × 24 × 60 × 0.001 = 43.2 分钟
每周可容忍故障 = 7 × 24 × 60 × 0.001 = 10.1 分钟
SLO = 99.99% → 错误预算 = 0.0001
每月可容忍故障 ≈ 4.3 分钟
```
> [!tip] 理解错误预算的本质
>
> 错误预算不是"允许出错的额度",而是"**允许不完美的空间**"。它回答了一个关键问题:在当前的可靠性要求下,团队还能冒多大的风险?
## 基于错误预算的决策矩阵
```mermaid
flowchart TD
Ratio["错误预算使用率 = 已消耗 / 总预算"]
Ratio -- "< 50%" --> Green["🟢 绿灯阶段<br/>预算充足: 可以大胆发布<br/>新功能、尝试激进方案<br/>常规发布节奏"]
Ratio -- "50~90%" --> Yellow["🟡 黄灯阶段<br/>预算紧张: 收紧发布频率<br/>增加人工审查<br/>暂停非关键功能开发"]
Ratio -- "\> 90%" --> Orange["🟠 橙灯阶段<br/>严重不足: 冻结发布<br/>专注稳定性修复<br/>全员 On-Call"]
Ratio -- "\> 100%" --> Red["🔴 红灯阶段<br/>预算耗尽: 禁止所有<br/>功能性变更<br/>SLO 事故复盘"]
style Green fill:#c8e6c9
style Yellow fill:#fff9c4
style Orange fill:#ffe0b2
style Red fill:#ffcdd2
```
### 各阶段的典型行动清单
| 阶段 | 功能发布 | 技术债处理 | 人员安排 |
|------|---------|-----------|---------|
| 🟢 绿灯 | 正常节奏 | 按计划推进 | 按需 On-Call |
| 🟡 黄灯 | 减少 50%,需额外审批 | 启动专项清理 | 增加第二响应人 |
| 🟠 橙灯 | 冻结(仅 Hotfix) | 全员投入修复 | 负责人值班 |
| 🔴 红灯 | 全面冻结 | Postmortem + 专项改进 | 全员待命 |
## 错误预算告警联动
```yaml
# Prometheus 告警规则示例
groups:
- name: error-budget
rules:
- alert: ErrorBudgetBurnRateHigh
expr: |
sum(rate(http_requests_total{status=~"5.."}[1h])) /
sum(rate(http_requests_total[1h])) > 0.001
for: 1h
labels:
severity: warning
budget_phase: yellow
annotations:
summary: "错误预算消耗加速"
message: "当前错误率 {{ $value }}% > SLO 阈值 0.1%"
- alert: ErrorBudgetExhausted
expr: |
(sum(rate(http_requests_total{status=~"5.."}[24h])) /
sum(rate(http_requests_total[24h]))) >= 0.001
labels:
severity: critical
budget_phase: red
annotations:
summary: "错误预算已耗尽!"
message: "本月 SLO 已破线,冻结非紧急变更"
```
> [!info] Multi-window Burn Rate Alerting
>
> Google SRE 推荐的做法是使用**两个窗口**来检测预算消耗速度:
> - **短窗口(1h/5m)**:检测突发大量错误的情况(立即触发黄灯)
> - **长窗口(半天/一天)**:检测慢性缓慢泄漏的情况(防止温水煮青蛙)
>
> 只有当两个窗口同时超限时才亮红灯,这样可以避免误报导致的警报疲劳。
## 补充:多服务 Error Budget 管理策略
当集群中有几十上百个服务时,不能把所有预算分配给同一个 SLO。推荐分层策略:
| 层级 | 示例 | 预算分配 |
|------|------|---------|
| P0 核心链路 | 支付、登录 | 99.99% → 极低容错 |
| P1 重要服务 | 订单、搜索 | 99.95% → 中等容错 |
| P2 一般服务 | 后台管理、报表 | 99.9% → 较高容错 |
> [!tip] Error Budget 分配实战技巧
>
> 将月度预算**均匀摊分到每周**作为基线。例如月预算 43 分钟 → 每周预算约 10 分钟。这比月末一次性清算更有操作性——你可以在周报中直接看到本周预算余量。
## 关联笔记
- [[../04-SRE实践/01-SLI-SLO-SLA详解]] — SLI/SLO/SLA 三层模型基础
- [[../04-SRE实践/03-SRE心法与事故复盘]] — Blameless Postmortem 模板
- [[../hhs/MS/05-部署运维/02-Kubernetes]] — K8s HPA 弹性伸缩支撑 SLO 保障