SLA/SLO/SLI 与容量规划

可用性目标定义、SLO 制定方法、容量模型构建与压测方法论——从量化到实践的完整容量管理。

SLA/SLO/SLI 与容量规划

SRE 的核心是量化可靠性。SLA/SLO/SLI 定义了"多可靠算足够可靠",容量规划确保资源满足这些目标。

1. 定义区分

缩写全称含义示例
SLIService Level Indicator服务质量指标请求延迟 P99 < 200ms
SLOService Level Objective目标值99.9% 的请求延迟 < 200ms
SLAService Level Agreement服务等级协议(对外承诺)可用性 < 99.9% 退款 10%
SLI: 测量什么
↓
SLO: 目标值多少
↓
SLA: 达不到的后果(法务/商务)

2. SLI 选择

Google SRE Book 推荐的 SLI 类型:

四类黄金信号

信号说明指标示例
延迟服务响应时间P50/P95/P99 延迟
流量请求量QPS、带宽
错误失败率HTTP 5xx 比例
饱和度资源利用率CPU > 80%、磁盘满

SLI 制定原则

  1. 用户视角:测量用户感受到的质量
  2. 可量化:能够用监控工具持续测量
  3. 可行动:触发后知道如何改进
  4. 不过度:选择最关键的几个(3-5 个)

3. SLO 制定方法

可用性 SLO 参考

SLO年停机时间适用场景
99%3.65 天内部工具
99.9%8.76 小时核心业务
99.99%52.56 分钟关键支付
99.999%5.26 分钟极少场景

更高 SLO ≠ 更好。SLO 提升 10 倍,成本可能提升百倍。

错误预算

错误预算 = 1 - SLO

SLO 99.9% → 年错误预算 = 0.1% × 525600 分钟 = 525.6 分钟

每月可用预算 = 525.6 ÷ 12 ≈ 43.8 分钟

用途:
- 本月已用 30 分钟 → 谨慎发布,加强测试
- 本月已用 50 分钟 → 冻结发布,聚焦稳定性改进

多层级 SLO

组织级     SLO: 99.99%(核心业务总览)
  │
  ├─ 产品级 SLO: 99.95%(具体产品)
  │     │
  │     └─ 服务级 SLO: 99.9%(单个服务)
  │
  └─ 基础设施 SLO: 99.999%(K8s 集群)

4. 容量规划

核心公式

所需容量 = 预测峰值 × 冗余系数 × 增长余量

预测峰值: 业务高峰期的资源需求
冗余系数: N+1 或 N+2(通常 1.3-1.5)
增长余量: 未来 3-6 个月增长预期

容量模型

步骤方法
基线测量日常负载下的资源使用
峰值分析历史流量峰值、周期性规律
关联建模QPS → CPU/内存/带宽的换算关系
压力测试验证容量模型

扩容策略

策略触发条件优点缺点
垂直扩容资源使用率持续高简单有上限
水平扩容QPS 超过阈值弹性强数据一致性
预测扩容定时/预期高峰无冷启动资源闲置
按需扩容K8s HPA最省成本延迟敏感

5. 压测方法论

压测类型

┌───────────────────────────────────────────┐
│ 负载测试 (Load Testing)                    │
│ 目标: 验证系统在正常负载下的表现            │
│ 方法: 逐步加压至目标 QPS                    │
├───────────────────────────────────────────┤
│ 压力测试 (Stress Testing)                  │
│ 目标: 找到系统极限、观察恢复过程            │
│ 方法: 加压至系统崩溃                        │
├───────────────────────────────────────────┤
│ 稳定性测试 (Soak Testing)                  │
│ 目标: 长时间运行发现内存/连接泄漏           │
│ 方法: 持续跑 8-24 小时                      │
├───────────────────────────────────────────┤
│ 峰值测试 (Spike Testing)                   │
│ 目标: 突发流量应对能力                      │
│ 方法: 瞬间加压数倍                          │
└───────────────────────────────────────────┘

压测工具

工具特点适用
JMeterGUI 配置、插件丰富Web 应用
k6代码即脚本、云原生API 压测
LocustPython 编写、分布式自定义场景
GatlingScala、高性能复杂协议
** vegeta**命令行、Go 编写快速测试

k6 示例

import http from 'k6/http';
import { check, sleep } from 'k6';

export const options = {
    stages: [
        { duration: '2m', target: 100 },   // 逐步加压
        { duration: '5m', target: 100 },   // 稳态
        { duration: '2m', target: 200 },   // 继续加压
        { duration: '5m', target: 200 },   // 稳态
        { duration: '2m', target: 0 },     // 减压
    ],
    thresholds: {
        http_req_duration: ['p(99)<200'],
        http_req_failed: ['rate<0.1'],
    },
};

export default function () {
    const res = http.get('https://api.example.com/orders');
    check(res, {
        'status is 200': (r) => r.status === 200,
    });
    sleep(1);
}

总结

维度核心
SLI测量什么
SLO目标值(平衡可靠性与成本)
错误预算可靠性资源,指导发布策略
容量规划资源支撑 SLO 的能力
压测验证容量与极限

没有无限可靠性的系统,只有清晰定义"足够可靠"并为之投入的系统。

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「架构」更多文章

  1. 架构评审与技术债管理
  2. 云原生架构模式
  3. CQRS 与事件溯源