今天遇到了这样一件事。。Zabbix一直在用的数据库突然间崩溃,无法连接了。在down掉的那一时刻开始,zabbix向管理员报了警。然后随之而来的是铺天盖地的所有主机zabbix agent无法连接的告警。一时间引起大恐慌。。在events界面中看到的是很多闪红的trigger以及actions字段In progress(3 retries left)之类的信息。
在得到这个情况之后,我第一反应是打开了维护期。。后来想想确实是傻,因为事件已经触发,告警脚本的运行已经被排入执行队列中了。因此大量告警依然源源不断发出。打开维护期不行之后又想直接到数据库里删数据,可是不知道删什么表的数据合适,况且不能一不小心删过头把不该删的数据给删了。于是就放弃。
接下来收到反馈,建议我赶紧disable相关的action。这么做了,然而也在差不多的时候,所有未发出的警报也都悉数发出了。。至此,挽救误报行动失败ORZ
然后到测试环境上继续试验。首先小总结一下问题,就是探索当action处于In progress状态的时候怎么样操作才能让其发送失败。
继续刚才的方案,就是在In Progress的时候disable掉action。经过测试发现并没有用。当处于Progress状态的时候action就已经被触发,此时再disable为时已晚。
然后尝试了更加暴力一点的方案,修改告警脚本文件故意让它出错,或者直接改脚本名。这次奏效了。说明In Progress状态的action还没有加载告警脚本的代码,此时如果让代码出错或者改变脚本路径让程序找不到脚本都可以阻止告警的进一步发出。
但是多试验了几次之后发现也并不是完全一定这样。有时候,可能会发生还是成功发出报警的情况,有时也会发生页面上显示了绿色的发出报警但是实际上没发出,有时候时显示没发出也确实没发出。总之这个我估计就是看zabbix调用告警脚本和我们改告警脚本哪个手快的缘故。另外告警肯定是并发进行的,但并发不是无限量的,总的来说可能做不到拦下每一个误报,但是可以让大多数误报都不被发送出去。