1. 程式人生 > >如何用zabbix監控mysql多例項

如何用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.建立模板

如何用zabbix監控mysql多例項如何用zabbix監控mysql多例項

因為這個模板是 克隆 的預設 mysql監控模板,可以忽略 items,triggers。 監控項都在 Discovery rules 裡。

2.為模板新增 自動發現巨集(自動發現巨集宣告的途徑就是下圖的指令碼,腳本里只有生成固定的格式,zabbix就會認定他是 自動發現巨集)

如何用zabbix監控mysql多例項如何用zabbix監控mysql多例項

上圖 裡的 mysql.discovery 就是獲取 自動發現巨集的 指令碼,指令碼是放在 agent端。

後面的 $MYSQLPORT 為此指令碼執行時帶的引數,$MYSQLPORT 是主機巨集。

discovery rule 右邊的 filters 是過濾規則的意思,比方你 只想取腳本里的 某某 自動發現巨集,就可以在裡面設定。 這裡就只有一個自動發現巨集,所有不做 配置。

3.建立監控項(監控項和監控的指令碼都是要改的,因為自動發現功能,至少指令碼會多了一個引數)

如何用zabbix監控mysql多例項如何用zabbix監控mysql多例項

4.建立 主機巨集

如何用zabbix監控mysql多例項如何用zabbix監控mysql多例項

點開主機,新增主機巨集,巨集名稱是 自動發現腳本里的 引數, 巨集的值就是 此 主機上需要監控的埠。

這樣就實現了 只要改動主機巨集的 值,就可以改變主機巨集的監控項。

指令碼展示

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