今天遇到了這樣一件事。。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調用告警腳本和我們改告警腳本哪個手快的緣故。另外告警肯定是並發進行的,但並發不是無限量的,總的來說可能做不到攔下每一個誤報,但是可以讓大多數誤報都不被發送出去。