2. SLO 与 SLI 基础:服务等级目标与指标
在蓝绿发布场景中,自动化决策的核心依据来自 服务等级指标(SLI) 与 服务等级目标(SLO)。没有量化的 SLI 和 SLO,发布系统无法判断新版本是否“健康”,也无法触发自动回滚。本节将系统性地定义 SLI、SLO、错误预算,并解释 SLO 违约在发布流程中的实际含义。
2.1 服务等级指标(SLI)选取原则
SLI 是衡量服务某个维度质量的具体量化指标。在蓝绿发布中,SLI 必须能够快速反映新版本实例的真实表现。
| 维度 | 常见 SLI 示例 | 采集方式 | 蓝绿发布中的重要性 |
|---|---|---|---|
| 可用性 | 请求成功率(HTTP 200/5xx 比率) | 负载均衡器指标、应用探针 | 极高:直接反映服务是否存活 |
| 延迟 | P50 / P95 / P99 响应时间 | APM 工具、中间件埋点 | 高:新版本性能退化常先体现在延迟 |
| 吞吐量 | 每秒请求数(RPS) | 网关指标、服务端计数器 | 中:用于判断新版本是否出现连接泄漏 |
| 错误率 | 业务错误码比例(非 HTTP 层面) | 应用日志、业务埋点 | 高:HTTP 200 但业务逻辑失败 |
| 饱和度 | CPU / 内存 / 连接池使用率 | 基础设施监控 | 中:辅助判断资源瓶颈 |
选取原则:蓝绿发布场景下,SLI 应满足 R.U.S.T 原则——Relevant(与用户体验强相关)、Unambiguous(定义明确无歧义)、Sensitive(对异常敏感)、Timely(采集延迟在秒级以内)。
2.2 服务等级目标(SLO)定义
SLO 是为 SLI 设定的目标阈值,表示“在特定时间窗口内,SLI 必须达到的水平”。SLO 不是 100%,因为 100% 的可用性在分布式系统中既不现实也不经济。
SLO 的典型表达方式:
- 月度 SLO:“99.9% 的请求在 30 天内成功返回。”
- 滚动窗口 SLO:“过去 28 天内,P99 延迟 ≤ 200ms。”
- 发布窗口 SLO:“蓝绿切换后的 5 分钟内,错误率 ≤ 0.1%。”
蓝绿发布中的 SLO 设定建议:建议设置两个层级的 SLO——严格 SLO(用于触发自动回滚,如错误率 > 1%)和预警 SLO(用于触发告警,如错误率 > 0.5%)。
2.3 错误预算概念
错误预算(Error Budget)是 SLO 的衍生概念,定义为 1 - SLO 所对应的可容忍故障时间。它把抽象的百分比目标转化为团队可感知的“可用时间额度”。
错误预算的计算公式:
错误预算 = (1 - SLO) × 时间窗口总时长
示例:
SLO = 99.9%(月度)
时间窗口 = 30 天 = 43,200 分钟
错误预算 = (1 - 0.999) × 43,200 = 43.2 分钟
关键理解:错误预算不是“允许出错的额度”,而是决策阈值。当错误预算耗尽时,团队应停止所有非必要的变更(包括蓝绿发布),优先恢复稳定性。
2.4 SLO 违约的含义
SLO 违约指在 SLO 定义的时间窗口内,SLI 的实际表现未达到预设的 SLO 阈值。在蓝绿发布场景中,SLO 违约是触发自动恢复(回滚)的核心条件。
SLO 违约的两种典型场景:
- 瞬时违约:SLI 在短时间内(如 1 分钟)跌破 SLO 阈值,但尚未耗尽整个错误预算。此时应触发告警,但不一定立即回滚。
- 持续违约:SLI 持续低于 SLO 阈值,导致错误预算快速消耗。当错误预算耗尽或达到预设的“回滚阈值”时,系统应自动执行回滚。
2.5 蓝绿发布中的 SLO 违约检测策略
在蓝绿发布自动化中,SLO 违约检测不是简单的“低于阈值就回滚”,而是需要结合时间窗口和错误预算消耗速率做综合判断。
推荐策略:
- 预热期忽略:流量切换后的前 30-60 秒,不触发 SLO 违约判断,避免冷启动导致的误报。
- 滑动窗口评估:使用 5 分钟滑动窗口计算 SLI,避免单次抖动触发回滚。
- 错误预算消耗速率告警:当错误预算消耗速率超过正常值的 2 倍时,提前告警。
- 硬性回滚阈值:当错误预算剩余不足 10% 时,无论是否达到 SLO 违约条件,都应暂停发布并评估回滚。
实战配置示例(Prometheus + Alertmanager):
groups:
- name: bluegreen_slo
rules:
- alert: SLOViolationHighErrorRate
expr: |
(
sum(rate(http_requests_total{status=~"5..", version="green"}[5m]))
/
sum(rate(http_requests_total{version="green"}[5m]))
) > 0.01
for: 2m
labels:
severity: critical
annotations:
summary: "Green 版本错误率超过 SLO 阈值 (1%)"
description: "当前错误率: {{ $value | humanizePercentage }}"
2.6 本节小结
| 概念 | 定义 | 在蓝绿发布中的作用 |
|---|---|---|
| SLI | 服务质量的量化指标(如错误率、延迟) | 作为新版本健康度的实时信号 |
| SLO | SLI 必须达到的目标阈值 | 定义“什么是可接受的发布质量” |
| 错误预算 | 1 - SLO 对应的可容忍故障时间 | 用于判断是否应该继续发布或回滚 |
| SLO 违约 | SLI 未达到 SLO 阈值 | 触发自动回滚的核心条件 |