正在加载,请稍候…

SRE基础:SLO、错误预算与可靠性工程

应用SRE原则提升服务可靠性。定义SLI、SLO和SLA,计算错误预算,基于SLO燃烧速率构建告警,并做出数据驱动的可靠性决策。

SRE基础:SLO、错误预算与可靠性工程

SRE基础:SLO与错误预算

SLI、SLO与SLA

SLI(服务等级指标):服务行为的量化度量
  示例:请求延迟、错误率、可用性、吞吐量

SLO(服务等级目标):SLI的目标值
  示例:99.9%的请求在30天内响应时间<500ms

SLA(服务等级协议):具有后果的法律/商业合同
  SLO是内部目标;SLA是对客户的承诺
  SLO应比SLA更严格(为事故留出缓冲)

SRE基础:SLO、错误预算与可靠性工程示意图

定义良好的SLI

# 可用性SLI
sli:
  name: api_availability
  description: 成功HTTP响应与总请求的比率
  formula: count(http_requests{status!~"5.."}) / count(http_requests)

# 延迟SLI
sli:
  name: api_latency
  description: 快于阈值的请求比例
  formula: histogram_quantile(0.99, http_request_duration_seconds)
  threshold: 500ms

# 良好的SLI:
# - 可直接测量
# - 与用户满意度成正比
# - 数量不宜过多(每个服务3-5个)

设定SLO

常见的SLO级别:
  99%    = 每月7.3小时停机时间(3个9)
  99.9%  = 每月43.8分钟(3.5个9)
  99.95% = 每月21.9分钟
  99.99% = 每月4.3分钟(4个9)

从保守开始:
  1. 测量当前性能
  2. 将SLO设定为当前性能的95%
  3. 随着可靠性提升逐步收紧

SLO示例:
  - 99.9%的结账请求成功
  - 99.5%的API响应时间<200ms(P99)
  - 错误率<0.1%(1小时平均值)

SRE基础:SLO、错误预算与可靠性工程示意图

错误预算

错误预算 = 1 - SLO

SLO = 99.9%可用性
错误预算 = 0.1% = 每月43.8分钟

如果发生了20分钟停机:
  已消耗:20/43.8 = 45.6%的预算
  剩余:54.4%(23.8分钟)

基于预算的策略:
  > 50%剩余:自由部署,进行实验
  < 50%剩余:放缓发布,聚焦可靠性
  预算耗尽:冻结功能,仅做可靠性工作

基于Prometheus的SLO监控

# SLO:99.9%可用性,30天窗口
# 用于高效查询的记录规则
groups:
- name: slo_rules
  interval: 30s
  rules:
  # 1分钟错误率
  - record: slo:api_errors:rate1m
    expr: rate(http_requests_total{status=~"5.."}[1m]) / rate(http_requests_total[1m])

  # 1小时错误率
  - record: slo:api_errors:rate1h
    expr: rate(http_requests_total{status=~"5.."}[1h]) / rate(http_requests_total[1h])

  # 30天可用性
  - record: slo:api_availability:30d
    expr: 1 - (rate(http_requests_total{status=~"5.."}[30d]) / rate(http_requests_total[30d]))

SRE基础:SLO、错误预算与可靠性工程示意图

燃烧速率告警

# 多窗口、多燃烧速率告警
# 当错误预算消耗过快时告警
groups:
- name: slo_alerts
  rules:
  # 快速燃烧:1小时内消耗2%预算(立即分页)
  - alert: SLOBurnRateFast
    expr: |
      (slo:api_errors:rate1h > 14.4 * 0.001)  # 14.4倍燃烧速率
      and
      (slo:api_errors:rate5m > 14.4 * 0.001)
    for: 2m
    labels:
      severity: critical
    annotations:
      summary: "SLO以14倍速率燃烧 - 1小时内耗尽预算"

  # 慢速燃烧:6小时内消耗5%预算(工单)
  - alert: SLOBurnRateSlow
    expr: |
      (slo:api_errors:rate6h > 6 * 0.001)
      and
      (slo:api_errors:rate30m > 6 * 0.001)
    for: 15m
    labels:
      severity: warning
    annotations:
      summary: "SLO以6倍速率燃烧 - 5天内耗尽预算"

错误预算策略

## 错误预算策略

**SLO**:99.9% API可用性(每月43.8分钟预算)

**预算健康时(剩余>50%)**:
- 每天多次部署
- 运行实验和A/B测试
- 接受新功能带来的可靠性风险

**预算有风险时(剩余10-50%)**:
- 代码冻结,除非关键修复
- 基础设施变更需双重审查
- 对重大事故进行事后复盘

**预算耗尽时(剩余<0%)**:
- 完全冻结功能
- 所有工程时间投入可靠性
- 每周与工程领导层评审

SLO将可靠性从一种感觉转变为可衡量的工程约束。