3. 自愈剧本原理:事件驱动自愈、剧本触发条件、剧本执行流程、回滚机制

自愈剧本是 SLO 自愈体系的核心执行单元。它接收可观测性平台发出的事件信号,按照预定义的触发条件进行匹配,然后执行一系列自动化操作,并在失败时触发回滚。理解剧本的完整生命周期,是提升自愈精准度的关键前提。

3.1 事件驱动自愈模型

自愈剧本采用事件驱动架构,而非轮询或定时检查。当 SLI 采集链路检测到指标异常并生成告警事件后,事件总线将事件推送给订阅了该事件类型的剧本引擎。这种模型具备低延迟、高扩展性和松耦合的特点。

核心优势: 事件驱动模型将“检测”与“响应”解耦,剧本引擎无需关心 SLI 如何采集,只需处理标准化的事件负载。
事件驱动自愈架构 SLI 采集链路 告警评估引擎 事件总线 (Kafka / RabbitMQ) 自愈剧本引擎 (规则匹配 + 执行) 动作执行器 回滚管理器 事件驱动流程 SLI 异常 → 告警事件 → 事件总线 → 剧本引擎匹配 → 执行/回滚

3.2 剧本触发条件

触发条件是剧本的“准入控制”。一个事件是否触发剧本执行,需要经过多层条件校验,避免误触发或无效执行。

条件类型 说明 示例
事件类型匹配 剧本只订阅特定的事件类型(如 error_budget_burn、latency_breach) 仅处理 error_budget_burn 事件
严重级别过滤 根据告警的严重级别(P0/P1/P2)决定是否触发 仅 P0 和 P1 级别触发自愈
标签/属性匹配 事件携带的标签(service、cluster、region)必须与剧本规则匹配 service=payment, region=us-east-1
冷却期检查 同一资源在冷却期内不重复触发,防止风暴 冷却期 300 秒
依赖条件 前置条件必须满足(如上游服务健康、变更窗口) 当前不在变更冻结期
最佳实践: 触发条件应尽量精确。建议将冷却期和依赖条件作为必选配置,避免剧本在变更窗口或上游故障期间盲目执行。

3.3 剧本执行流程

一个标准的自愈剧本执行流程包含 5 个阶段:事件接收、条件校验、动作编排、执行确认、结果反馈。每个阶段都有明确的输入输出和错误处理逻辑。

自愈剧本执行流程 1. 事件接收 2. 条件校验 条件通过 → 继续 条件不通过 → 丢弃 3. 动作编排 4. 执行确认 5. 结果反馈 每个阶段都有超时控制和错误处理,失败时自动进入回滚流程

3.3.1 动作编排示例

动作编排是剧本的核心逻辑,通常包含多个步骤。以下是一个典型的“Pod 重启”剧本的动作编排示例:

# 自愈剧本:Pod 重启恢复
# 触发条件:error_budget_burn & service=payment & severity=P0

steps:
  - name: "获取异常 Pod 列表"
    action: kubernetes.get_pods
    params:
      namespace: "payment"
      label_selector: "app=payment-service"
      status: "CrashLoopBackOff|Error"

  - name: "执行 Pod 重启"
    action: kubernetes.delete_pod
    params:
      pod_name: "{{ steps.get_pods.result[0].name }}"
      namespace: "payment"
    timeout: 30s

  - name: "等待 Pod 恢复"
    action: kubernetes.wait_for_pod_ready
    params:
      pod_name: "{{ steps.delete_pod.result.name }}"
      namespace: "payment"
      timeout: 120s

  - name: "验证 SLI 恢复"
    action: sli.check_health
    params:
      service: "payment"
      metric: "latency_p99"
      threshold: "< 200ms"
    timeout: 60s

3.4 回滚机制

回滚是自愈剧本的安。当剧本执行过程中出现任何步骤失败、超时或验证不通过时,必须触发回滚操作,将系统恢复到执行前的状态。

回滚触发场景 回滚动作 说明
步骤执行失败 执行该步骤的逆操作 如重启失败,则恢复原 Pod 配置
步骤超时 中止当前步骤,执行回滚 超时视为不可恢复,立即回滚
验证步骤不通过 回滚所有已执行的动作 SLI 未恢复,说明操作无效或有害
剧本引擎异常 全局回滚 + 人工介入 引擎自身故障,需要人工确认

3.4.1 回滚策略设计原则

  • 幂等性: 每个动作和回滚动作都必须是幂等的,多次执行结果一致。
  • 原子性: 要么全部执行成功,要么全部回滚,不允许部分生效。
  • 可观测性: 回滚过程必须记录详细日志和指标,便于事后分析。
  • 人工兜底: 对于高风险操作,回滚后应自动通知 SRE 介入确认。
注意: 回滚不是万能的。对于数据变更类操作(如修改数据库配置),回滚可能无法完全恢复。这类剧本应设置更高的触发门槛,并强制人工审批。

3.5 剧本生命周期总结

自愈剧本从事件触发到回滚完成,形成一个完整的闭环。理解这个闭环,有助于我们在设计 SLI 采集链路时,确保事件数据的完整性、时效性和准确性,从而提升自愈剧本的精准度。

阶段 关键动作 对 SLI 采集的要求
事件驱动 事件生成与推送 SLI 采集延迟 < 30s,事件携带完整标签
触发条件 条件匹配与过滤 SLI 标签标准化,支持精确匹配
执行流程 动作编排与执行 SLI 实时数据用于验证步骤
回滚机制 状态恢复与通知 SLI 历史数据用于回滚决策