2. 异常模式的定义与分类

聊异常之前,咱们得先搞明白一件事:什么才算异常?

我在生产环境摸爬滚打这么多年,见过太多所谓的“异常”其实只是正常波动。比如服务器CPU偶尔飙到80%,这不算事儿。但如果持续10分钟下不来,那就得警惕了。异常模式,说白了就是偏离正常行为的数据模式。它不是随机噪声,而是有规律、有意义的偏差。

2.1 什么是异常模式

异常模式可以理解成系统状态中的“不对劲”。它可能是一次信用卡盗刷,也可能是某个传感器的读数突然跳了三个数量级。我习惯把它拆成两个层面:

  • 形态层面:这个偏差长什么样?是孤立的点?还是一串连续的波动?
  • 语义层面:这个偏差在业务上意味着啥?是欺诈?是故障?还是配置变更?

你想想看,一个点异常在某个场景下可能是小问题,但在另一个场景下就可能是大事故。所以定义异常模式,不能只看数据,还要结合上下文。

我的经验:有一次告警系统半夜狂叫,说我负责的数据库查询延迟飙到10秒。我一看,那个时间点刚好在跑凌晨的统计任务,正常情况就应该慢。如果没做上下文校验,那就是个“假异常”。所以定义异常模式时,一定要把业务上下文带上。

2.2 异常的类型

学术界把异常分成三类,我在实际工作中发现这个分类非常实用。下面这张图把三类异常的关系讲清楚了:

异常模式的三大类型 异常模式 点异常 单个数据点偏离 上下文异常 特定环境下异常 集体异常 整体变异或模式 点异常举例 • 信用卡单笔消费100万 • CPU温度瞬间飙到120°C • 登录请求来自陌生IP • 网络延迟一次跳到500ms 上下文异常举例 • 凌晨3点全公司VPN登录 • 节假日突然大量订单 • 写入量大,但磁盘IO正常 • 非工作时间执行高危SQL 集体异常举例 • 多个服务器的内存同时泄漏 • 一批传感器读数整体漂移 • 流量曲线形状变了(突降) • 告警风暴中的关联规则

2.3 点异常

点异常是最直观的一类。单个数据点明显偏离正常范围。检测门槛低,但陷阱也不少。

  • 全局阈值法:比如流量超过10Gbps就告警。但遇到大促活动,这个阈值就不够灵活。
  • 统计方法:Z-score、IQR(四分位距)等。适合数据服从一定分布的场景。
  • 经验:我接手过一个MySQL主从延迟监控,设的阈值是10秒。结果某次大版本升级后,主库执行了很长时间的DDL,延迟跑到30秒,但业务完全不感知。当时告警把人吓一跳。后来我改成了动态阈值,结合表大小和SQL类型来判断。

注意:点异常容易误报。我曾经在一个广告点击率监控里搞了严格的3倍标准差阈值,结果双十一当天点击量暴增,全部被判定为异常,运维人员直接麻了。一定要给点异常配上业务时间段的白名单。

2.4 上下文异常

上下文异常说到底就是“看场合”。同一个数值,放在不同环境里,结论完全不一样。

场景正常值异常值为什么异常
工作日早上9点VPN登录1万次/小时VPN登录100次/小时上班时间应该高
凌晨3点VPN登录10次/小时VPN登录100次/小时凌晨正常极少,突然增加是异常
黑五期间日订单50万日订单10万大促期间不增反降
系统维护窗口QPS 0QPS 1万维护期间不应有流量

检测上下文异常,核心是拿到元数据——时间、位置、角色、业务阶段。举个例子,我负责过一个API网关,每分钟上报请求量。某天下午两点,请求量从1万降到100,按点异常看是下降,但查了日志发现是因为上游服务做了加权分流,那一分钟刚好把流量切到了另一个网关。这就是典型的上下文异常:数值本身没问题(100不是离谱的低),但结合“应该持续有流量”的上下文就不对了。

2.5 集体异常

集体异常不是看单个点,而是看一组数据点的整体行为是否跟预期模型不匹配。比如:

  • 波形变化:正常流量曲线是正弦波,突然变成平顶波。
  • 分布偏移:所有响应时间从“大部分在100ms以内”变成了“大部分在500ms以上”。
  • 关联关系破裂:正常情况下A指标和B指标正相关,突然变成负相关。

检测集体异常需要用到分布对比、聚类或序列分析。我记得有一次做CDN缓存命中率监控,正常命中率维持在85%左右。突然某个节点命中率掉到60%,但其他节点正常。单独看每个文件请求量都不算异常,但整体分布变了——大量的冷门文件被频繁请求,导致缓存雪崩。这就是集体异常:不是某个文件异常,而是请求模式的整体变异。

实用建议:在我的工作中,大约60%的线上故障是先通过集体异常感知到的(比如错误率集群上升),然后再用点异常定位具体主机。所以三类异常最好组合使用,不要依赖单一类型。

2.6 常见场景速查

我把平时容易遇到的三类异常场景整理成了一张表,方便你在设计监控方案时对照:

场景点异常上下文异常集体异常
金融交易单笔大额交易深夜大额转账同一账户短时间内大量小额交易
服务器监控CPU瞬间100%下班后流量突增集群整体内存泄漏
网络流量单个IP突发带宽非业务时间大流量DDoS攻击波形变化
用户行为单用户活跃次数激增新用户第一天买100件商品刷单团伙的批量行为
IoT传感器单传感器温度跳变设备离线后又上线但读数不变同一区域多个传感器同时漂移
数据库单次慢查询高峰时段全表扫描多台从库同时复制延迟

避坑指南:我曾经犯过的一个错误——给集体异常设置了一个静态的“变化幅度”阈值。结果某次业务版本更新后,API响应时间整体降低了20%,这明明是好事,却被判定为集体异常。后来我改用变化方向+幅度+持续时间三个维度来过滤,才算稳定。记住:集体异常不一定都是坏消息,也可能是优化效果。