2. 告警风暴成因分析
告警风暴这事儿,我见过太多次了。说白了,就是监控系统在短时间内疯狂输出告警,运维同学手机被打爆,群里刷屏刷到卡死。为什么会这样?
我个人的经验是,告警风暴从来不是单一原因造成的。它像多米诺骨牌,一个倒了,后面全跟着倒。今天咱们就掰开揉碎,看看这四类最常见的成因。
2.1 监控项配置不当
这是最基础,也是最容易被忽视的问题。我刚开始做监控那会儿,也犯过这种错。
典型表现:
- 监控粒度过细:比如对每个容器的每个进程都采集CPU,一个节点上百个指标,集群一扩,告警量直接爆炸。
- 重复采集:同一个指标,被三个不同的监控系统同时采集。我记得有个项目,磁盘使用率被Prometheus、Zabbix、自研Agent各采了一遍,告警重复了三倍。
- 无效指标:采集了根本没人看的指标。比如某个临时目录的inode使用率,业务跑完就删了,你告警它干嘛?
核心原则: 只监控你真正需要关心的东西。每加一个监控项,都要问自己一句:「这个告警来了,我打算怎么处理?」
2.2 阈值设置不合理
阈值设得太松,告警漏报;设得太紧,告警风暴。这个平衡点,说实话,很难一次找准。
我见过最离谱的案例:
- 静态阈值一刀切:所有机器的CPU阈值都设成80%。白天高峰期和凌晨低谷期,告警量天差地别。
- 阈值过于敏感:有个团队把内存使用率阈值设成了50%。结果每次业务发布,内存短暂冲高,告警就哗啦啦地来。其实业务稳定后内存就降回去了。
- 没有设置告警抑制:比如网络抖动,1分钟内波动了10次,结果发了10条告警。其实你设个「连续3次超过阈值才告警」,就能过滤掉大部分噪音。
我的建议: 阈值设置要分时段、分业务。核心业务的阈值可以紧一点,非核心的松一点。另外,多用动态阈值,让系统自己学习历史数据。
2.3 依赖关系缺失
这是告警风暴的「放大器」。没有依赖关系,一个底层故障,能引发上层所有服务的告警。
举个例子:
数据库挂了,按理说只发一条「数据库不可用」就够了。但如果没有依赖关系,所有依赖这个数据库的服务都会告警——「服务A响应超时」「服务B连接失败」「服务C数据查询异常」……
我曾经处理过一个事故:一个Redis集群宕机,结果引发了2000多条告警。排查下来,真正需要关注的只有3条。剩下的全是连锁反应。
避坑指南: 我曾经在搭建监控系统时,忽略了服务依赖关系的配置。结果每次底层基础设施出问题,上层业务告警就像雪崩一样。后来我花了整整两天,把所有服务的依赖关系梳理清楚,才把这个问题根治。
依赖关系缺失的常见场景:
- 基础设施层(网络、存储、计算)与业务层没有关联
- 微服务之间的调用链没有映射到告警规则中
- 中间件(数据库、缓存、消息队列)的故障没有向上传递
2.4 代码缺陷引发连锁反应
这个成因,说实话,最让人头疼。因为代码缺陷往往不是监控系统能提前预判的。
典型场景:
- 死循环或内存泄漏:某个服务因为代码bug,CPU飙升到100%。然后所有依赖这个服务的调用方都开始超时,告警像滚雪球一样越滚越大。
- 配置错误:我记得有一次,一个同事把连接池的最大连接数配成了1。结果并发一上来,所有请求都排队,响应时间从10ms飙到10秒。告警系统直接炸了。
- 版本回退:新版本上线后发现问题,紧急回退。但回退过程中,新旧版本的接口不兼容,导致大量调用失败。告警量瞬间翻倍。
关键认知: 代码缺陷引发的告警风暴,往往不是监控系统的问题,而是研发流程的问题。但作为运维,我们要能快速识别出「这是代码问题,不是基础设施问题」,从而精准定位。
知识体系总览
下面这张图,是我自己梳理的告警风暴成因分析框架。你可以把它当作一个检查清单,每次遇到告警风暴,按图索骥去排查。
小结
告警风暴的四个成因,其实可以分成两类:
- 配置类问题(监控项、阈值、依赖关系)—— 这些是运维可以直接优化的
- 代码类问题 —— 这个需要和研发团队协作解决
我个人习惯是,先解决配置类问题,因为见效快。把监控项砍掉一半,阈值调合理,依赖关系补上,告警量至少能降70%。剩下的代码问题,再慢慢推动研发去优化。
嗯,今天就先聊到这儿。下一章咱们具体讲讲,怎么一步步治理这些成因。