如何用zabbix監控mysql多例項
agent上起了多了 mysql例項,佔用不同的埠,agent 僅在初始狀況下,塞入指令碼和 鍵配置,然後重啟。 以後維護的時候(mysql埠變動),要做到 不能 動agent,力爭 只在 web端 或者server端做修改 就能自動監控到對應埠。 |
用到的主要工具: 巨集(分為模板巨集,主機巨集,自動發現巨集)
主機巨集格式:$MACRO (直接就可以 填 值) 自動發現巨集:#MACRO (需要配合 建立的 key 取值)
大體架構
1.agent主機 -- agent 主機建立 巨集變數 $MYSQLPORT ,巨集變數的值為 Discovery rules的 自動發現
2.模板 -- 模板裡建立自動發現規則,靠的是自動發現指令碼,得到自動發現巨集變數。
3.監控項-- 在Discovery rules 裡建立監控項,監控項名稱和key值裡都有自動發現巨集變數,會自動生成相關埠的監控項
4.客戶端 指令碼和鍵建立,來支援整個架構執行
搭建步驟
1.建立模板
因為這個模板是 克隆 的預設 mysql監控模板,可以忽略 items,triggers。 監控項都在 Discovery rules 裡。
2.為模板新增 自動發現巨集(自動發現巨集宣告的途徑就是下圖的指令碼,腳本里只有生成固定的格式,zabbix就會認定他是 自動發現巨集)
上圖 裡的 mysql.discovery 就是獲取 自動發現巨集的 指令碼,指令碼是放在 agent端。
後面的 $MYSQLPORT 為此指令碼執行時帶的引數,$MYSQLPORT 是主機巨集。
discovery rule 右邊的 filters 是過濾規則的意思,比方你 只想取腳本里的 某某 自動發現巨集,就可以在裡面設定。 這裡就只有一個自動發現巨集,所有不做 配置。
3.建立監控項(監控項和監控的指令碼都是要改的,因為自動發現功能,至少指令碼會多了一個引數)
4.建立 主機巨集
點開主機,新增主機巨集,巨集名稱是 自動發現腳本里的 引數, 巨集的值就是 此 主機上需要監控的埠。
這樣就實現了 只要改動主機巨集的 值,就可以改變主機巨集的監控項。
指令碼展示
1.discovery_mysql.sh 自動發現埠指令碼 (網上抄的指令碼做了修改)
res=`echo $1| sed "s/_/\n/g"`; port=($res) printf '{\n' printf '\t"data":[\n' for key in ${!port[@]} do if [[ "${#port[@]}" -gt 1 && "${key}" -ne "$((${#port[@]}-1))" ]]; then printf '\t {\n' printf "\t\t\t\"{#MYSQLPORT}\":\"${port[${key}]}\"},\n" else [[ "${key}" -eq "((${#port[@]}-1))" ]] printf '\t {\n' printf "\t\t\t\"{#MYSQLPORT}\":\"${port[${key}]}\"}\n" fi done printf '\t ]\n' printf '}\n'
執行例項: 以_ 為分隔符,格式化輸出 自動發現巨集
./discovery_mysql.sh 3306_3307_3308
{ "data":[ { "{#MYSQLPORT}":"3306"}, { "{#MYSQLPORT}":"3307"}, { "{#MYSQLPORT}":"3308"} ] }
2.mysql_filestype.sh 監控mysql的一些掛載盤
var=$1 MYSQL_PORT=$2 MYSQL_NAME=`ps -ef |grep '/mysql/app/bin/mysqld'| grep "$MYSQL_PORT" |grep -v grep | awk -F" " '{print $11}' |awk -F"/" '{print $2}'` ; MYSQL_SOCk_DIR="/$MYSQL_NAME/" ; df -h "${MYSQL_SOCk_DIR}${var}" |grep -v Filesystem |awk -F" " '{print $5}' | awk -F"%" '{print $1}' ;
3.mysql_ping.sh 監控mysql狀態
MYSQL_PORT=$1; [ "${MYSQL_USER}" = '' ] && MYSQL_USER=xxx [ "${MYSQL_PASSWORD}" = '' ] && MYSQL_PASSWORD=xxxxx mysqladmin=/mysql/app/bin/mysqladmin ; MYSQL_SOCk_DIR=`ps -ef |grep 'mysql'| grep "${MYSQL_PORT}" |grep -v 'grep' | awk -F" " '{print $16}'` ; ${mysqladmin} -u${MYSQL_USER} -p${MYSQL_PASSWORD} ${MYSQL_SOCk_DIR} ping 2> /dev/null |grep 'alive'|wc -l ;
注意: 這邊連線例項 都是 mysql -u -p -S /xxx/mysql.sock
但是後來發現部分客戶端總是無法正確顯示值,而且就是這條 語句報錯, 感覺是環境變數的問題
所以拿 --socket=/xxx/mysql.sock 來代替 -S/xxx/mysql.sock 。 這裡的變數${MYSQL_SOCk_DIR} 就是--socket=/xxx/mysql.sock 。
4.mysql_repl.sh mysql主從狀態監控
var=$1 MYSQL_PORT=$2 MYSQL_SOCk_DIR=`ps -ef |grep 'mysql'| grep "${MYSQL_PORT}" |grep -v 'grep' | awk -F" " '{print $16}'` ; mysql=/mysql/app/bin/mysql [ "${MYSQL_USER}" = '' ] && MYSQL_USER=xxx [ "${MYSQL_PASSWORD}" = '' ] && MYSQL_PASSWORD=xxxx ${mysql} -u${MYSQL_USER} -p${MYSQL_PASSWORD} ${MYSQL_SOCk_DIR} -e "show slave status\G;" 2> /dev/null |grep "\b${var}\b"|awk -F" " '{print $2}' ;
主從狀態 有幾個埠的值是 空的, 這個得 具體問題具體設定
5.mysql_status2 mysql效能之類的監控
mysql=/mysql/app/bin/mysql var=$1 MYSQL_PORT=$2 [ "${MYSQL_USER}" = '' ] && MYSQL_USER=xxx [ "${MYSQL_PASSWORD}" = '' ] && MYSQL_PASSWORD=xxxxx MYSQL_SOCk_DIR=`ps -ef |grep 'mysql'| grep "${MYSQL_PORT}" |grep -v 'grep' | awk -F" " '{print $16}'` ; ${mysql} -u${MYSQL_USER} -p${MYSQL_PASSWORD} ${MYSQL_SOCk_DIR} -e "show global status;" 2> /dev/null |grep -v Variable_name|grep "\b${var}\b"|awk '{print $2}' ;
發現有些監控項 或因為數字過長而無法顯示,待解決
6.mysql_version.sh mysql版本監控
MYSQL_PORT=$1; MYSQL_SOCk_DIR=`ps -ef |grep 'mysql'| grep "${MYSQL_PORT}" |grep -v 'grep' | awk -F" " '{print $16}'` ; mysql=/mysql/app/bin/mysql ; [ "${MYSQL_USER}" = '' ] && MYSQL_USER=xxx [ "${MYSQL_PASSWORD}" = '' ] && MYSQL_PASSWORD=xxxx ${mysql} -u${MYSQL_USER} -p${MYSQL_PASSWORD} ${MYSQL_SOCk_DIR} -e "select version();" 2> /dev/null |awk 'END {print}'
7.mysql_status_many.conf 生成可用鍵 配置檔案
UserParameter=mysql.discovery[*],/patrol/zabbix/bin/duoshili_discovery/discovery_mysql.sh $1 UserParameter=mysql.status_many[*],/patrol/zabbix/bin/duoshili_discovery/mysql_status2 $1 $2 UserParameter=mysql.ping_many[*],/patrol/zabbix/bin/duoshili_discovery/mysql_ping.sh $1 UserParameter=mysql.version_many[*],/patrol/zabbix/bin/duoshili_discovery/mysql_version.sh $1 UserParameter=mysqlcheck_repl[*],/patrol/zabbix/bin/duoshili_discovery/mysql_repl.sh $1 $2 UserParameter=mysql.filestyle_many[*],/patrol/zabbix/bin/duoshili_discov