agent上起了多了 mysql實例,佔用不一樣的端口,agent 僅在初始情況下,塞入腳本和 鍵配置,而後重啓。 之後維護的時候(mysql端口變更),要作到 不能 動agent,力爭 只在 web端 或者server端作修改 就能自動監控到對應端口。 |
用到的主要工具: 宏(分爲模板宏,主機宏,自動發現宏)mysql
主機宏格式:$MACRO (直接就能夠 填 值) 自動發現宏:#MACRO (須要配合 建立的 key 取值)
大致架構linux
1.agent主機 -- agent 主機建立 宏變量 $MYSQLPORT ,宏變量的值爲 Discovery rules的 自動發現腳本參數
2.模板 -- 模板裏建立自動發現規則,靠的是自動發現腳本,獲得自動發現宏變量。
3.監控項-- 在Discovery rules 裏建立監控項,監控項名稱和key值裏都有自動發現宏變量,會自動生成相關端口的監控項
4.客戶端 腳本和鍵建立,來支持整個架構運行web
搭建步驟sql
1.建立模板架構
由於這個模板是 克隆 的默認 mysql監控模板,能夠忽略 items,triggers。 監控項都在 Discovery rules 裏。app
2.爲模板添加 自動發現宏(自動發現宏聲明的途徑就是下圖的腳本,腳本里只有生成固定的格式,zabbix就會認定他是 自動發現宏)socket
上圖 裏的 mysql.discovery 就是獲取 自動發現宏的 腳本,腳本是放在 agent端。工具
後面的 $MYSQLPORT 爲此腳本執行時帶的參數,$MYSQLPORT 是主機宏。性能
discovery rule 右邊的 filters 是過濾規則的意思,比方你 只想取腳本里的 某某 自動發現宏,就能夠在裏面設置。 這裏就只有一個自動發現宏,全部不作 配置。3d
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_discovery/mysql_filestype