簡述
在生產環境中,有一台mysql的備份服務器,上面運行着三個數據庫實例的從庫,也在做日志的同步工作,為了實現對該備份服務器的監控,當出現從庫實例不為3或者日志同步進程不為3的時候,產生告警通知,生產使用的是zabbix監控。就想着自己寫一個監控的item,通過定時取值,然后設置觸發器,當有告警的時候進行通知。
在設計的時候就沒有想到什么比較厲害的方法,只是通過ps查看進程的方式,獲取mysqld_safe的數量,因為運行了三個從庫實例,自己寫的多實例啟動腳本,在腳本中就是通過該命令啟動的數據庫,所以在做的時候就是過濾這個關鍵字。
對於日志的同步,也是用的這種方式進行統計的。
過程
1.編寫監控命令
在設計的時候,選擇使用ps命令,過濾的命令和結果如下:
[root@mysqlbackup opt]# ps -ef|grep mysqld_safe|grep -v grep|wc -l
3
[root@mysqlbackup opt]# ps -ef|grep mysqlbinlog|grep -v grep|wc -l
3
上面就是直接過濾關鍵字,而獲取到值,因為需求很簡單,只有當着兩個值,不為3的時候,就說明出現了mysql的同步異常,這個時候就需要發送告警通知給管理員來進行處理了。所以這兩條命令就可以了。
為了寫的高端一點,選擇的是寫腳本的方式,因為過濾的命令格式都是一樣的,只有關鍵字是不同的,所以寫個腳本case一下。腳本如下:
[root@mysqlbackup opt]# cat instance_count.sh
#/bin/bash
# monitor mysql instance and binlog instance
function instance_count(){
NAME=$1
# /bin/ps -ef|grep $NAME|grep -v grep|wc -l
case $NAME in
1)
/bin/ps -ef|grep mysqld_safe|grep -v grep|wc -l
;;
2)
/bin/ps -ef|grep mysqlbinlog|grep -v grep|wc -l
;;
*)
echo "Usage $0 {mysql|mysqlbinlog}"
esac
}
main(){
instance_count $1
}
main $1
實際上就是通過參數的形式,將要獲取的值傳入,然后返回,可以通過本地執行的方式,獲取這些值。獲取mysql實例數是參數1,獲取mysqlbinlog日志同步的實例數是參數2,輸入其他參數,直接報錯。
2.編寫item_key
基於之前的腳本,在zabbix-agentd.d目錄下,編寫一個conf文件,用來定義key,調用剛才創建的腳本進行傳參。
[root@mysqlbackup opt]# cat /etc/zabbix/zabbix_agentd.d/mysql.conf
#UserParameter=mysql.MysqlInstanceCount,ps -ef|grep mysqld_safe |grep -v grep|wc -l
#UserParameter=mysql.MysqlbinlogCount,ps -ef|grep mysqlbinlog |grep -v grep|wc -l
UserParameter=instance.count[*],/opt/instance_count.sh $1
腳本編寫完成之后,需要重啟zabbix-agent才能生效。
3.獲取item
在zabbix-server上通過zabbix_get命令。獲取指定的值。
[root@Zabbix-server zabbix]# zabbix_get -s 10.2.86.120 -p 10050 -k instance.count[2]
3
[root@Zabbix-server zabbix]# zabbix_get -s 10.2.86.120 -p 10050 -k instance.count[1]
3
在zabbix-server上能夠通過命令成功獲取這些值,表明該item已經可以使用,下面就可以開始在web頁面上進行配置了。
4.item配置
在這里我選擇的是創建一個模板,然后在模板中創建一個應用application,然后再創建兩個item,name分別為MySQLInstanceCount和MySQLBinlogCount,對應的key值分別為instance.count[1]和instance.count[2],至於取數周期和保留期,可以選擇默認,也可以適當調整。
配置完成后,就可以在最新數據中,獲取這兩個值。
5.觸發器配置trigger
為了實現告警短信的通知,選擇配置兩個觸發器,當出現值不為3的時候,就觸發告警,開始選擇用的是last方法,意思就是獲取該item的最近的一個值。當該值不為3的時候,則產生告警,編輯的表達式如下所示:
{mysql:instance.count[1].last()}<>3
后來考慮到誤報,或者是短時間的異常告警,所以修改了表達式,選擇的是count,當最近的5次采集中,不為3的采集大於2次時,就產生告警。這樣也就減少了告警的頻次。
{mysql:instance.count[1].count(#5,3,ne,0)}>2