一、背景介绍

随着公司业务的变迁,公司的开发数据库以mysql为主了。mysql服务器层面的监控,例如CPU、内存、硬盘空间等就用zabbix自带的linux模板即可。数据库层面zabbix也自带了一个模板,但是它需要将mysql的密码写到my.cnf文件中,这样不安全,因此决定自己写一个。原先我写过一个用python去监控oracle的博客​​使用zabbix监控oracle数据​​库,对于mysql的监控大同小异,只需要简单改改监控项即可。

二、监控方式

Zabbix服务端的环境为:CentOS 6.10, Zabbix 3.4.15, Python 3.6.8。被监控的mysql 版本为8.0.x。监控采用外部检查(External Check)的方式,即从zabbix服务端执行python脚本,去查询被监控的mysql信息。这种方式的好处是监控脚本放在zabbix服务端,后面想修改模板和脚本只需要在zabbix服务端修改一次即可,被监控端不用做任何操作,省心。

三、监控项规划

确定好了监控方式,接下来就开始对监控项进行规划。

1. os层

port:mysql端口是否正常监听,检测不到监听端口,报警

proc:mysqld进程是否存在,检测不到mysqld进程,报警

以上两个监控项通过zabbix agent采集信息(需要在被监控机安装zabbix-agent)

2. db层

主库和从库都包括的监控项:

readonly:是否只读,状态发生改变时报警

uptime:运行时间,uptime减少表示数据库发生了重启,报警

queries:检查qps

select: 查询的sql次数

update: 更新的sql次数

delete: 删除的sql次数

insert: 插入的sql次数

slow_queries: 慢查询次数

threads_running: 正在运行的线程数,设定100,超过该值报警,根据自己需求适当调整

threads_limit: 线程限制,设定90%,超过该值报警,根据自己需求适当调整

只在从库有的监控项:

从库采用自动发现的方式,即执行“show slave status”有结果就表明这个是从库

slave_io_running:从库的io线程,如果不为YES,报警

slave_sql_running: 从库的sql线程,如果不为YES,报警

seconds_behind_master:从库落后主库的时间,设定10分钟,超过该值报警,根据自己需求适当调整

四、实践



我假设你已经有了zabbix服务端,因此这里略过如何搭建zabbix。



在zabbix服务端安装python3(略),并安装argparse, inspect, pymysql包。



将附件中的mysqlmon.py放入/usr/lib/zabbix/externalscripts下,同时赋权限chmod 755 mysqlmon.py,注意修改mysqlmon.py的第一行#!/usr/local/python3/bin/python3,这里要改成你自己的python执行路径。



将附件的mysql_template.xml导入到zabbix中(我是基于zabbix 3.4.15写的模板,其它zabbix版本可能会出现模板导不进去的情况)。
使用Zabbix + Python对Mysql监控_zabbix



添加服务器,链接到模板Template-Db-Mysql-ExternalCheck-Customize。
使用Zabbix + Python对Mysql监控_zabbix_02



在被监控的mysql中创建监控用户,用户只需要有show view, replication client权限即可。
grant show view, replication client on . to xxx;



修改主机中的宏(address,username,password填写被监控mysql的信息)
使用Zabbix + Python对Mysql监控_mysql_03



后面就能看到相关图形和报警了

使用Zabbix + Python对Mysql监控_mysql_04

使用Zabbix + Python对Mysql监控_zabbix_05

如果想自己添加一个监控项,则只需要在mysqlmon.py添加一个方法,方法名与key的参数名一致即可(下面是一个示例,我用红框圈出来的地方)

使用Zabbix + Python对Mysql监控_sql_06

使用Zabbix + Python对Mysql监控_sql_07

如果大家在使用过程中碰到了问题以及想添加其它的监控项,欢迎大家在博客下面留言,我后续对这个模板进行改进。

五、附件

下面附件下载都为txt后缀,需要手工修改

​mysqlmon.py下载地址​

​mysql_template.xml下载地址​