实战案例(Zabbix监控MySQL主机)

家资是何物,积帙列梁梠。这篇文章主要讲述实战案例:Zabbix监控MySQL主机相关的知识,希望能为你提供帮助。
1.Zabbix监控mysql的规划        在用Zabbix做监控,创建监控项之前要尽量规划好要监控什么、如何监控、监控数据如何存放、监控数据如何展现、异常情况报警、报警处置等。本次实践采用自行编写的MySQL监控脚本( /etc/zabbix/zabbix_agentd.d/check_mysql.sh )和 Zabbix默认的MySQL监控模板相结合的方式,来实现Zabbix对MySQL的监控。

2.准备MySQL主机在IP:192.168.250.48 服务器上通过自定义yum源方式,安装MySQL8.0。

#################################################################################
#### MySQL主机上也要先安装 zabbix-agent
[root@CentOS84-IP48 ]#rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/8/x86_64/zabbix-release-6.0-1.el8.noarch.rpm
[root@CentOS84-IP48 ]#dnf clean all
[root@CentOS84-IP48 ]#dnf -y install zabbix-agent
[root@CentOS84-IP48 ]#systemctl enable --now zabbix-agent

#################################################################################
#### 安装mysql80的yum源,并安装启动MYSQL
[root@CentOS84-IP48 ]#wget https://repo.mysql.com//mysql80-community-release-el8-1.noarch.rpm
[root@CentOS84-IP48 ]#rpm -ivh mysql80-community-release-el8-1.noarch.rpm
[root@CentOS84-IP48 ]#dnf install -y mysql-server

[root@CentOS84-IP48 ]#systemctl enable --now mysqld.service
[root@CentOS84-IP48 ]#ss -tln
StateRecv-QSend-QLocal Address:PortPeer Address:PortProcess
LISTEN070*:33060*:*
LISTEN0151*:3306*:*
[root@CentOS84-IP48 ]#

## 数据库安全初始化
[root@CentOS84-IP48 ]#find / -name mysql_secure_installation
/usr/bin/mysql_secure_installation
[root@CentOS84-IP48 ]#mysql_secure_installation

#################################################################################
#### 授权mysql用户zabbix可以登录并查询(在zabbix的agent客户端将要查询需要的监控数据)
## 利用前面设定的root密码登录到mysql
[root@CentOS84-IP48 ]#mysql -uroot -pshone2022
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.Commands end with ; or \\g.
Your MySQL connection id is 11
Server version: 8.0.26 Source distribution

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type help; or \\h for help. Type \\c to clear the current input statement.

mysql> show databases;
+--------------------+
| Database|
+--------------------+
| information_schema |
| mysql|
| performance_schema |
| sys|
+--------------------+
4 rows in set (0.01 sec)

mysql>

mysql> show master logs;
+---------------+-----------+-----------+
| Log_name| File_size | Encrypted |
+---------------+-----------+-----------+
| binlog.000001 |446 | No|
+---------------+-----------+-----------+
1 row in set (0.00 sec)

mysql>


mysql> select user,host from mysql.user;
+------------------+-----------+
| user| host|
+------------------+-----------+
| mysql.infoschema | localhost |
| mysql.session| localhost |
| mysql.sys| localhost |
| root| localhost |
+------------------+-----------+
4 rows in set (0.01 sec)

## 不支持一次性完成创建和授权操作
mysql> grant all on *.* to zabbix@localhost identified by shone2022;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near identified by shone2022 at line 1

##
mysql> select user,host from mysql.user;
+------------------+-----------+
| user| host|
+------------------+-----------+
| mysql.infoschema | localhost |
| mysql.session| localhost |
| mysql.sys| localhost |
| root| localhost |
+------------------+-----------+
4 rows in set (0.00 sec)

mysql> create user zabbix@"%" identified by shone2022;
Query OK, 0 rows affected (0.02 sec)

mysql> select user,host from mysql.user;
+------------------+-----------+
| user| host|
+------------------+-----------+
| zabbix| %|
| mysql.infoschema | localhost |
| mysql.session| localhost |
| mysql.sys| localhost |
| root| localhost |
+------------------+-----------+
5 rows in set (0.00 sec)

## 授权zabbix用户可以获取数据
mysql> grant all privileges on *.* to zabbix@"%";
Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql>

3.自定义监控命令和监控脚本      本部分将详细介绍如何编写和测试监控命令、脚本,并验证运行效果。自定义脚本监控扩展Agent的思路:Zabbix Server与Agent之间监控数据的采集主要是通过Zabbix Server主动向Agent询问某个Key的值,Agent会根据Key去调用相应的函数(或者命令等)去获取这个值并返回给Server端。Zabbix的Agent本并没有内置MySQL的监控功能(但是Server端提供了相应的Template配置),所以我们需要使用Zabbix的User Parameters功能,为MySQL添加监控脚本。


3.1编写监控MySQL的版本和存活状态的命令行
#### zabbix agent端
#################################################################################
#### mysql存活检测
##利用UserParameter参数自定义Agent Key来完成。采用mysqladmin这个工具来实现,下面是整个编写、校验的全流程记录,对于要自己动手编写监控项脚本和命令具有指导意义。
[root@CentOS84-IP48 ]#mysqladmin -h 127.0.0.1 -u zabbix -pshone2022 ping
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
mysqld is alive

## 如果MySQL状态正常,会显示mysqld is alive,否则会提示连不上。对于服务器端,mysqld is alive表述,计算机程序语言不好处理的,服务器端最好接收1和0,1表示服务可用,0表示服务不可用。改进一下这个命令,如下:
[root@CentOS84-IP48 ]#mysqladmin -h 127.0.0.1 -u zabbix -pshone2022 ping | grep -c alive
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
1
[root@CentOS84-IP48 ]#

## 从上面的输出结果看,有mysqladmin: [Warning]信息,需要处置掉,基本方法就是将密码写在文件中
## 用户名和密码放在命令中对于以后的维护不好,所以我们在/etc/zabbix/下创建一个包含MySQL用户名和密码的配置文件“ .my.cnf ”,如下:

[root@CentOS84-IP48 ]#find / -name zabbix
/run/zabbix
/etc/zabbix
/var/lib/selinux/targeted/active/modules/100/zabbix
/var/lib/selinux/targeted/tmp/modules/100/zabbix
/var/log/zabbix
/usr/share/selinux/targeted/default/active/modules/100/zabbix
[root@CentOS84-IP48 ]#
[root@CentOS84-IP48 ]#ll /usr/bin/mysqladmin
-rwxr-xr-x 1 root root 7147544 Sep22021 /usr/bin/mysqladmin
[root@CentOS84-IP48 ]#ll /etc/zabbix
total 20
-rw-r--r-- 1 root root 16451 May3 15:30 zabbix_agentd.conf
drwxr-xr-x 2 root root6 May3 15:30 zabbix_agentd.d


## .my.cnf文件格式内容
[root@CentOS84-IP48 ]#vim /etc/zabbix/.my.cnf
[client]
user=zabbix
host=127.0.0.1
password=shone2022

##这个文件是隐藏文件,需要家 -a才能看到,同时注意必须注意写法 [client]字段必须有,否则执行命令时候报错。

[root@CentOS84-IP48 ]#ll -a /etc/zabbix/
total 36
drwxr-xr-x3 root root70 May 25 20:04 .
drwxr-xr-x. 144 root root8192 May 25 19:19 ..
-rw-r--r--1 root root55 May 25 20:01 .my.cnf
-rw-r--r--1 root root 16451 May3 15:30 zabbix_agentd.conf
drwxr-xr-x2 root root6 May3 15:30 zabbix_agentd.d
[root@CentOS84-IP48 ]#cat /etc/zabbix/.my.cnf
[client]
user=zabbix
host=127.0.0.1
password=shone2022
[root@CentOS84-IP48 ]#

## 有了密码文件后的命令进化为下面的格式
[root@CentOS84-IP48 ]#HOME=/etc/zabbix/ mysqladmin ping | grep -c alive
1

## 完成这步后需要做的就是将这个监控命令添加到Zabbix Agent中,并与一个Key对应,这样Zabbox Server就能通过这个Key获取MySQL的状态了。用mysql.ping作为MySQL状态的Key。将下面的命令行可以直接写在agent的配置文件中。

UserParameter=mysql.ping,HOME=/etc/zabbix/ mysqladmin ping | grep -c alive

3.2编写监控MySQL的性能脚本
        自行编写的脚本去监控MySQL的灵活性更强,可以获取自己想要的数据和状态。更适合去监控MySQL主从、主主、读写分离模式下的生产环境下的MySQL服务器。
#### 性能脚本
[root@CentOS84-IP48 ]#vim /etc/zabbix/zabbix_agentd.d/check_mysql.sh
[root@CentOS84-IP48 ]#cat /etc/zabbix/zabbix_agentd.d/check_mysql.sh
#!/bin/bash
# -------------------------------------------------------------------------------
# FileName: check_mysql.sh
# -------------------------------------------------------------------------------

# 用户名
MYSQL_USER=zabbix

# 密码
MYSQL_PWD=shone2022

# 主机地址/IP下面这个写法是agent 和数据库在同台机器上
MYSQL_HOST=127.0.0.1

# 端口
MYSQL_PORT=3306

# 数据连接
MYSQL_CONN="/usr/bin/mysqladmin -u$MYSQL_USER -p$MYSQL_PWD -h$MYSQL_HOST -P$MYSQL_PORT"

# 参数是否正确
if [ $# -ne "1" ]; then
echo "arg error!"
fi

# 获取数据
case $1 in
Uptime)
result=`$MYSQL_CONN status 2> /dev/null |cut -f2 -d":"|cut -f1 -d"T"`
echo $result
; ;
Com_update)
result=`$MYSQL_CONN extended-status2> /dev/null|grep -w "Com_update"|cut -d"|" -f3`
echo $result
; ;
Slow_queries)
result=`$MYSQL_CONN status2> /dev/null|cut -f5 -d":"|cut -f1 -d"O"`
echo $result
; ;
Com_select)
result=`$MYSQL_CONN extended-status2> /dev/null|grep -w "Com_select"|cut -d"|" -f3`
echo $result
; ;
Com_rollback)
result=`$MYSQL_CONN extended-status2> /dev/null|grep -w "Com_rollback"|cut -d"|" -f3`
echo $result
; ;
Questions)
result=`$MYSQL_CONN status2> /dev/null |cut -f4 -d":"|cut -f1 -d"S"`
echo $result
; ;
Com_insert)
result=`$MYSQL_CONN extended-status2> /dev/null|grep -w "Com_insert"|cut -d"|" -f3`
echo $result
; ;
Com_delete)
result=`$MYSQL_CONN extended-status2> /dev/null|grep -w "Com_delete"|cut -d"|" -f3`
echo $result
; ;
Com_commit)
result=`$MYSQL_CONN extended-status2> /dev/null|grep -w "Com_commit"|cut -d"|" -f3`
echo $result
; ;
Bytes_sent)
result=`$MYSQL_CONN extended-status2> /dev/null|grep -w "Bytes_sent" |cut -d"|" -f3`
echo $result
; ;
Bytes_received)
result=`$MYSQL_CONN extended-status2> /dev/null|grep -w "Bytes_received" |cut -d"|" -f3`
echo $result
; ;
Com_begin)
result=`$MYSQL_CONN extended-status2> /dev/null|grep -w "Com_begin"|cut -d"|" -f3`
echo $result
; ;

*)
echo "Usage:$0(Uptime|Com_update|Slow_queries|Com_select|Com_rollback|Questions|Com_insert|Com_delete|Com_commit|Bytes_sent|Bytes_received|Com_begin)"
; ;
esac

## 脚本运行授权和权属修改
[root@CentOS84-IP48 ]#chmod a+x /etc/zabbix/zabbix_agentd.d/check_mysql.sh
[root@CentOS84-IP48 ]#chown zabbix.zabbix /etc/zabbix/zabbix_agentd.d/check_mysql.sh
[root@CentOS84-IP48 ]#

4.Zabbix Agent添加自定义监控项
#### 前面已经安装好zabbix_agent,修改并配置好zabbix_agent
[root@CentOS84-IP48 ]#vim /etc/zabbix/zabbix_agentd.conf
...................
## mysql版本
UserParameter=mysql.version,mysql -V
## 监控MySQL的存活状态,当状态发生异常,发出报警;
UserParameter=mysql.ping,HOME=/etc/zabbix/ mysqladmin ping | grep -c alive
# #监控mysql性能的脚本
UserParameter=mysql.status[*],/etc/zabbix/zabbix_agentd.d/check_mysql.sh $1
....................

[root@CentOS84-IP48 ]#grep "^[a-Z]" /etc/zabbix/zabbix_agentd.conf
PidFile=/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server=192.168.250.18
ListenPort=10050
ServerActive=127.0.0.1
Hostname=192.168.250.48
Include=/etc/zabbix/zabbix_agentd.d/*.conf
UserParameter=mysql.version,mysql -V
UserParameter=mysql.ping,HOME=/etc/zabbix/ mysqladmin ping | grep -c alive
UserParameter=mysql.status[*],/etc/zabbix/zabbix_agentd.d/check_mysql.sh $1
[root@CentOS84-IP48 ]#
[root@CentOS84-IP48 ]#systemctl restart zabbix-agent

####zabbix_agent上测试本机命令及脚本编写的监控项的实际效果
[root@CentOS84-IP48 ]#/usr/sbin/zabbix_agentd -t mysql.ping
mysql.ping[t|1]
[root@CentOS84-IP48 ]#/usr/sbin/zabbix_agentd -t mysql.version
mysql.version[t|mysqlVer 8.0.26 for Linux on x86_64 (Source distribution)]
[root@CentOS84-IP48 ]#/usr/sbin/zabbix_agentd -t mysql.status[Uptime]
mysql.status[Uptime][t|9921]
[root@CentOS84-IP48 ]#/usr/sbin/zabbix_agentd -t mysql.status[Com_update]
mysql.status[Com_update][t|0]
[root@CentOS84-IP48 ]#

5.Zabbix Server命令行测试监控项数据
#### Zabbix_server测试联通情况等
[root@CentOS84-IP18 ]#/usr/bin/zabbix_get -s 192.168.250.48 -p 10050 -k mysql.status[Uptime]
10190
[root@CentOS84-IP18 ]#/usr/bin/zabbix_get -s 192.168.250.48 -p 10050 -k mysql.status[Com_update]
0
[root@CentOS84-IP18 ]#/usr/bin/zabbix_get -s 192.168.250.48 -p 10050 -k mysql.ping
1
[root@CentOS84-IP18 ]#/usr/bin/zabbix_get -s 192.168.250.48 -p 10050 -k mysql.version
mysqlVer 8.0.26 for Linux on x86_64 (Source distribution)
[root@CentOS84-IP18 ]#

6.创建监控模板创建模板,并自定义监控项、触发器、图形及仪表盘配置 ---模板---创建模板
6.1自定义模板






6.2自定义监控项



6.3自定义监控图形



7.创建主机并关联自定义和Zabbix默认的MySQL监控模板7.1创建主机并关联默认模板
配置 ---主机---创建主机






7.2再关联自定义模板



8.验证监控项数据






【实战案例(Zabbix监控MySQL主机)】


    推荐阅读