4. 多场景 SLO 识别:延迟型、错误率型、吞吐量型、饱和度型
SLO(Service Level Objective)是服务等级目标,是自愈触发策略的核心输入。不同业务场景关注的服务质量维度不同,对应的 SLO 类型也截然不同。本章将四种最常见的 SLO 类型进行结构化拆解,帮助你在 Runbook 参数化设计中准确识别并适配触发条件。
4.1 四种 SLO 类型总览
下表从定义、典型指标、适用场景、触发敏感度四个维度对比四种 SLO 类型,便于快速建立全局认知。
| SLO 类型 | 核心定义 | 典型指标 | 适用场景 | 触发敏感度 |
|---|---|---|---|---|
| 延迟型 SLO | 请求在指定时间内完成的比例 | p50 / p95 / p99 延迟 | API 网关、数据库查询、页面加载 | 高(毫秒级波动即触发) |
| 错误率型 SLO | 失败请求占总请求的比例 | HTTP 5xx 率、异常率 | 支付、登录、核心写链路 | 极高(单点故障快速扩散) |
| 吞吐量型 SLO | 单位时间处理的请求量或数据量 | QPS、TPS、BPS | 消息队列、流处理、CDN 边缘 | 中(需结合容量基线) |
| 饱和度型 SLO | 资源使用接近上限的程度 | CPU / 内存 / 磁盘 / 连接数使用率 | 基础设施、容器集群、数据库连接池 | 中低(需预留缓冲阈值) |
设计提示: 一个微服务通常需要组合 2~3 种 SLO 类型才能覆盖完整健康面。例如,仅监控延迟而不监控错误率,可能遗漏“快速返回错误”的故障模式。
4.2 延迟型 SLO:响应时间的承诺边界
延迟型 SLO 定义的是“在多少毫秒内完成请求的比例”。常见的表述为:“99% 的请求在 200ms 内完成”。
- 分位数选择: p50 反映典型体验,p95 反映长尾用户,p99 反映极端异常。Runbook 参数化时,建议将分位数作为可配置参数。
- 窗口聚合: 延迟指标通常按 1 分钟 / 5 分钟窗口滑动计算,避免瞬时毛刺误触发。
- 自愈触发条件: 当 p99 延迟连续 3 个窗口超过阈值,且错误率未同步上升时,优先触发扩容或缓存预热。
# 延迟型 SLO 参数化示例(YAML 片段)
slo_type: latency
metric: http_request_duration_seconds
aggregation: p99
window: 5m
threshold: 0.2 # 200ms
consecutive_buckets: 3
action: scale_up
关键避坑: 不要使用平均值作为延迟 SLO 指标。平均值会掩盖长尾问题,p99 或 p95 才是有效边界。
4.3 错误率型 SLO:故障的快速探测器
错误率型 SLO 衡量的是失败请求占总请求的百分比。它是自愈系统响应最快的触发信号,因为错误率上升通常意味着服务已经不可用或部分不可用。
- 错误分类: 需要区分客户端错误(4xx)和服务端错误(5xx)。Runbook 通常只对 5xx 或业务自定义错误码触发自愈。
- 基线对比: 错误率阈值应基于历史基线动态设定,而非固定值。例如“当前错误率超过基线 3 倍”作为触发条件。
- 熔断联动: 错误率型 SLO 常与熔断器(Circuit Breaker)配合,在触发自愈前先隔离故障节点。
# 错误率型 SLO 参数化示例
slo_type: error_rate
metric: http_requests_total{status=~"5.."}
aggregation: rate_1m
window: 1m
threshold: 0.05 # 5% 错误率
baseline_mode: dynamic_3x
action: circuit_break
注意: 错误率型 SLO 的窗口不宜过长。超过 2 分钟的窗口可能导致故障扩散到整个集群。建议 1 分钟窗口 + 连续 2 次触发即执行自愈。
4.4 吞吐量型 SLO:容量与压力的平衡点
吞吐量型 SLO 关注的是服务在单位时间内能处理多少请求或数据。它不直接反映服务质量,但能揭示容量瓶颈和限流需求。
- 指标类型: QPS(每秒查询数)、TPS(每秒事务数)、BPS(每秒字节数)。
- 触发逻辑: 吞吐量下降通常意味着上游限流或下游阻塞;吞吐量突增则可能触发限流自愈。
- 参数化要点: 吞吐量阈值必须与部署规模挂钩。例如“单实例 QPS 超过 5000”作为扩容触发条件,而非全局固定值。
# 吞吐量型 SLO 参数化示例
slo_type: throughput
metric: nginx_requests_per_second
aggregation: avg_1m
threshold: 5000
per_instance: true
action: scale_out
最佳实践: 吞吐量型 SLO 应配合饱和度指标一起使用。当吞吐量接近上限且资源使用率超过 70% 时,才是真正的扩容时机。
4.5 饱和度型 SLO:资源耗尽的前兆
饱和度型 SLO 衡量的是资源使用接近上限的程度。它是四种 SLO 中唯一不直接反映请求质量的类型,但却是基础设施自愈的核心依据。
- 资源维度: CPU 使用率、内存使用率、磁盘 IO 等待、连接池使用率、文件描述符使用率。
- 预留缓冲: 饱和度阈值通常设定在 70%~80%,预留 20%~30% 的缓冲空间应对突发流量。
- 自愈动作: 资源饱和度触发后,自愈动作通常是垂直扩容、水平扩容或资源回收(如清理临时文件)。
# 饱和度型 SLO 参数化示例
slo_type: saturation
metric: node_cpu_utilization
aggregation: avg_5m
threshold: 0.8 # 80%
resource_type: cpu
action: scale_up_or_evict
设计提示: 饱和度型 SLO 的窗口应比其他类型更长(5~10 分钟),避免因瞬时资源抖动触发不必要的扩容。同时建议设置“持续上升趋势”作为辅助条件。
4.6 四种 SLO 的识别与选择矩阵
在实际 Runbook 设计中,你需要根据服务类型和故障模式选择 SLO 组合。下表给出了常见服务类型的推荐 SLO 组合。
| 服务类型 | 主 SLO | 辅 SLO | 说明 |
|---|---|---|---|
| API 网关 | 延迟型 | 错误率型 | 网关是流量入口,延迟和错误率直接影响所有下游 |
| 数据库 | 饱和度型 | 延迟型 | 数据库瓶颈通常先表现为资源饱和,再体现为延迟上升 |
| 消息队列 | 吞吐量型 | 饱和度型 | 队列积压是吞吐量下降的直接表现,同时关注磁盘和内存 |
| 计算任务 | 吞吐量型 | 错误率型 | 批处理任务关注处理速度,失败任务需快速重试 |
| CDN 边缘 | 延迟型 | 吞吐量型 | 边缘节点关注用户感知延迟和带宽使用率 |
4.7 四种 SLO 的触发关系图
下图展示了四种 SLO 类型在自愈系统中的触发关系与典型流转路径。理解这个关系图有助于你在 Runbook 中设计正确的触发优先级和联动逻辑。
4.8 多场景 SLO 参数化设计要点
在 Runbook 中实现多场景 SLO 自愈触发,需要将上述四种 SLO 类型抽象为可配置的参数模板。以下是参数化设计的核心要点:
- 指标源抽象: 将 Prometheus、Datadog、CloudWatch 等指标源封装为统一接口,Runbook 只关心 metric 名称和聚合方式。
- 阈值动态化: 支持固定阈值、基线倍数、百分位数三种阈值模式,通过参数
threshold_mode切换。 - 窗口与连续性: 每个 SLO 类型独立配置
window和consecutive_buckets,避免误触发。 - 动作映射: 定义 SLO 类型到自愈动作的映射表,支持“一类型多动作”和“多类型一动作”两种模式。
- 优先级与抑制: 当多个 SLO 同时触发时,按错误率 > 延迟 > 饱和度 > 吞吐量的优先级执行,并支持抑制规则。
# 多场景 SLO 参数化模板(完整示例)
slo_definitions:
- name: api_latency
type: latency
metric: http_request_duration_seconds
aggregation: p99
window: 5m
consecutive: 3
threshold_mode: fixed
fixed_threshold: 0.2
actions: [scale_up, cache_warm]
- name: api_error_rate
type: error_rate
metric: http_requests_total{status=~"5.."}
aggregation: rate_1m
window: 1m
consecutive: 2
threshold_mode: baseline
baseline_multiplier: 3
actions: [circuit_break, alert]
- name: db_saturation
type: saturation
metric: node_cpu_utilization
aggregation: avg_5m
window: 10m
consecutive: 2
threshold_mode: fixed
fixed_threshold: 0.8
actions: [scale_up, evict_pods]
总结: 四种 SLO 类型覆盖了服务质量(延迟、错误率)和容量健康(吞吐量、饱和度)两个维度。在 Runbook 参数化设计中,将它们统一为可配置的 SLO 定义块,是实现多场景自愈触发的基础。下一章将深入讲解如何将这些 SLO 定义与具体的自愈动作编排引擎对接。