Runbook联动场景容量压测巡检脚本编排优化 - 第3节

3.1 巡检脚本的定义与核心要素

巡检脚本是用于自动执行系统健康检查、状态采集、阈值判定与结果输出的可执行指令集合。在容量压测场景中,巡检脚本承担着“哨兵”角色,在压测前、中、后三个阶段持续验证系统状态是否符合预期。

定义要点:巡检脚本 = 检查逻辑 + 判定规则 + 输出格式 + 执行策略。它不直接干预业务流量,而是通过采集指标、比对基线、生成报告来辅助运维决策。

3.1.1 巡检脚本的组成结构

组成要素 说明 容量压测场景示例
采集模块 从目标系统获取指标数据 通过 Prometheus API 拉取 CPU/内存/网络 IO
判定模块 将采集值与预设阈值或基线对比 检查 QPS 是否超过压测目标值的 80%
输出模块 格式化结果并写入日志/告警/报告 输出 JSON 格式巡检报告,推送至 Elasticsearch
执行策略 定义触发方式与重试/超时逻辑 每 30 秒执行一次,超时 10 秒,失败重试 2 次
# 巡检脚本最小示例(Python)
import requests
import json

def check_node_health(node_ip):
    # 采集
    cpu = requests.get(f"http://{node_ip}:9100/metrics", timeout=5)
    # 判定
    cpu_usage = parse_cpu(cpu.text)
    status = "PASS" if cpu_usage < 80 else "FAIL"
    # 输出
    return {"node": node_ip, "cpu": cpu_usage, "status": status}

result = check_node_health("10.0.1.10")
print(json.dumps(result, indent=2))

3.2 巡检与监控的核心区别

巡检和监控是运维可观测性的两个互补维度,但存在本质差异。在容量压测 Runbook 中,两者分工明确:监控负责持续感知,巡检负责定向验证。

对比维度 监控 巡检
触发方式 持续采集,被动接收 按计划或事件主动执行
数据粒度 高频率(秒级),全量数据 按需采样,聚焦关键指标
判定逻辑 基于动态阈值/异常检测 基于固定阈值/基线比对
输出形式 仪表盘、告警、时间序列 结构化报告、检查清单
典型场景 实时发现故障、趋势分析 变更前验证、压测前准入
资源消耗 较高(常驻进程) 较低(按需执行)
实践建议:在容量压测 Runbook 中,监控用于压测期间的实时水位感知,巡检用于压测前的环境准入检查和压测后的结果验证。两者配合使用,避免重复建设。

3.3 巡检脚本的常见模式

根据触发方式的不同,巡检脚本可分为定时触发和事件触发两种基本模式。在容量压测场景中,两种模式往往组合使用,形成“定时基线巡检 + 事件驱动深度巡检”的混合策略。

3.3.1 定时触发模式

定时触发是最常见的巡检模式,通过 cron 表达式或调度器按固定周期执行。适用于环境基线检查、资源水位周期性扫描等场景。

  • 适用场景:压测前每 5 分钟检查一次集群节点状态;压测期间每 30 秒采集一次关键指标。
  • 实现方式:Linux cron、Kubernetes CronJob、Airflow 定时 DAG、自定义调度器。
  • 优点:执行周期可预测,便于与压测阶段对齐。
  • 缺点:无法响应突发状态变化,存在检查盲区。
# Kubernetes CronJob 示例:每 5 分钟执行一次巡检
apiVersion: batch/v1
kind: CronJob
metadata:
  name: capacity-check
spec:
  schedule: "*/5 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: checker
            image: registry/checker:1.0
            command: ["python", "/scripts/check_capacity.py"]
          restartPolicy: OnFailure

3.3.2 事件触发模式

事件触发模式在特定事件发生时启动巡检,响应速度快,资源利用率高。适用于压测开始/结束、告警触发、变更完成等场景。

  • 适用场景:压测启动时触发全量环境巡检;收到 CPU 告警时触发深度诊断巡检。
  • 实现方式:Webhook 回调、消息队列订阅、Kubernetes Watch API、事件总线(如 Kafka)。
  • 优点:精准响应,避免无效检查。
  • 缺点:依赖事件源可靠性,事件丢失可能导致巡检遗漏。
# 事件触发巡检伪代码(基于 Redis Pub/Sub)
import redis

def on_pressure_start(event):
    # 压测开始事件触发全量巡检
    run_full_check()

def on_alert_triggered(event):
    # 告警事件触发专项巡检
    run_deep_check(event['metric'])

r = redis.Redis()
p = r.pubsub()
p.subscribe(**{
    'pressure:start': on_pressure_start,
    'alert:triggered': on_alert_triggered
})
p.run_in_thread(sleep_time=0.1)
巡检脚本触发模式对比 定时触发模式 Cron 调度器 定时执行巡检脚本 输出定时巡检报告 • 周期固定,适合基线检查 • 资源消耗可控 • 无法响应突发事件 • 典型周期:5s/30s/5min 事件触发模式 事件源(Webhook/消息队列) 事件匹配与分发 触发对应巡检脚本 • 精准响应,按需执行 • 资源利用率高 • 依赖事件源可靠性 • 典型事件:压测开始/告警触发

3.3.3 混合模式:定时 + 事件组合

在容量压测 Runbook 中,推荐采用混合模式:定时巡检作为基线保障,事件巡检作为深度补充。以下是一个典型的组合策略:

巡检阶段 触发方式 检查内容 执行频率
压测前准入 事件触发(压测开始事件) 节点存活、磁盘空间、网络延迟、证书有效期 每次压测启动时
压测中水位 定时触发 CPU/内存/连接数/错误率 每 10 秒
压测后验证 事件触发(压测结束事件) 数据一致性、服务恢复、资源释放 每次压测结束时
环境基线扫描 定时触发 全量节点健康、配置漂移检测 每 30 分钟
注意:混合模式下需避免巡检脚本之间的冲突。例如,定时巡检正在执行时,事件巡检被触发,应通过锁机制或队列控制并发,防止重复检查或资源争抢。

3.4 巡检脚本编排优化原则

在容量压测 Runbook 中,巡检脚本的编排需要遵循以下原则,以确保高效、可靠、可维护:

  1. 幂等性:同一脚本多次执行结果一致,不产生副作用。
  2. 超时控制:每个巡检步骤设置合理超时,避免阻塞后续流程。
  3. 结果可追溯:每次巡检输出唯一 ID、时间戳、执行节点、检查项列表。
  4. 分级告警:根据巡检结果严重程度,触发不同级别的告警或阻断动作。
  5. 配置外部化:阈值、检查列表、目标地址等参数从配置文件或配置中心读取。
# 巡检脚本编排示例(YAML 配置)
checks:
  - name: node_health
    type: http
    target: "http://{{node_ip}}:9100/metrics"
    interval: 30s
    timeout: 5s
    threshold:
      cpu: 80
      memory: 90
    on_fail: warn

  - name: disk_space
    type: ssh
    target: "{{node_ip}}"
    command: "df -h / | tail -1"
    interval: 5m
    timeout: 10s
    threshold:
      used_percent: 85
    on_fail: critical
巡检脚本编排优化原则 幂等性 多次执行 结果一致 超时控制 避免阻塞 快速失败 结果可追溯 唯一 ID 时间戳 分级告警 warn/critical 阻断/通知 配置外部化 YAML/CMDB 动态加载 编排优化核心目标 • 减少巡检脚本之间的耦合,每个脚本只关注单一检查项 • 通过配置驱动而非代码驱动,降低变更风险 • 统一输出格式,便于下游系统(告警/报告/仪表盘)消费