1. Zabbix监控MySQL的规划

       在用Zabbix6.0.4做监控,创建监控项之前要尽量规划好要监控什么、如何监控、监控数据如何存放、监控数据如何展现、异常情况报警、报警处置等。 本次实践采用自行编写的MySQL监控脚本( /etc/zabbix/zabbix_agentd.d/check_mysql.sh )来实现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
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 70 *:33060 *:*
LISTEN 0 151 *: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 Sep 2 2021 /usr/bin/mysqladmin
[root@CentOS84-IP48 ]#ll /etc/zabbix
total 20
-rw-r--r-- 1 root root 16451 May 3 15:30 zabbix_agentd.conf
drwxr-xr-x 2 root root 6 May 3 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-x 3 root root 70 May 25 20:04 .
drwxr-xr-x. 144 root root 8192 May 25 19:19 ..
-rw-r--r-- 1 root root 55 May 25 20:01 .my.cnf
-rw-r--r-- 1 root root 16451 May 3 15:30 zabbix_agentd.conf
drwxr-xr-x 2 root root 6 May 3 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-status 2>/dev/null |grep -w "Com_update"|cut -d"|" -f3`
echo $result
;;
Slow_queries)
result=`${MYSQL_CONN} status 2>/dev/null |cut -f5 -d":"|cut -f1 -d"O"`
echo $result
;;
Com_select)
result=`${MYSQL_CONN} extended-status 2>/dev/null |grep -w "Com_select"|cut -d"|" -f3`
echo $result
;;
Com_rollback)
result=`${MYSQL_CONN} extended-status 2>/dev/null |grep -w "Com_rollback"|cut -d"|" -f3`
echo $result
;;
Questions)
result=`${MYSQL_CONN} status 2>/dev/null |cut -f4 -d":"|cut -f1 -d"S"`
echo $result
;;
Com_insert)
result=`${MYSQL_CONN} extended-status 2>/dev/null |grep -w "Com_insert"|cut -d"|" -f3`
echo $result
;;
Com_delete)
result=`${MYSQL_CONN} extended-status 2>/dev/null |grep -w "Com_delete"|cut -d"|" -f3`
echo $result
;;
Com_commit)
result=`${MYSQL_CONN} extended-status 2>/dev/null |grep -w "Com_commit"|cut -d"|" -f3`
echo $result
;;
Bytes_sent)
result=`${MYSQL_CONN} extended-status 2>/dev/null |grep -w "Bytes_sent" |cut -d"|" -f3`
echo $result
;;
Bytes_received)
result=`${MYSQL_CONN} extended-status 2>/dev/null |grep -w "Bytes_received" |cut -d"|" -f3`
echo $result
;;
Com_begin)
result=`${MYSQL_CONN} extended-status 2>/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|mysql Ver 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
mysql Ver 8.0.26 for Linux on x86_64 (Source distribution)
[root@CentOS84-IP18 ]#

6. 创建监控模板

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

6.1 自定义模板

实践案例:Zabbix利用自定义脚本监控MySQL_Zaabix监控MYSQL


实践案例:Zabbix利用自定义脚本监控MySQL_mysql_02


6.2 自定义监控项

实践案例:Zabbix利用自定义脚本监控MySQL_Zaabix监控MYSQL_03


6.3 自定义监控图形

实践案例:Zabbix利用自定义脚本监控MySQL_mysql_04


7. 创建主机并关联自定义MySQL监控模板

创建主机并关联自定义模板 MySQL-shone

配置 --- 主机 --- 创建主机


实践案例:Zabbix利用自定义脚本监控MySQL_Zaabix监控MYSQL_05


8. 验证监控项数据


实践案例:Zabbix利用自定义脚本监控MySQL_Zaabix监控MYSQL_06


实践案例:Zabbix利用自定义脚本监控MySQL_centos_07