运维

运维相关知识和内容

SRE实战:如何用SLO驱动团队建立可靠性文化并落地故障演练

SRE实战:如何用SLO驱动团队建立可靠性文化并落地故障演练

# SRE实战:如何用SLO驱动团队建立可靠性文化并落地故障演练

## 摘要

SLO不只是数字,更是团队对用户的可靠性承诺。很多团队制定了SLO却无法落地,根因在于缺少从SLO制定、错误预算消耗、告警触发到故障演练的完整闭环。

## 一、SLO体系全景

### 1.1 核心概念关系

```

SLI(指标)→ SLO(目标)→ SLA(合同)

│ │ │

可测量 可承诺 可赔偿

"延迟P99=2.3s" "P99<3s" "P99>5s赔款"

```

### 1.2 SLO制定的三条原则

1. **用户视角**:SLO应反映用户体验,而非系统内部指标

2. **少而精**:3-5个核心SLO足够,过多则无法聚焦

3. **可操作性**:每个SLO必须有对应的告警和响应预案

## 二、实战:电商系统SLO设计

### 2.1 识别关键用户旅程

| 旅程 | 占比 | 重要性 |

|------|------|--------|

| 商品浏览 | 60% | 高 |

| 下单支付 | 25% | 极高 |

| 搜索 | 10% | 高 |

| 退货 | 5% | 中 |

### 2.2 SLI指标选择

```python

# 基于OpenTelemetry的SLI指标采集

from opentelemetry import metrics

meter = metrics.get_meter("sli-collector")

# SLI 1: 可用性 - 成功请求比例

availability_counter = meter.create_counter(

name="sli.availability",

description="请求成功/失败计数",

)

# SLI 2: 延迟 - 请求处理时间

latency_histogram = meter.create_histogram(

name="sli.latency",

description="请求延迟分布",

unit="ms",

)

# SLI 3: 正确性 - 业务逻辑正确率

correctness_counter = meter.create_counter(

name="sli.correctness",

description="业务正确/错误计数",

)

```

### 2.3 SLO定义与错误预算

```yaml

# slo-rules.yaml - Prometheus规则

groups:

- name: slo-availability

rules:

# 30天滚动窗口的可用性SLO

- record: slo:availability:ratio

expr: |

sum(rate(http_requests_total{code!~"5.."}[5m]))

/

sum(rate(http_requests_total[5m]))

- record: slo:availability:error_budget:remaining

expr: |

1 - (1 - slo:availability:ratio) / (1 - 0.999)

# 0.999 = 99.9%可用性SLO

# 错误预算 = 1 - 99.9% = 0.1% = 43.2分钟/月

- alert: SLOErrorBudgetLow

expr: slo:availability:error_budget:remaining < 0.2

for: 1h

labels:

severity: warning

annotations:

summary: "错误预算剩余不足20%"

- alert: SLOErrorBudgetExhausted

expr: slo:availability:error_budget:remaining < 0

for: 5m

labels:

severity: critical

annotations:

summary: "错误预算已耗尽!"

- name: slo-latency

rules:

- record: slo:latency:p99:ratio

expr: |

histogram_quantile(0.99,

sum(rate(http_request_duration_seconds_bucket[5m]))

by (le)

)

- alert: SLOLatencyBreached

expr: slo:latency:p99:ratio > 3 # P99超过3秒

for: 10m

labels:

severity: warning

```

### 2.4 错误预算策略

| 预算状态 | 团队行动 |

|---------|---------|

| 剩余 > 50% | 正常迭代,发布新功能 |

| 20% < 剩余 < 50% | 谨慎发布,加强测试 |

| 剩余 < 20% | 暂停功能开发,专注可靠性 |

| 剩余 < 0% | 冻结发布,全团队扑在可靠性上 |

## 三、告警设计:从SLO到 actionable alert

### 3.1 告警分级

```python

class AlertPriority:

P1 = "SLO违反 + 用户影响大 → 立即响应(5分钟内)"

P2 = "SLO接近违反 → 30分钟内响应"

P3 = "趋势预警 → 当日内处理"

P4 = "信息通知 → 下个Sprint处理"

# 告警路由配置

ALERT_ROUTING = {

"P1": ["oncall-phone", "slack-incident", "pagerduty"],

"P2": ["oncall-slack", "pagerduty-low"],

"P3": ["slack-sre-channel"],

"P4": ["slack-monitoring"],

}

```

### 3.2 多烧速率告警(Multi-burn-rate)

```yaml

# 短窗口高烧速率 → 快速发现突发故障

# 长窗口低烧速率 → 发现慢性退化

groups:

- name: multi-burn-rate

rules:

- alert: HighBurnRate-Short

expr: |

(

1 - sum(rate(http_requests_total{code!~"5.."}[1h]))

/ sum(rate(http_requests_total[1h]))

) > (14.4 * (1 - 0.999))

for: 5m

labels:

severity: critical

window: short

- alert: HighBurnRate-Long

expr: |

(

1 - sum(rate(http_requests_total{code!~"5.."}[6h]))

/ sum(rate(http_requests_total[6h]))

) > (6 * (1 - 0.999))

for: 30m

labels:

severity: warning

window: long

```

## 四、故障演练(Chaos Engineering)

### 4.1 演练原则

1. **在稳态下进行**:先确认系统正常运行

2. **假设控制组**:明确"正常行为"是什么

3. **引入变量**:注入故障

4. **观察差异**:系统行为是否符合预期

5. **记录改进**:发现的问题必须进入改进计划

### 4.2 Chaos Mesh实战

```yaml

# 网络延迟注入

apiVersion: chaos-mesh.org/v1alpha1

kind: NetworkChaos

metadata:

name: payment-latency

namespace: chaos-testing

spec:

action: delay

mode: one

selector:

namespaces: ["production"]

labelSelectors:

app: "payment-service"

delay:

latency: "2000ms" # 注入2秒延迟

jitter: "500ms"

duration: "10m"

```

```yaml

# Pod故障注入

apiVersion: chaos-mesh.org/v1alpha1

kind: PodChaos

metadata:

name: db-pod-kill

namespace: chaos-testing

spec:

action: pod-kill

mode: one

selector:

namespaces: ["production"]

labelSelectors:

app: "mysql-primary"

scheduler:

cron: "@every 30m" # 每30分钟杀一次

duration: "5m"

```

### 4.3 演练场景设计

| 场景 | 注入故障 | 观察指标 | 预期结果 |

|------|---------|---------|---------|

| 支付服务延迟 | 2s网络延迟 | 下单成功率、P99延迟 | 降级但不熔断 |

| DB主节点宕机 | Pod Kill | 主从切换时间、数据一致性 | 30秒内切换 |

| 缓存集群不可用 | 网络分区 | 请求成功率、响应时间 | 降级兜底可用 |

| 可用区故障 | 整区网络断开 | 跨区切换时间 | 60秒内恢复 |

### 4.4 演练报告模板

```markdown

# 故障演练报告

## 基本信息

- 日期:2026-05-05

- 场景:支付服务网络延迟

- SLO:可用性99.9%,P99<3s

## 结果

| 指标 | 演练前 | 演练中 | 是否符合预期 |

|------|--------|--------|------------|

| 可用性 | 99.95% | 99.1% | ❌ 低于SLO |

| P99延迟 | 1.2s | 4.8s | ❌ 超过3s |

| 下单成功率 | 99.8% | 95.2% | ❌ 低于预期 |

## 发现的问题

1. 支付服务未配置超时降级,导致请求堆积

2. 重试策略过于激进,加剧了延迟

3. 缓存兜底策略未生效

## 改进计划

1. 配置支付服务2s超时 + 降级 → 负责人:张三 → 截止:2026-05-10

2. 调整重试策略为指数退避 → 负责人:李四 → 截止:2026-05-08

3. 修复缓存兜底逻辑 → 负责人:王五 → 截止:2026-05-07

```

## 五、SLO文化落地checklist

- [ ] 每个关键用户旅程有对应的SLO

- [ ] SLO仪表盘实时展示错误预算

- [ ] 告警与SLO直接关联,非SLO告警降级

- [ ] 错误预算策略写入发布流程

- [ ] 每月进行故障演练并出报告

- [ ] 季度回顾SLO是否需要调整

- [ ] 事故复盘结果关联SLO改进

## 总结

SLO体系的核心不是数字,而是团队对可靠性的共同承诺。从SLI采集、SLO定义、错误预算管理到故障演练验证,形成完整闭环,才能真正将可靠性文化融入团队DNA。

---

*本文由北科信息日采集系统自动生成,发布日期:2026-05-05*