3. 自愈剧本概述
自愈剧本是 SLO 自愈体系的核心执行单元。它是一组预定义的、可编排的自动化操作序列,当 SLO 燃烧率触发告警后,由决策引擎根据灰度策略选择并执行,旨在将系统状态恢复至 SLO 目标范围内。本章将定义自愈剧本的核心概念,并剖析三类最典型的应用场景。
3.1 自愈剧本的定义
自愈剧本本质上是一个有限状态机 + 操作流水线的组合。它包含三个基本要素:
- 触发条件:与 SLO 燃烧率告警绑定的准入规则,例如“过去 5 分钟错误预算消耗 > 10%”。
- 操作步骤:有序或并行的自动化动作,如执行命令、调用 API、更新配置。
- 回滚/终止条件:每一步执行后检查的熔断逻辑,防止自愈行为造成二次伤害。
关键原则:自愈剧本不是“万能修复脚本”,而是可灰度、可观测、可回滚的受控恢复流程。每个剧本必须附带明确的影响半径评估和最大执行时长。
3.2 典型场景一:自动扩容
当服务因流量突发导致延迟升高、错误预算快速消耗时,自动扩容是最直接的自愈手段。该场景的核心挑战在于扩容速度与成本的平衡。
| 维度 | 水平扩容 (Scale-Out) | 垂直扩容 (Scale-Up) |
|---|---|---|
| 典型操作 | 增加 Pod / 容器实例数 | 提升单实例 CPU / 内存资源 |
| 生效速度 | 中等(依赖镜像拉取、调度) | 快(重启进程即可) |
| 回滚难度 | 低(缩容即可) | 中(需重新分配资源) |
| 适用场景 | 无状态服务、突发流量 | 有状态服务、资源碎片化 |
灰度执行要点:自动扩容剧本应优先在低流量区域或金丝雀部署单元执行。例如,先扩容 10% 的实例,观察 2 分钟 SLO 恢复情况,再决定是否全量扩容。
3.3 典型场景二:重启
重启是应对内存泄漏、死锁、临时性资源耗尽等问题的经典手段。虽然操作简单,但在灰度执行中需要精细控制,避免“雪崩式重启”。
避坑指南:切勿对所有异常实例同时发起重启。必须遵循“先摘流量 → 优雅关闭 → 启动 → 健康检查 → 挂回流量”的步骤。对于有状态服务,还需确保数据持久化完成。
重启剧本的灰度策略通常包含以下参数:
- 并发度:每次最多重启的实例数(如 1 个或 10%)。
- 间隔时间:两次重启操作之间的等待时间(如 30 秒)。
- 健康检查超时:等待实例恢复健康的最大时长(如 5 分钟)。
- 失败阈值:连续失败 N 次后终止整个剧本。
3.4 典型场景三:流量切换
当某个可用区、集群或服务版本出现故障时,将流量从故障单元切换至健康单元,是最高效的止损手段。流量切换剧本通常与蓝绿部署或多活架构配合使用。
| 切换粒度 | 典型操作 | 风险等级 | 回滚方式 |
|---|---|---|---|
| DNS 切换 | 修改 DNS A 记录 / CNAME | 高(生效慢、缓存问题) | 改回原记录 |
| 负载均衡切换 | 调整 Nginx / ALB 后端权重 | 中(连接耗尽问题) | 恢复权重配置 |
| 服务网格切换 | 更新 VirtualService / DestinationRule | 低(精细化控制) | 回滚 Istio 配置 |
灰度执行要点:流量切换剧本必须采用“增量切换 + 实时观测”模式。例如,先切换 5% 流量到健康集群,确认 SLO 恢复后,再逐步增加至 20%、50%、100%。一旦观测到健康集群出现异常,立即停止切换并回滚。
3.5 剧本通用结构
无论哪种场景,一个标准的自愈剧本都应包含以下阶段:
- 准入检查:确认当前系统状态是否允许执行自愈(如是否在维护窗口内)。
- 影响评估:计算本次操作的影响半径(如影响多少用户、多少 QPS)。
- 灰度执行:按照预定义的灰度策略(按实例、按区域、按用户)执行操作。
- 观测验证:实时监控 SLO 指标,判断是否恢复。
- 回滚/完成:若恢复则标记完成;若恶化或超时则触发回滚。
最佳实践:建议为每个剧本编写“剧本卡片”,包含剧本名称、触发条件、操作步骤、回滚脚本、影响半径、最大执行时长、负责人。这些卡片应存储在版本控制系统中,与基础设施代码一同管理。