3. 自愈剧本概述

自愈剧本是 SLO 自愈体系的核心执行单元。它是一组预定义的、可编排的自动化操作序列,当 SLO 燃烧率触发告警后,由决策引擎根据灰度策略选择并执行,旨在将系统状态恢复至 SLO 目标范围内。本章将定义自愈剧本的核心概念,并剖析三类最典型的应用场景。

3.1 自愈剧本的定义

自愈剧本本质上是一个有限状态机 + 操作流水线的组合。它包含三个基本要素:

  • 触发条件:与 SLO 燃烧率告警绑定的准入规则,例如“过去 5 分钟错误预算消耗 > 10%”。
  • 操作步骤:有序或并行的自动化动作,如执行命令、调用 API、更新配置。
  • 回滚/终止条件:每一步执行后检查的熔断逻辑,防止自愈行为造成二次伤害。
关键原则:自愈剧本不是“万能修复脚本”,而是可灰度、可观测、可回滚的受控恢复流程。每个剧本必须附带明确的影响半径评估和最大执行时长。

3.2 典型场景一:自动扩容

当服务因流量突发导致延迟升高、错误预算快速消耗时,自动扩容是最直接的自愈手段。该场景的核心挑战在于扩容速度与成本的平衡。

维度 水平扩容 (Scale-Out) 垂直扩容 (Scale-Up)
典型操作 增加 Pod / 容器实例数 提升单实例 CPU / 内存资源
生效速度 中等(依赖镜像拉取、调度) 快(重启进程即可)
回滚难度 低(缩容即可) 中(需重新分配资源)
适用场景 无状态服务、突发流量 有状态服务、资源碎片化
灰度执行要点:自动扩容剧本应优先在低流量区域或金丝雀部署单元执行。例如,先扩容 10% 的实例,观察 2 分钟 SLO 恢复情况,再决定是否全量扩容。
自动扩容自愈剧本流程 SLO 燃烧率告警 灰度策略匹配 执行扩容 (10% 实例) 观测 SLO 恢复状态

3.3 典型场景二:重启

重启是应对内存泄漏、死锁、临时性资源耗尽等问题的经典手段。虽然操作简单,但在灰度执行中需要精细控制,避免“雪崩式重启”。

避坑指南:切勿对所有异常实例同时发起重启。必须遵循“先摘流量 → 优雅关闭 → 启动 → 健康检查 → 挂回流量”的步骤。对于有状态服务,还需确保数据持久化完成。

重启剧本的灰度策略通常包含以下参数:

  • 并发度:每次最多重启的实例数(如 1 个或 10%)。
  • 间隔时间:两次重启操作之间的等待时间(如 30 秒)。
  • 健康检查超时:等待实例恢复健康的最大时长(如 5 分钟)。
  • 失败阈值:连续失败 N 次后终止整个剧本。

3.4 典型场景三:流量切换

当某个可用区、集群或服务版本出现故障时,将流量从故障单元切换至健康单元,是最高效的止损手段。流量切换剧本通常与蓝绿部署或多活架构配合使用。

切换粒度 典型操作 风险等级 回滚方式
DNS 切换 修改 DNS A 记录 / CNAME 高(生效慢、缓存问题) 改回原记录
负载均衡切换 调整 Nginx / ALB 后端权重 中(连接耗尽问题) 恢复权重配置
服务网格切换 更新 VirtualService / DestinationRule 低(精细化控制) 回滚 Istio 配置
流量切换自愈剧本架构 流量入口 负载均衡 集群 A (故障) 错误率 15% 集群 B (健康) 错误率 0.1% 流量切换
灰度执行要点:流量切换剧本必须采用“增量切换 + 实时观测”模式。例如,先切换 5% 流量到健康集群,确认 SLO 恢复后,再逐步增加至 20%、50%、100%。一旦观测到健康集群出现异常,立即停止切换并回滚。

3.5 剧本通用结构

无论哪种场景,一个标准的自愈剧本都应包含以下阶段:

  1. 准入检查:确认当前系统状态是否允许执行自愈(如是否在维护窗口内)。
  2. 影响评估:计算本次操作的影响半径(如影响多少用户、多少 QPS)。
  3. 灰度执行:按照预定义的灰度策略(按实例、按区域、按用户)执行操作。
  4. 观测验证:实时监控 SLO 指标,判断是否恢复。
  5. 回滚/完成:若恢复则标记完成;若恶化或超时则触发回滚。
最佳实践:建议为每个剧本编写“剧本卡片”,包含剧本名称、触发条件、操作步骤、回滚脚本、影响半径、最大执行时长、负责人。这些卡片应存储在版本控制系统中,与基础设施代码一同管理。