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已经通过其他方式安装,可以直接跳过1、2步,直接从第3步开始看。
1、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地址或者域名(端口号一般变)
其他保持默认,点击添加即可
3、利用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
4、yum安装的shell为单实例版,所以我们要进行相关修改,这里已经有小伙伴进行了修改,我们直接克隆,进行对比,需要先安装git
git clone https://github.com/lianghx7123/Mysql_Multiport_monitor_used_zabbix.git mysql_monitor
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 STATUSG' | 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/ /
/g; s/-1/0/g'| grep $ITEM | awk -F: '{print $2}'
这一列改为:
cat $CACHEFILE | sed 's/ /
/g'| grep $ITEM | awk -F: '{print $2}' 或者
cat $CACHEFILE | sed 's/ /
/g; s/-1/1/g'| grep $ITEM | awk -F: '{print $2}'
改为第一个,在zabbix-server的web端配置报警阈值为小于0,或者等于1的时候报警,
改为第二行,可以统一设置报警阈值为等于1,因为这个问题,困扰了我好久
5、修改自动发现脚本
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 '{
'
printf ' "data":[
'
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 ' {
'
printf " "{#MYSQLPORT}":"${port[${key}]}"},
"
else [[ "${key}" -eq "((${#port[@]}-1))" ]]
socket=`ps aux|grep ${port[${key}]}|grep -v grep|awk -F '=' '{print $9}'|cut -d ' ' -f 1`
printf ' {
'
printf " "{#MYSQLPORT}":"${port[${key}]}"}
"
fi
done
printf ' ]
'
printf '}
'
}
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
6、复制脚本文件并执行权限
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/
7、最后一定要在所有的库上面做授权操作,否则拿不到监控数据
GRANT SELECT, PROCESS, SUPER, REPLICATION CLIENT ON *.* TO 'zabbix'@'localhost' identified by '123456';
flush privileges;
8、最后把模板Mysql_Multiport.xml导入到zabbix-server内,所有用到的脚本文件都已经添加到附件中,大家可以下载使用。
创建触发器原型
在zabbix-server端,添加触发器
依次点击 主机===>自动发现===>触发器类型===>点击右上角的创建触发器原型
分配报警级别,点击表达式栏的添加,选择选择原型
然后选择 例如:MySQL.slave-stopped[{#MYSQLPORT}]
选择最新的T值小于N
N为0
注:如果在第4.4中指定的是cat $CACHEFILE | sed 's/ /
/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
另外可以添加微信和邮件告警,这里推荐下面的博文