2. 异常模式的定义与分类
聊异常之前,咱们得先搞明白一件事:什么才算异常?
我在生产环境摸爬滚打这么多年,见过太多所谓的“异常”其实只是正常波动。比如服务器CPU偶尔飙到80%,这不算事儿。但如果持续10分钟下不来,那就得警惕了。异常模式,说白了就是偏离正常行为的数据模式。它不是随机噪声,而是有规律、有意义的偏差。
2.1 什么是异常模式
异常模式可以理解成系统状态中的“不对劲”。它可能是一次信用卡盗刷,也可能是某个传感器的读数突然跳了三个数量级。我习惯把它拆成两个层面:
- 形态层面:这个偏差长什么样?是孤立的点?还是一串连续的波动?
- 语义层面:这个偏差在业务上意味着啥?是欺诈?是故障?还是配置变更?
你想想看,一个点异常在某个场景下可能是小问题,但在另一个场景下就可能是大事故。所以定义异常模式,不能只看数据,还要结合上下文。
我的经验:有一次告警系统半夜狂叫,说我负责的数据库查询延迟飙到10秒。我一看,那个时间点刚好在跑凌晨的统计任务,正常情况就应该慢。如果没做上下文校验,那就是个“假异常”。所以定义异常模式时,一定要把业务上下文带上。
2.2 异常的类型
学术界把异常分成三类,我在实际工作中发现这个分类非常实用。下面这张图把三类异常的关系讲清楚了:
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 0 | QPS 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%,这明明是好事,却被判定为集体异常。后来我改用变化方向+幅度+持续时间三个维度来过滤,才算稳定。记住:集体异常不一定都是坏消息,也可能是优化效果。