mysql多實例監控實錄
系統環境:
cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
內核版本:
uname -r
3.10.0-514.el7.x86_64
docker版本:
docker -v
Docker version 1.12.6, build 3a094bd/1.12.6
docker 相關鏡像版本:
docker.io/zabbix/zabbix-web-nginx-mysql latest
docker.io/zabbix/zabbix-server-mysql latest
docker.io/mysql 5.7
被監控mysql應用版本:
mysql-5.7.17-linux-glibc2.5-x86_64
Percona Monitoring Plugins版本:
寫在最前:若是zabbix server和zabbix agent已經經過其餘方式安裝,能夠直接跳過一、2步,直接從第3步開始看。
一、zabbix服務端咱們運行在docker容器內
因此服務器端先安裝docker服務
yum install -y epel-release
yum install -y docker #centos6.x版本的命令是yum install -y docker-io
而後運行docker服務
systemctl start docker
docker加入開機自啓動
systemctl enable docker
查看docker是否成功啓動
systemctl status docker
注:使用docker須要使用加速器,不然那龜速,本身體會吧。加速器daocloud和阿里雲均可以,我使用的前者。
2.安裝相關容器
2.1. mysql 容器
docker run --name mysql-server -t \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="ywwd.net" \
-e MYSQL_ROOT_PASSWORD="ywwd.net" \
-v /data/container/mysql/zabbix:/var/lib/mysql \
-v /etc/localtime:/etc/localtime:ro \
--restart=always \
-d mysql:5.7 \
--character-set-server=utf8 --collation-server=utf8_general_ci --sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
2.2. zabbix-server 容器
docker run --name zabbix-server-mysql -t \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="ywwd.net" \
-e MYSQL_ROOT_PASSWORD="ywwd.net" \
--link mysql-server:mysql \
-p 10051:10051 --restart=always \
-v /etc/localtime:/etc/localtime:ro \
-d zabbix/zabbix-server-mysql:latest
2.3. zabbix-web 容器(nginx)
docker run --name zabbix-web-nginx-mysql -t \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="ywwd.net" \
-e MYSQL_ROOT_PASSWORD="ywwd.net" \
--link mysql-server:mysql \
--link zabbix-server-mysql:zabbix-server \
-v /etc/localtime:/etc/localtime:ro \
-p 80:80 \
--restart=always \
-d zabbix/zabbix-web-nginx-mysql:latest
注意:這裏有個小問題,zabbix-web-nginx-mysql的啓動腳本/run_zabbix_component.sh中,指定了時區,不是中國的Asia/Shanghai,因此咱們要進入zabbix-web-nginx-mysql進行修改
2.4. 修改zabbix-web的時區
docker exec -it zabbix-web-nginx-mysql /bin/bash
TZ=${TZ:-"Asia/Shanghai"} 這裏改成Asia/Shanghai,不然zabbix-web端的時間會慢5個小時
sed -in 's#Europe/Riga#Asia/Shanghai#g' /run_zabbix_component.sh
修改時區後,須要重啓容器
docker restart zabbix-web-nginx-mysql
2.5. 在firewall防火牆放開zabbix-server和zabbix-agent的服務端口號
firewall-cmd --permanent --add-port=10050-10051/tcp
#--permanent永久生效,10050zabbix-agent服務端口,10051zabbix-server服務端口
firewall-cmd --reload
#更改後須要從新加載firewall防火牆
firewall-cmd --list-all
#最後查看配置是否生效
這樣zabbix-server端就已經安裝完畢
接下來客戶端咱們採用rpm包進行安裝
rpm -ivh zabbix-agent-3.2.6-1.el7.x86_64.rpm
一樣須要放開zabbix-agent端口
firewall-cmd --permanent --add-port=10050/tcp
firewall-cmd --reload
而後對zabbix-agent端進行配置
egrep -v '^$|^#' /etc/zabbix/zabbix_agentd.conf
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
Server=10.0.0.106 # <====zabbix-server端的IP地址
ServerActive=10.0.0.106 #<====zabbix-server端的IP地址,主動方式
Hostname=10.0.0.107 #<====zabbix-agent端的IP地址或者主機名
Include=/etc/zabbix/zabbix_agentd.d/*.conf
而後在zabbix-server端的web界面進行主機添加
1)修改主機名稱,要跟zabbix-agent的配置文件中的Hostname相對應
2)選擇你想設置的羣組,若是羣組不存在,能夠在下面一欄新的羣組中進行添加
3)指定zabbix-agent端的IP地址或者域名(端口號通常變)
其餘保持默認,點擊添加便可
三、利用Percona Monitoring Plugins插件進行MySQL多實例的監控
1)percona監控zabbix的腳本是使用php寫的,因此須要準備好php運行環境,這裏直接用yum安裝就能夠知足要求了:
yum install -y php php-mysql
2)安裝percona-zabbix-templates
也可配置Percona yum倉庫後安裝,建議配置percona的yum源,由於做爲一個DBA你確定會用到percona toolkit套件。 注:我沒有用這種方式,percona toolkit我是經過源碼包安裝的。
yum install -y https://www.percona.com/redir/downloads/percona-release/redhat/latest/percona-release-0.1-3.noarch.rpm
yum install -y percona-zabbix-templates
四、yum安裝的shell爲單實例版,因此咱們要進行相關修改,這裏已經有小夥伴進行了修改,咱們直接克隆,進行對比,須要先安裝git
1)對比後,咱們發如今get_mysql_stats_wrapper.sh腳本中,添加了相關參數
PORT=$2
HOST=127.0.0.1
2)CMD="/usr/bin/php -q $DIR/ss_get_mysql_stats.php --host $HOST --items $ITEM --port $PORT"
CMD變量的php路徑必定要指定正確,不然會報錯,咱們在後面添加了 --port $PORT
CACHEFILE改成判斷
if [ $PORT == 3306 ];then
CACHEFILE="/tmp/$HOST-mysql_cacti_stats.txt"
else
CACHEFILE="/tmp/$HOST-mysql_cacti_stats.txt":$PORT
fi
3)running-slave進行以下修改,此處報警跟模板中的另外一個Slave Stopped是重疊的,不過這個比Slave Stopped要靈敏,大概提早3分鐘左右報警,不過須要在/etc/my.cnf以及腳本中添加mysql的帳號和密碼等信息,各有利弊吧
if [ "$ITEM" = "running-slave" ]; then
# Check for running slave
RES=`HOME=~zabbix /usr/local/mysql/bin/mysql -P$PORT -h127.0.0.1 -uzabbix -e 'SHOW SLAVE STATUS\G' | egrep '(Slave_IO_Running|Slave_SQL_Running):' | grep -i yes|wc -l `
if [ "$RES" -ne 2 ]; then
echo 1
else
echo 0
fi
exit
並在/etc/my.cnf中添加
[mysql]
password=123456 #存在安全隱患,可是若是把權限改小,可能會獲取不到值,由於是經過zabbix用戶去運行的腳本,裏面只是密碼,並且帳號只能本機登陸,因此問題也不大,可是要嚴格控制其餘3個shell腳本的權限。
4)#cat $CACHEFILE | sed 's/ /\n/g; s/-1/0/g'| grep $ITEM | awk -F: '{print $2}'
這一列改成:
cat $CACHEFILE | sed 's/ /\n/g'| grep $ITEM | awk -F: '{print $2}' 或者
cat $CACHEFILE | sed 's/ /\n/g; s/-1/1/g'| grep $ITEM | awk -F: '{print $2}'
改成第一個,在zabbix-server的web端配置報警閾值爲小於0,或者等於1的時候報警,
改成第二行,能夠統一設置報警閾值爲等於1,由於這個問題,困擾了我很久
五、修改自動發現腳本
cat mysql_low_discovery.sh
#!/bin/bash
#Fucation:mysql low-level discovery
#Script_name mysql_low_discovery.sh
discovery() {
port=($(sudo ss -tpln | awk -F "[ :]+" '/[m]ysql/ {print $4}'))
printf '{\n'
printf '\t"data":[\n'
for key in ${!port[@]}
do
if [[ "${#port[@]}" -gt 1 && "${key}" -ne "$((${#port[@]}-1))" ]];then
socket=`ps aux|grep ${port[${key}]}|grep -v grep|awk -F '=' '{print $9}'|cut -d ' ' -f 1`
printf '\t {\n'
printf "\t\t\t\"{#MYSQLPORT}\":\"${port[${key}]}\"},\n"
else [[ "${key}" -eq "((${#port[@]}-1))" ]]
socket=`ps aux|grep ${port[${key}]}|grep -v grep|awk -F '=' '{print $9}'|cut -d ' ' -f 1`
printf '\t {\n'
printf "\t\t\t\"{#MYSQLPORT}\":\"${port[${key}]}\"}\n"
fi
done
printf '\t ]\n'
printf '}\n'
}
discovery
注意:因爲此處使用了 sudo ,因此要把zabbix用戶加上sudo權限,且只能執行 ss命令
echo 'zabbix ALL=(ALL) NOPASSWD:/usr/sbin/ss'>>/etc/sudoers
修改ss_get_mysql_stats.php腳本
$mysql_user = 'zabbix'; <=====此爲php登陸mysql的用戶
$mysql_pass = 123456; <=====此爲php登陸mysql的密碼
$mysql_port = NULL; <=====端口和socket要改成NULL
$mysql_socket = NULL;
修改userparameter_percona_mysql.conf 配置文件
把每行中的逗號',' 替換爲[*],
sed -in 's#,#[*],#g' userparameter_percona_mysql.conf
在每行後面添加 $1
sed -in 's#$#$1#g' userparameter_percona_mysql.conf
最後在首行添加端口自動發現腳本
sed -in '1i UserParameter=MySQL.discovery,/bin/bash /var/lib/zabbix/percona/scripts/mysql_low_discovery.sh' userparameter_percona_mysql.conf
六、複製腳本文件並執行權限
mkdir -p /var/lib/zabbix/percona/scripts/
cp userparameter_percona_mysql.conf /etc/zabbix/zabbix_agentd.d/
cp get_mysql_stats_wrapper.sh /var/lib/zabbix/percona/scripts/
cp mysql_low_discovery.sh /var/lib/zabbix/percona/scripts/
cp ss_get_mysql_stats.php /var/lib/zabbix/percona/scripts/
chmod 700 /var/lib/zabbix/percona/scripts/*
chown -R zabbix. /var/lib/zabbix/
七、最後必定要在全部的庫上面作受權操做,不然拿不到監控數據
GRANT SELECT, PROCESS, SUPER, REPLICATION CLIENT ON *.* TO 'zabbix'@'localhost' identified by '123456';
flush privileges;
八、最後把模板Mysql_Multiport.xml導入到zabbix-server內,全部用到的腳本文件都已經添加到附件中,你們能夠下載使用。
建立觸發器原型
在zabbix-server端,添加觸發器
依次點擊 主機===>自動發現===>觸發器類型===>點擊右上角的建立觸發器原型
分配報警級別,點擊表達式欄的添加,選擇選擇原型
而後選擇 例如:
MySQL.slave-stopped[{#MYSQLPORT}]
選擇最新的T值小於N
N爲0
注:若是在第4.4中指定的是cat $CACHEFILE | sed 's/ /\n/g; s/-1/1/g'| grep $ITEM | awk -F: '{print $2}'
選擇最新的T值等於N
N爲1
而後咱們能夠手動中止主從複製,稍等片刻,就會發了報警信息
博客園不容許放附件,因此我只能把附件放在百度雲了
http://pan.baidu.com/s/1slFGVoT
參考文章:
https://github.com/hc-dba/Mysql_Multiport_monitor_used_zabbix
另外能夠添加微信和郵件告警,這裏推薦下面的博文