一、背景介绍
随着公司业务的变迁,公司的开发数据库以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:检查qpsselect: 查询的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版本可能会出现模板导不进去的情况)。
-
添加服务器,链接到模板Template-Db-Mysql-ExternalCheck-Customize。
-
在被监控的mysql中创建监控用户,用户只需要有show view, replication client权限即可。grant show view, replication client on . to xxx;
-
修改主机中的宏(address,username,password填写被监控mysql的信息)
后面就能看到相关图形和报警了
如果想自己添加一个监控项,则只需要在mysqlmon.py添加一个方法,方法名与key的参数名一致即可(下面是一个示例,我用红框圈出来的地方)
如果大家在使用过程中碰到了问题以及想添加其它的监控项,欢迎大家在博客下面留言,我后续对这个模板进行改进。
五、附件
下面附件下载都为txt后缀,需要手工修改mysqlmon.py下载地址mysql_template.xml下载地址