--- tags: [microservice, sre, slo, error-budget, postmortem] create time: 2026-05-05 --- # SRE 实践 ## 概述 站点可靠性工程 (SRE) 把运维问题看作**软件工程问题**。它的核心理念是用 SLI/SLO/SLA 来量化服务质量,避免"我觉得系统很慢"这类模糊描述。 ```mermaid flowchart LR User["用户体验"] --> SLI{"实际测量"} SLI -->|"达标"| SLO_OK["✅ SLO 达成"] SLI -->|"不达标"| Budget["消耗错误预算"] Budget --> Left{"预算剩余?"} Left -- "> 50%" --> Ship["快速迭代 🚀"] Left -- "< 10%" --> Stabilize["稳定优先 ❄️"] style User fill:#e3f2fd style SLO_OK fill:#e8f5e9 style Ship fill:#fff3e0 style Stabilize fill:#ffebee ``` ## SLI / SLO / SLA 详解 ### 三层模型 | 术语 | 全称 | 定义 | 谁制定 | 变更频率 | |------|------|------|--------|---------| | **SLI** | Service Level Indicator | 实际度量:用户请求的成功率是多少? | 观测系统自动产出 | 持续更新 | | **SLO** | Service Level Objective | 内部目标:我们承诺达到 99.9% 可用性 | SRE + 研发 | 季度回顾 | | **SLA** | Service Level Agreement | 对外契约:达不到就赔钱 | 法务 + 商务 | 按合同约定 | ### 实用性比例对照表 | SLO | 每年停机时间 | 每月停机时间 | 适用级别 | |-----|-------------|-------------|---------| | **99%** | ~87.6 小时 | ~7.2 小时 | 内部工具(几乎无意义) | | **99.9% ("三个九")** | ~8.76 小时 | ~43 分钟 | 大多数后端服务 ✅ | | **99.95%** | ~4.38 小时 | ~21 分钟 | 核心交易链路 | | **99.99% ("四个九")** | ~52.6 分钟 | ~4.3 分钟 | 金融级 / 支付系统 | | **99.999%** | ~5.26 分钟 | ~26 秒 | 电信级,极难实现 | > [!warning] "三个九"是底线 > > 如果团队宣称 SLO = 99%,这意味着每月可以容忍近 **7 小时的不可用**——这在生产环境中基本等于没有可用性目标。 ## Error Budget (错误预算) 深度解析 ### 计算方式 ``` 可用率 = (总时间 - 故障时间) / 总时间 × 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 分钟 ``` ### 基于错误预算的决策矩阵 ```mermaid flowchart TD Ratio["错误预算使用率 = 已消耗 / 总预算"] Ratio -- "< 50%" --> Green["🟢 绿灯阶段
预算充足: 可以大胆发布
新功能、尝试激进方案
常规发布节奏"] Ratio -- "50~90%" --> Yellow["🟡 黄灯阶段
预算紧张: 收紧发布频率
增加人工审查
暂停非关键功能开发"] Ratio -- "\> 90%" --> Orange["🟠 橙灯阶段
严重不足: 冻结发布
专注稳定性修复
全员 On-Call"] Ratio -- "\> 100%" --> Red["🔴 红灯阶段
预算耗尽: 禁止所有
功能性变更
SLO 事故复盘"] style Green fill:#c8e6c9 style Yellow fill:#fff9c4 style Orange fill:#ffe0b2 style Red fill:#ffcdd2 ``` ### 错误预算告警联动 ```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 已破线,冻结非紧急变更" ``` ## SRE 心法 1. **用户视角定义 SLO** — 不是"API P99 < 200ms",而是"用户在正常网络下加载页面 < 2s" 2. **错误预算用完 = 停止功能开发** — 全力修 bug、加稳定性 3. **Blameless Postmortem** — 不问"谁干的",问"流程哪里可以改进" 4. **自动化一切重复劳动** — 手动操作一定会出错 5. **接受一定程度的失败** — 在可控范围内快速迭代,比追求完美更重要 ## Blameless Postmortem 模板 | 字段 | 填写内容 | |------|---------| | **事件名称** | `2026-05-05 支付服务超时事故` | | **影响范围** | 约 15% 的支付请求失败,持续 23 分钟 | | **发现时间** | 14:32 (On-Call 接到告警) | | **恢复时间** | 14:55 (回滚后确认恢复) | | **根本原因** | 某次变更后支付网关的连接池大小从 50 降到 10 | | **时间线** | 14:00 发布 v1.2.3 → 14:30 错误率开始升高 → 14:32 收到告警 → 14:35 开始排查 → 14:45 定位根因 → 14:50 回滚 → 14:55 完全恢复 | | **改进行动** | ① 连接池参数变动必须经过压测验证;② 监控中补充连接池活跃数指标 | | **跟进人** | @zhangsan (行动 ①)、@lisi (行动 ②) | ## SRE Metrics 看板 除了 SLO,SRE 还需要关注以下运营指标: | 指标 | 说明 | 目标 | |------|------|------| | **MTTR** | Mean Time To Recovery | 核心服务 < 30min | | **Change Failure Rate** | 变更导致故障的比例 | < 5% | | **Lead Time for Changes** | 代码提交到上线的时间 | < 2h | | **Deployment Frequency** | 日均部署次数 | > 5 (大规模团队) | > [!tip] DORA Metrics > > Google 提出的四大 DevOps 指标,广泛用于评估工程效能: > - **部署频率** — 交付速度 > - **变更前置时间** — 从代码提交到生产部署需要多久 > - **变更失败率** — 多少部署导致了故障或回滚 > - **MTTR** — 恢复服务的平均时间 ## 关联笔记 - [[04-可观测性/04-告警管理]] — SLO/Error Budget 与告警体系的联动 - [[05-部署运维/02-Kubernetes]] — K8s HPA 弹性伸缩支撑 SLO 保障 - [[05-部署运维/03-CICD与GitOps]] — GitOps 支持安全的持续交付