我是韩先超,51CTO 学堂 K8s、Python 教学总监、AIOps 实战训练营讲师,云计算架构师,具有 8 年项目实战经验+5 年教学经验,线上学员已达 300w+。
不知道做技术的你,有没有体会过这种恐惧:半夜睡得正沉,手机突然炸响,运维告警电话打过来。线上出故障了,必须立刻爬起来处理。

同样是支付集群故障,我们看看不同年代,团队都是怎么扛过去的。
2012 年,双十一前夜
支付错误率从 0.02% 一路飙升到 8.7%。值班室瞬间乱成一锅粥。
几个人 ssh 登录十几台机器不停刷日志,有人翻 Excel 核对变更记录,微信群疯狂刷屏追问:刚才是谁上线改了东西。
折腾四十多分钟才定位,就因为新扩容机器少写了一行配置。
2018 年,已经用上 DevOps 的团队
发布流水线直接标红,金丝雀环境自动回滚。Grafana 看板一眼看到支付 P99 延迟从 80ms 直接冲到 1.2s。
十二分钟业务恢复,事后复盘,是配置中心默认参数和镜像内部配置发生冲突。
2025 年,AIOps 平台接管现场
故障发生第 90 秒,两万多条杂乱告警被压缩成一张根因卡片:新节点缺少服务发现标签。第 3 分钟,系统自动隔离问题节点,完成扩容。
人是故障处理完毕之后才被 @出来,只需要复核确认,不用连夜冲上去救火。
一模一样的业务故障,三个时代,完全不同的处置结局。

今天这篇文章,就把这条发展路线讲透:传统运维是怎么被业务规模压垮,DevOps 如何打破开发和运维之间厚厚的墙,而 AIOps,又是怎么把单纯的自动化,升级成完整的智能故障闭环。
文中有演进时间线、对比表格、国内真实事故案例,附带可直接上手的代码片段,最后还有一份可以直接拿去部门汇报的运
维成熟度落地路线图。
运维的五次跃迁,不要跳级建设
如果把 “保障系统稳定运行” 比作一条铁路,国内运维行业大致走过了五个阶段。
绝大多数公司没办法跳阶段升级。底层基础没打牢,直接上高阶方案,最后只会剩下一堆 PPT,落不了地。
阶段 | 大致时间 | 核心矛盾 | 关键词 | 人的角色 |
手工运维 | 90年代‑2008 | 机器数量少,变更全靠人手操作 | 机房、shell 脚本、7×24 值班 | 执行者,什么活都要上手干 |
标准化 ITIL | 2005‑2012 | 流程有了,但是迭代交付速度被卡死 | 工单、CMDB、变更窗口 | 审批者,大量时间耗在流程上 |
虚拟化/云 | 2008‑2016 | 资源可以弹性伸缩,系统复杂度爆炸式上涨 | 虚拟机、公有云 IaaS、弹性伸缩 | 资源调度者,不停申请调整资源 |
DevOps/SRE | 2013‑2022 | 业务要求迭代快,同时不能频繁出故障 | CI/CD、IaC、SLO 错误预算 | 系统设计者,搭建自动化体系 |
AIOps/运维智能体 | 2019‑至今 | 监控告警太多,人的精力已经处理不过来 | 智能异常检测、根因分析、故障自愈 | 监督决策者,复核 AI 输出结果 |
简单总结三句话:
- 传统运维解决系统能不能跑起来;
- DevOps 解决系统能不能改得又快又稳;
- AIOps 解决业务迭代越来越快,人力已经跟不上的问题。
传统运维:系统稳不稳,全靠老师傅
十几年前做运维,这些场景,大家应该多少还有印象:
- 业务跑在物理服务器上面,机器 IP 记在 Excel 表格;
- 版本发布就是远程登录服务器,上传程序包,手动重启进程;
- 监控用 Zabbix、Nagios,阈值基本拍脑袋定,CPU 超过 80% 就发短信告警;
- 线上故障来了,先到处找人,再登录机器排查,最后才定位问题根源。
开发只管扔程序包,背锅的全是运维,开发、运维、测试三方壁垒分明。
这套模式在机器不多、版本更新频率低的时候很好用。
早年,银行核心、运营商计费系统,靠的就是经验丰富的老运维、固定变更窗口、双人复核制度维持稳定性。
但这套模式的短板也极其致命。
能力模块 | 实现方式 | 优势 | 致命短板 |
配置管理 | 手动修改文件、零散 shell 脚本 | 改动灵活、上手快 | 配置漂移,很难审计追溯 |
版本发布 | 夜间固定窗口,人工分批操作 | 人为可控感强 | 速度极慢,回滚更慢 |
监控告警 | 主机指标、端口存活探测 | 部署简单 | 看不到真实用户体验好坏 |
故障处置 | 依赖老专家经验,口头应急手册 | 高手排障效率极高 | 核心知识存在人脑,人员离职能力直接流失 |
容量规划 | 按年度采购硬件,按照峰值预留机器 | 冗余充足 | 成本高,完全没有弹性 |
安全管控 | 堡垒机、人工申请权限 | 满足合规审计 | 严重阻碍日常迭代交付 |
早期团队的自动化,很多就是把老运维的检查步骤写成 shell 脚本。脚本可以代替人执行检查,但是看不懂业务上下文,不会思考问题。
#!/usr/bin/env bash
# healthcheck.sh 2010年风格主机巡检脚本
# crontab定时: */5 * * * * /opt/ops/healthcheck.sh >> /var/log/ops-health.log 2>&1
set -euo pipefail
HOST=$(hostname)
WARN=()
cpu=$(top -bn1 | awk '/Cpu\(s\)/{print 100-$8}' | cut -d. -f1)
mem=$(free | awk '/Mem:/{printf("%d", $3/$2*100)}')
disk=$(df -P / | awk 'NR==2{gsub("%","",$5); print $5}')
[[ "$cpu" -gt 85 ]] && WARN+=("CPU ${cpu}%")
[[ "$mem" -gt 90 ]] && WARN+=("MEM ${mem}%")
[[ "$disk" -gt 85 ]] && WARN+=("DISK ${disk}%")
if ! curl -fsS --max-time 3 http://127.0.0.1:8080/health >/dev/null; then
WARN+=("APP_HEALTH_DOWN")
fi
if ((${#WARN[@]})); then
msg="[$HOST] $(date '+%F %T') ALERT: ${WARN[*]}"
echo "$msg"
# 对接邮件、短信、企业微信告警机器人
echo "$msg" | mail -s "OPS ALERT $HOST" ops@company.com
exit 1
fi
echo "[$HOST] $(date '+%F %T') OK cpu=$cpu mem=$mem disk=$disk"脚本在二三十台机器的时候很好用,一旦规模扩大到两千台,就是灾难:
- 阈值写死不变:大促期间 CPU 70% 属于正常负载,凌晨 CPU 30% 反而有可能线程死锁;
- 完全没有业务上下文,不知道机器刚刚做过发布,也不知道下游服务出问题;
- 告警广播轰炸,一出事所有人收到消息,等于没人负责;
- 脚本只会报警,真正修复操作,依旧需要运维登录机器手动处理。
真实事故案例:某城商行月末批处理故障
背景:系统每天晚上 22 点跑批处理,月末业务文件量是平时 6 倍。运维参考上一年经验预留处理窗口。
时间 | 事件 |
22:00 | 批处理任务启动,磁盘占用持续上涨 |
22:47 | Zabbix 告警磁盘分区 92%,值班人员判定为月末正常峰值 |
23:10 | 批处理写入失败,但是进程没有退出,监控显示进程存活 |
23:40 | 系统切日失败,柜面业务无法正常开展,问题直接上报科技部总经理 |
00:15 | 资深运维远程登录排查,inode 耗尽,磁盘空间充足但是无法新建文件 |
01:20 | 手动清理临时文件,重跑任务,完成切日 |
根因:监控只采集磁盘空间,没有监控 inode 指标。更深层问题,故障检查要点全部装在老员工脑子里,没有固化成系统能力,容量没有和业务日历做联动。
这次事故造成对外营业延迟 80 分钟,收到监管问询,当晚 11 名技术人员通宵加班。
传统运维的真实写照:故障能救回来,靠的是老师傅;故障处理慢,也是因为只有老师傅。
过渡阶段:ITIL 标准化+虚拟化云时代
很多团队误以为上一套工单系统就是 DevOps,其实这只是用流程对抗混乱的阶段。
ITIL、ISO20000 给运维带来一套完整可审计的服务体系:事件管理、问题管理、变更管理、配置管理、发布管理。
CMDB 试图梳理清楚企业所有 IT 资产以及相互依赖关系。
ITIL 带来的好处 | ITIL 带来的副作用 |
所有变更可以追溯留痕 | 紧急故障修复也要走层层审批 |
权责划分清晰明确 | 部门墙越来越厚 |
适合金融等强监管行业 | “周五不能上线” 成为很多团队的铁律 |
事故复盘有标准模板 | 复盘容易变成追责大会 |
ITIL 是企业运维走向成熟的必经之路,但绝对不是终点。
互联网业务迭代加快,发布频率从每月一次变成一天几十次,固定变更窗口本身,反而成为故障的来源,大量变更积压集中在窗口爆发。
紧接着,随着虚拟化、公有云的到来,申请一台服务器从两周缩短到两分钟。
但是新麻烦接踵而至:虚拟机漂移、镜像腐化、安全组配置出错;一台物理机宕机,上面几十个业务同时疯狂告警。
这个阶段最重要的成果:基础设施变成 API 接口。没有这个基础,后面的 IaC、弹性伸缩根本无从谈起。
resource "aws_autoscaling_group" "pay" {
min_size = 4
max_size = 40
desired_capacity = var.desired
tag {
key = "service"
value = "payment"
propagate_at_launch = true
}
}DevOps:拆掉部门墙,把上线交给流水线

很多人有个误区:招个岗位叫 DevOps 工程师,买一套 Jenkins,就算落地 DevOps。并不是。行业常用 CALMS 模型理解 DevOps。
缩写 | 含义 | 落地之后,团队应该看到的现象 |
C 文化 | Culture | 开发人员对线上稳定性负责,运维提前参与业务架构设计 |
A 自动化 | Automation | 构建、测试、发布、回滚全部自动化,可重复执行 |
L 精益 | Lean | 小批量迭代,减少不必要等待 |
M 度量 | Measurement | 依靠 DORA、SLO 数据说话,不靠感觉判断系统稳不稳 |
S 共享 | Sharing | 统一工具链,统一复盘机制,统一监控看板 |
谷歌 SRE 进一步把这套理念工程化,提出错误预算、SLO,尽量消除纯手工重复劳动(Toil)。
国内大厂实践也证明高频发布和稳定性并不冲突,前提是自动化体系足够扎实。
DevOps 核心衡量:DORA 四大指标
指标 | 传统运维普遍情况 | 成熟 DevOps 团队 | 衡量意义 |
部署频率 | 按月、季度发布 | 按天、小时发布 | 版本迭代批次大小 |
变更前置时间 | 几周到一个月 | 小时级别 | 代码提交到生产环境的耗时 |
变更失败率 | 15%‑30% | 小于 5% | 流水线质量门禁是否生效 |
MTTR 故障恢复时间 | 小时甚至按天 | 分钟级别 | 回滚、应急处置自动化水平 |
注意:四个指标要结合看。只追求上线速度,不控制失败率,等于加速制造线上事故。
DevOps 最小闭环链路
代码提交 → 自动构建自动化测试 → 制品仓库保存镜像 → 基础设施即代码(IaC)→ 金丝雀/蓝绿滚动发布 → 完整可观测体系(指标、日志、链路追踪)→ 自动回滚、服务熔断 → 故障复盘反哺流水线规则
下面是一份简化的 GitHub Actions 流水线示例,重点体现测试门禁、不可变镜像、金丝雀发布、SLO 自动回滚逻辑。
# .github/workflows/pay-service.yml
name: pay-service-cd
on:
push:
branches: [main]
jobs:
ci:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: 单元测试 + 契约测试
run: |
go test ./... -count=1
npm run test:contract
- name: 构建推送镜像
run: |
docker build -t harbor.example.com/pay:${{ github.sha }} .
docker push harbor.example.com/pay:${{ github.sha }}
canary:
needs: ci
runs-on: ubuntu-latest
steps:
- name: 部署5%流量金丝雀
run: |
kubectl set image deploy/pay pay=harbor.example.com/pay:${{ github.sha }}
kubectl argo rollouts set weight pay 5
- name: 金丝雀观察10分钟
run: |
python scripts/slo_gate.py \
--service pay \
--slo error_rate<0.1 \
--slo p99_ms<200 \
--window 10m
- name: 确认发布或者自动回滚
run: |
kubectl argo rollouts promote pay || \
kubectl argo rollouts abort pay配套 SLO 质量门禁脚本,金丝雀阶段拿真实业务流量做校验:
# scripts/slo_gate.py
import os, sys, time, requests
PROM = os.environ["PROM_URL"]
QUERY = '''
sum(rate(http_requests_total{service="pay",code=~"5.."}[2m]))
/
sum(rate(http_requests_total{service="pay"}[2m]))
'''
def error_rate():
r = requests.get(f"{PROM}/api/v1/query", params={"query": QUERY}, timeout=5)
v = float(r.json()["data"]["result"][0]["value"][1])
return v
deadline = time.time() + 600
while time.time() < deadline:
rate = error_rate()
print(f"pay error_rate={rate:.4%}")
if rate > 0.001:
sys.exit("SLO超出阈值,终止金丝雀发布")
time.sleep(15)
print("金丝雀运行正常,允许全量发布")实战案例:电商大促,DevOps 改造前后对比
改造前 2016 双十一: 发布窗口 22 点‑凌晨 2 点,一次性上线 37 个变更;回滚需要找旧包核对配置,平均 46 分钟;变更失败率 18%,40 人现场通宵值守。
改造后 2018 双十一:
项目 | 2016 年 | 2018 年 | 变化 |
日均部署 | 1‑2 次 | 35 次 | 拆分成小批次发布 |
变更前置时间 | 4 天 | 2.5 小时 | PR 即可成为发布候选 |
变更失败率 | 18% | 3.1% | 测试左移+金丝雀验证 |
MTTR 恢复时间 | 46 分钟 | 6 分钟 | 一键自动回滚 |
大促现场值守 | 40 人 | 12 人 | 流水线承担大部分监控工作 |
曾经发生一次线上险情:优惠券服务配置折扣上限填错,金丝雀 5% 流量就出现异常 GMV,SLO 门禁 4 分钟直接中止发布,回滚,业务用户几乎没有感知。
DevOps 核心不是让开发上线更快,而是把上线出错的代价变低,做到可回滚、可度量、可控。
DevOps 补齐三件套:SRE、可观测、平台工程
很多团队流水线搭完,线上故障依旧不断,大多是下面三块没做扎实。
SRE:错误预算解决 “要速度还是要稳定” 的争吵
SLO 设定服务可用指标,比如 99.9% 可用,换算下来每月错误预算大约 43 分钟。
错误预算消耗完毕 → 暂停新功能上线,优先解决稳定性债务;
错误预算还很充足 → 可以大胆迭代实验。
名词 | 通俗解释 | 示例 |
SLI 指标 | 实实在在采集到的数据 | 支付成功率、接口 P99 延迟 |
SLO 目标 | 内部承诺要达到的标准 | 支付成功率≥99.95% |
SLA 协议 | 面向客户的合同承诺 | 低于 99.9% 进行赔付 |
错误预算 | 允许故障的时间额度,用来换取迭代速度 | 1‑SLO |
Toil 苦力活 | 没有长期价值的重复手工操作 | 手动扩容、手工加白名单 |
可观测性:不只看机器活没活,要看用户疼不疼
传统监控盯着 CPU 内存;可观测性回答:用户请求慢不慢、报不报错、卡在哪个调用环节,和哪次上线变更有关系。
这里,Metrics 指标、Logs 日志、Traces 调用链,再加上变更事件,四样东西要打通,不能是四套割裂系统。
信号类型 | 回答什么问题 | 缺失之后的后果 |
Metrics 指标 | 系统现在有多不正常,趋势如何 | 出问题,只能翻日志大海捞针 |
Logs 日志 | 单条请求内部发生了什么 | 只有数字,看不到事故细节 |
Traces 链路追踪 | 故障卡在微服务哪一跳 | 微服务架构下,完全两眼一抹黑 |
变更事件 | 刚刚改了什么配置、上了什么版本 | 出问题只能瞎猜是不是发布导致 |
一份贴近业务的告警,不应该是简单 CPU>80%,而是盯着业务 SLO:
groups:
- name: pay-slo
rules:
- alert: PayErrorBudgetBurn
expr: |
(
sum(rate(http_requests_total{service="pay",code=~"5.."}[5m]))
/
sum(rate(http_requests_total{service="pay"}[5m]))
) > 0.001
for: 2m
labels:
severity: page
service: pay
annotations:
summary: "支付错误率消耗错误预算"
dashboard: "https://grafana.example.com/d/pay"
playbook: "https://wiki.example.com/runbook/pay-5xx"平台工程:把 DevOps 变成所有人的默认体验
如果每个业务小组都自己搭一套 Jenkins、自己写 Dockerfile,就会出现几十套五花八门的流水线,维护成本爆炸。
平台工程目标就是提供一条金色标准路径:开发做完代码 git push,自动完成构建、安全扫描、发布、观测、权限管控,不需要各个业务团队重复造轮子。
没有标准化平台,后面做 AIOps 就是空中楼阁。
AI 运维平台需要干净、统一、带业务语义的数据,乱七八糟的 “雪花环境” 喂不出靠谱的算法。
AIOps:从固定自动化规则,走向系统自主判断

为什么 DevOps 之后,还需要 AIOps?
DevOps 把版本迭代速度拉高一个量级,随之而来新的痛点:
- 微服务拆分之后,告警数量暴涨,值班人员被告警风暴淹没;
- 一次故障牵扯上百个服务,人脑梳理不完复杂调用拓扑;
- 80% 故障都是历史故障变体,但是每次处理都要重新排查;
- 夜班风险最高,但是人的状态最差,很容易误操作。
DevOps 擅长处理输入明确、规则写死的自动化;AIOps 擅长处理噪声多、原因不确定的复杂场景。
DevOps 自动化 | AIOps 智能化 | |
输入条件 | 明确 if‑then 规则 | 大量噪声数据,原因不确定 |
决策逻辑 | 固定条件判断 | 概率推断、事件排序 |
核心能力 | 扩容、回滚、重启 | 告警降噪、根因定位、故障预判、自愈策略选择 |
失败风险 | 规则过期失效 | 模型误判,数据漂移 |
AIOps 能力落地优先级,别上来就买酷炫大屏
很多厂商一上来就推销根因大屏、大模型聊天机器人。实际落地要讲究投入产出顺序。
优先级 | 能力 | 实际落地价值 | 常见踩坑 |
P0 必做 | 数据统一、服务拓扑 | 指标/日志/链路/变更全部关联业务实体 | CMDB 服务目录缺失,算法结果全是玄学 |
P0 必做 | 告警收敛降噪 | 上万条告警压缩为少量真实事件 | 只做简单告警抑制,不做事件关联 |
P1 重要 | 动态基线异常检测 | 替换死板静态阈值 | 没有考虑业务周期性,大促全是误报 |
P1 重要 | 根因分析排序 | 输出 top3 可疑节点、变更、接口 | 只输出分数,不给可追溯证据,没人敢信 |
P2 优化 | 故障、容量预测 | 磁盘、连接池提前预警 | 预测出来没有后续处置动作,纯展示 |
P2 优化 | 智能值班、知识库问答 | Runbook 可检索、可调用 | 只能聊天,不能对接运维工具执行操作 |
P3 谨慎 | 自动故障自愈 | 隔离、限流、扩容、回滚 | 缺少安全边界,自动修复变成自动搞崩业务 |
P3 谨慎 | 变更风险评估 | 上线前评估版本风险 | 风险分数无法解释,开发团队不认可 |
举个极简动态基线示例,用历史同时间段数据判断异常,而不是写死阈值:
"""anomaly_baseline.py
中位数+MAD实现稳健动态基线,抵御毛刺尖峰干扰
"""
from collections import defaultdict
from datetime import datetime, timedelta
import numpy as np
def mad_based_score(series):
median = np.median(series)
mad = np.median(np.abs(series - median)) or 1e-6
robust_z = 0.6745 * (series[-1] - median) / mad
return float(robust_z), float(median)
def is_anomaly(history_same_slot, current, z_th=4.0):
arr = np.array(list(history_same_slot) + [current], dtype=float)
z, baseline = mad_based_score(arr)
seasonal = current > baseline * 3 and current > 0.05
return (abs(z) >= z_th) or seasonal, z, baseline
# 示例:周五晚高峰业务本身流量就高,不能复用工作日阈值
ok, z, base = is_anomaly([0.0002, 0.0003, 0.0002, 0.0004], current=0.012)
print(f"anomaly={ok} z={z:.2f} baseline={base:.4%}")告警收敛,依靠时间窗口、服务拓扑、文本相似度把大量告警聚合成事件:
"""alert_cluster.py 简化告警聚合逻辑"""
from dataclasses import dataclass
from datetime import datetime, timedelta
from difflib import SequenceMatcher
@dataclass
class Alert:
t: datetime
service: str
fingerprint: str
msg: str
parent: str
def same_incident(a: Alert, b: Alert, window=timedelta(minutes=5)) -> bool:
if abs((a.t - b.t).total_seconds()) > window.total_seconds():
return False
if a.service == b.service or a.parent == b.service or b.parent == a.service:
return True
if a.fingerprint == b.fingerprint:
return True
return SequenceMatcher(None, a.msg, b.msg).ratio() > 0.75
def cluster(alerts: list[Alert]) -> list[list[Alert]]:
groups = []
for alert in sorted(alerts, key=lambda x: x.t):
for g in groups:
if any(same_incident(alert, x) for x in g):
g.append(alert)
break
else:
groups.append([alert])
return groups拿到聚合事件,再结合变更记录、拓扑上下游做根因打分,优先怀疑先报错的、上游依赖的、刚刚发布变更的服务。
自愈功能诱惑力最大,风险也最高
绝对不能无脑全量自动修复,一定要分级+安全护栏。
自愈等级 | 操作示例 | 是否全自动 | 安全护栏要求 |
L0 观察 | 查询监控、拉取链路日志 | 完全自动 | 只读操作,不改动任何线上资源 |
L1 缓解 | 摘除异常实例、限流、扩容 | 可以全自动(小范围) | 最大摘除比例,保证最小可用副本 |
L2 恢复 | 版本回滚、重新下发配置 | 半自动 | 需要人工确认,或者错误预算门禁拦截 |
L3 修改 | 修改代码、表结构、权限 | 禁止自动执行 | AI 仅输出建议,全部交给人处理 |
简单带防护的隔离逻辑示例:
"""heal.py 带安全护栏的自动缓解"""
class Guard:
def __init__(self, min_ready=3, max_drop_ratio=0.3):
self.min_ready = min_ready
self.max_drop_ratio = max_drop_ratio
def can_isolate(self, ready: int, isolate_n: int) -> bool:
if ready - isolate_n < self.min_ready:
return False
if isolate_n / max(ready, 1) > self.max_drop_ratio:
return False
return True
def maybe_isolate(k8s, svc, bad_pods, guard: Guard, dry_run=True):
ready = k8s.ready_count(svc)
if not guard.can_isolate(ready, len(bad_pods)):
return {"action": "escalate_to_human", "reason": "安全护栏拦截"}
if dry_run:
return {"action": "isolate", "pods": bad_pods, "dry_run": True}
for pod in bad_pods:
k8s.cordon_and_delete(pod)
return {"action": "isolate", "pods": bad_pods, "dry_run": False}大模型加入之后,AIOps 变成什么样
大模型不会直接替代时序异常检测,更多补齐运维里语言、知识编排这块短板。
传统 AIOps | 引入大模型增强之后 |
输出异常分数数字 | 用大白话解释为什么判定异常 |
静态写死 Runbook 文档 | 从历史工单故障库检索相似案例 |
固定处置剧本 | Agent 自主选择工具查指标、查变更、执行缓解操作 |
人工整理复盘报告 | 自动生成故障时间线、影响面、待优化事项 |
大模型负责推理和语言表达;统计模型负责识别指标异常;策略引擎守住安全底线。三者缺一,都只是演示 Demo,不能上生产。
真实案例:上千微服务团队如何解决告警风暴
规模背景:1200 个微服务,每天产生 18 万条告警。夜班运维人均接收 200 多条告警,真正需要人介入处理的故障不到 8 起。
一次可用区网络抖动,瞬间 400 个服务同时告警,值班人员 20 分钟分不清应该扩容还是回滚。
具体分三期,历时 9 个月落地 AIOps:
第一步:统一实体标签,每一条告警必须带上 service、env、change_id 标签,标签缺失直接降级丢弃;
第二步:告警事件收敛,5 分钟窗口内、拓扑相关告警合并为事件。日均 18 万告警压缩到 220 个事件;
第三步:根因分析,把变更事件当做一等分析条件,70% 故障根源来自近 30 分钟内的变更;
最后才上自愈,只开放 L1 级别动作(摘除实例、扩容熔断);回滚等高风险操作必须人工确认。
落地前后对比:
指标 | 上线前 | 上线 6 个月后 |
夜班人均告警 | 200+ | 15 个事件 |
MTTD 故障发现时间 | 11 分钟 | 90 秒 |
MTTR 故障恢复 | 38 分钟 | 9 分钟 |
L1 自动缓解占比 | 0 | 41% |
误隔离事故 | — | 2 次,后续补充最小副本护栏,彻底解决 |
踩过的大坑:项目最开始直接采购 AI 根因大屏,算法准确率只有 40%,开发吐槽和算命差不多。
几乎没有改动算法,只是把底层数据治理做好,相同算法准确率直接提升到 78%。AIOps 核心在数据,不是算法本身。
三类故障处置模式横向对比(支付类故障)
城商行批处理(传统运维) | 电商大促(DevOps) | 云原生告警风暴(AIOps) | |
故障发现 | 用户业务投诉电话 | SLO 门禁、监控分页 | 事件收敛+动态异常检测 |
定位根因 | 资深工程师登录机器排查 | 核对版本、金丝雀指标 | 变更记录+拓扑综合打分 |
故障处置 | 手工清理文件、重跑任务 | 自动中止金丝雀回滚版本 | 自动隔离异常节点,有限扩容 |
整体耗时 | 80 分钟以上 | 4‑6 分钟 | 1‑9 分钟 |
经验可复制 | 很低,依赖个人 | 很高,固化到流水线 | 高,并且会随着数据持续优化 |
核心投入 | 人力专家 | 流水线与团队文化建设 | 数据平台+安全策略护栏 |
写在最后
传统运维时代,我们崇拜半夜冲进机房把系统修好的工程师。
DevOps 时代,我们崇拜搭建体系,让半夜故障尽量不再发生的系统。
AIOps 时代,我们追求一套闭环,在海量告警噪声下,做出正确并且可以撤销的自动化决策。
三者不是互相否定,是工具的迭代升级。
- 先把人的经验固化为脚本,摆脱纯手工;
- 再把脚本升级成流水线、基础设施即代码,摆脱个人英雄主义;
- 最后基于流水线沉淀下来的数据,构建智能能力,摆脱人肉应对大规模系统。
团队不用一上来就启动宏大 AIOps 项目。
从一件小而硬的实事入手就足够:挑一个核心业务服务,把 SLO 定下来,落地金丝雀发布,告警全部带上 service 标签,写一份真正能拿来执行的 Runbook。
这四件事做好,AI 运维才能落地。