如何用zabbix監控mysql多實例

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.建立模板架構

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

由於這個模板是 克隆 的默認 mysql監控模板,能夠忽略 items,triggers。 監控項都在 Discovery rules 裏。app

2.爲模板添加 自動發現宏(自動發現宏聲明的途徑就是下圖的腳本,腳本里只有生成固定的格式,zabbix就會認定他是 自動發現宏)socket

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

上圖 裏的 mysql.discovery 就是獲取 自動發現宏的 腳本,腳本是放在 agent端。工具

後面的 $MYSQLPORT 爲此腳本執行時帶的參數,$MYSQLPORT 是主機宏。性能

discovery rule 右邊的 filters 是過濾規則的意思,比方你 只想取腳本里的 某某 自動發現宏,就能夠在裏面設置。 這裏就只有一個自動發現宏,全部不作 配置。3d

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_discovery/mysql_filestype
相關文章
相關標籤/搜索