一、简介
在本教程中,我们将逐步学习如何使用分区脚本在 MySQL 或 MariaDB 上对 Zabbix 数据库(历史和趋势表)进行分区。
Zabbix 从主机收集数据并使用历史和趋势表将它们存储在数据库中。Zabbix 历史记录保留原始数据(Zabbix 收集的每个值),趋势存储合并的每小时数据,平均为 min、avg 和 max。
Zabbix 的管家进程负责删除旧的趋势和历史数据。使用 SQL 删除查询从数据库中删除旧数据会对数据库性能产生负面影响。因此,我们中的许多人都收到了那个烦人的警报“ Zabbix housekeeper processes more than 75% busy”使用数据库分区可以轻松解决该问题。分区每小时或每天创建表,并在不再需要时删除它们。SQL DROP 比 DELETE 语句更有效。您可以将本教程用于 3.0 之后的任何 Zabbix 版本(3.2、3.4、4.0、4.2、4.4、5.0、5.2 等)
注:官网部署地址==https://bestmonitoringtools.com/zabbix-partitioning-tables-on-mysql-database/==
二、搭建环境
系统版本:CentOS Linux release 7.6.1810 (Core)
Zabbix软件版本:zabbix-server-mysql_5.0
Mysql版本:mysql-community-server.x86_64 0:5.7.22-1.el7
Php版本:7.2以上(zabbix5.0默认支持php7.2及以上版本)
关闭防火墙 systemctl stop firewalld.service
禁止防火墙开机自启 systemctl disable firewalld.service
关闭selinux
sed -i ‘s/SELINUX=enforcing /SELINUX=disabled/g’ /etc/selinux/config
重启系统即可 reboot
三、分区方式
方式一:针对刚搭建的zabbix数据库做分区(为提升日后查询数据速度做考虑)
方式二:针对已有的zabbix数据库做分区(为提升当前查询数据速度做考虑)
注:两种方式从部署本质来说唯一的区别就是,如果是新安装的zabbix数据库则不需要备份数据,直接按照部署操作即可;如果是以前安装的zabbix数据库,则需要备份数据,然后按照部署操作,部署完成后将数据导回数据库即可或者参考==https://www.cnblogs.com/suyj/p/15078684.html==这个博客的针对有数据的(200G-300G的分区实践过程)。
四、部署创建分区过程
1、下载用于分区的sql脚本
wget http://bestmonitoringtools.com/dl/zbx_db_partitiong.tar.gz2、解压脚本
tar -zxvf zbx_db_partitiong.tar.gz3、查看默认的配置
cat zbx_db_partitiong.sql
注:以上截图配置为保留7天的历史数据和365天的趋势数据,可根据不同场景自行配置。4、使用sql脚本创建分区
mysql -u ' ZABBIX ' -p ' zabbixDBpass ' ZABBIX <zbx_db_partitiong.sql
注:脚本在新Zabbix安装上可以快速地创建MySQL分区程序,但在大型数据库上(以前安装的数据库),可能会持续数小时。
五、部署自动分区程序(以下两种方式二选一)
方式一:使用MySQL 事件调度程序
1、修改mysql配置文件
cat /etc/my.cnf
[mysqld]
event_scheduler = ON
注:默认情况下,禁用 MySQL 事件调度程序。您需要通过在 MySQL 配置文件(/etc/mysql/mariadb.conf.d/ 或 /etc/my.cnf.d/)中的“[mysqld]”行之后设置“ event_scheduler=ON ”来启用它,如果没有这行那就新增一行即可。2、重启mysql服务器
systemctl restart mysqld3、命令检测MySQL 事件调度程序状态
mysql -u 'zabbix' -p'zabbix' zabbix -e "SHOW VARIABLES LIKE 'event_scheduler';"4、创建一个测试事件(60秒创建一次)
mysql -u 'zabbix' -p'zabbix' zabbix -e "CREATE EVENT zbx_partitioning ON SCHEDULE EVERY 60 SECOND DO CALL partition_maintenance_all('zabbix');"5、检查验证
mysql -u 'zabbix' -p'zabbix' zabbix -e "SELECT * FROM INFORMATION_SCHEMA.eventsG"
注:如上截图说明创建成功了。
方式二:使用Crontab定时任务
1、创建定时任务
sudo crontab -e
30 03 * / USR / bin中/ MySQL的-u ' ZABBIX ' -p” zabbixDBpass ' ZABBIX -e“CALL partition_maintenance_all(' ZABBIX ');“ > /tmp/CronDBpartitiong.log 2>&12、查看每天的计划任务的日志
tail -f /tmp/CronDBpartitiong.log
注:Crontab 将每天执行分区(删除旧表并创建新表)并将所有内容记录在文件“ /tmp/CronDBpartitiong.log”中。3、检查分区状态
mysql -u 'zabbix' -p'zabbix' zabbix -e "show create table historyG"
注:如上图所示未历史表新创建了三个分区,表示完成。
六、在Zabbix前端配置管家(Housekeeping)
注:配置文件在网页>管理>一般>管家目录下,History and Trends 部分下为趋势和历史定义“数据存储期”的天数(必须与数据库分区中配置的天数相同,如果分区脚本中有更改记得这里也要更改)
七、分区和存储的常用命令
#查看表信息 | 查看表分区
show create table historyG#查看生效中的存储过程 | 查看某个存储过程的执行记录 | 某个event的信息
SELECT * FROM INFORMATION_SCHEMA.eventsG#查看所有的存储过程
show procedure status like 'partition_maintenance%' G#查看某个存储过程的创建详情
show create procedure partition_maintenance_all_30and365and24hand4pG#event使用新的存储过程,每个小时执行一次
ALTER EVENT zbx_partitioning ON SCHEDULE EVERY 3600 SECOND DO CALL partition_maintenance_all_30and365and24hand4p('zabbix');#手动执行某个存储过程
CALL partition_maintenance_all('zabbix');#创建一个event,每个小时执行一次存储过程
CREATE EVENT zbx_partitioning ON SCHEDULE EVERY 3600 SECOND DO CALL partition_maintenance_all_30and365and24hand4p('zabbix');#删除一个存储过程
DROP PROCEDURE ShowStuScore;
本文摘自 :https://blog.51cto.com/w