zabbix 一次惨痛的分区经历

问题

今天来到公司,像往常一样打开zabbix,突然发现没有数据被收集,于是快速检查了其他的图形,发现都没有数据,于是定位到了服务端的问题,检查日志发现:zabbix日志突然报查询history和history_uint失败,分区里找不到这个 clock?

解决过程

以下仅是以history为例的解决路线,暂不探讨history_unit

  1. 初次认知是分区问题,分区不够了,开始在网上查分区创建方法 
    alter table history partition by range (clock)(partition p1 values less than MAXVALUE); 
    在此我给了MAXVALUE一个很大的值,执行了20分钟没有执行完,发现这种方式不行
  2. 检查是不是设置了自动分区 
    show create table history; 
    发现有一大堆以clock的分区,发现clock是日期,正好是今天凌晨,而一上午没有生成分区,所以导致数据存不进去。知道了原因,先解决,先不探讨为什么有自动分区的问题。

  3. 发现问题了,就先解决问题,创建分区吧 
    CALL partition_create("zabbix", "history", "p201706140000", 1497456000); 
    提示没有这个partition_create存储过程,所以无法执行,挺纳闷,先不解决这个; 
    创建这个存储过程,建议参考:https://www.zabbix.org/wiki/Docs/howto/mysql_partition#partition_create ( 网上不靠谱的太多了) 
    进入数据库执行下面语句:(root登录,不知道有没有影响)
DELIMITER $$CREATE PROCEDURE `partition_create`(SCHEMANAME varchar(64), TABLENAME varchar(64), PARTITIONNAME varchar(64), CLOCK int)BEGIN
        /*
           SCHEMANAME = The DB schema in which to make changes
           TABLENAME = The table with partitions to potentially delete
           PARTITIONNAME = The name of the partition to create
        */
        /*
           Verify that the partition does not already exist
        */ DECLARE RETROWS INT;
        SELECT COUNT(1) INTO RETROWS        FROM information_schema.partitions
        WHERE table_schema = SCHEMANAME AND table_name = TABLENAME AND partition_description >= CLOCK; IF RETROWS = 0 THEN                /*
                   1. Print a message indicating that a partition was created.
                   2. Create the SQL to create the partition.
                   3. Execute the SQL from #2.
                */
                SELECT CONCAT( "partition_create(", SCHEMANAME, ",", TABLENAME, ",", PARTITIONNAME, ",", CLOCK, ")" ) AS msg;
                SET @sql = CONCAT( ‘ALTER TABLE ‘, SCHEMANAME, ‘.‘, TABLENAME, ‘ ADD PARTITION (PARTITION ‘, PARTITIONNAME, ‘ VALUES LESS THAN (‘, CLOCK, ‘));‘ );
                PREPARE STMT FROM @sql;
                EXECUTE STMT;
                DEALLOCATE PREPARE STMT;
        END IF;END$$
DELIMITER ;

然后执行创建 

ok,此时把不存在分区的表都创建上,然后重启zabbix。

  1. 现在要查找问题的原因了 
    因为前面处理zabbix的同事,做了分区分表,然后又在cron内设置了定时任务,定时添加几天的表区 mysql -uzabbix -pxxx -e "CALL partition_maintenance_all(‘zabbix‘);" 因为我接手后,不知道这是什么,把zabbix服务器归纳整理后,mysql密码变了,执行不了了,消耗了一上午的时间,不过清晰了zabbix分区过程,也是有收获的
  2. 现在要开始总结下分区分表了 
    查看存储过程:select specific_name from mysql.proc ; 
    查看过程逻辑:show create procedure partition_create \G 
    删除存储过程:drop procedure if exists partition_maintenance_all ; 
    查看存储过程:show procedure status like ‘partition_maintenance%‘ \G; 
    修改存储过程:ALTER {PROCEDURE|FUNCTION} sp_name [characteriss] 根据官方文档,创建存储过程,包括:create、drop、maintenance、verify、maintenance_all 最好根据自身情况对maintenance_all,进行修改,用于减轻数据库压力;
DELIMITER $$CREATE PROCEDURE `partition_maintenance_all`(SCHEMA_NAME VARCHAR(32))BEGIN
    CALL partition_maintenance(SCHEMA_NAME, ‘history‘, 15, 24, 7);
    CALL partition_maintenance(SCHEMA_NAME, ‘history_log‘, 30, 24, 7);
    CALL partition_maintenance(SCHEMA_NAME, ‘history_str‘, 30, 24, 7);
    CALL partition_maintenance(SCHEMA_NAME, ‘history_text‘, 30, 24, 7);
    CALL partition_maintenance(SCHEMA_NAME, ‘history_uint‘, 15, 24, 7);
    CALL partition_maintenance(SCHEMA_NAME, ‘trends‘, 60, 24, 7);
    CALL partition_maintenance(SCHEMA_NAME, ‘trends_uint‘, 60, 24, 7);END$$
DELIMITER ;
  1. 最后做项收尾工作 
    为了避免我们经常去执行创建删除过程,创建删除分区,我们要充分利用partition_maintenance_all存储过程,加入cron中 ,每周一八点执行一次,创建及删除过程
    0 8 1 * * mysql -uroot -pxxx zabbix -e "CALL partition_maintenance_all(‘zabbix‘);"
时间: 2024-10-10 07:19:01

zabbix 一次惨痛的分区经历的相关文章

Zabbix优化: 数据库表分区

在说数据库分表之前,先随便聊聊Zabbix的一些参数的优化吧,其实我也不是很懂,只是机器上了1500+,楞着头皮去调一下参数 首先是几个Poller的调整: ### Option: StartPollers (处理监控项的东西) ### Option: StartIPMIPollers (母鸡干什么用的,暂时没用,设为0) ### Option: StartPollersUnreachable (获取数据遇到不可到达时,交给这些进程处理) ### Option: StartHTTPPollers

Zabbix优化:数据库表分区

参考:https://www.zabbix.org/wiki/Docs/howto/mysql_partition(官网) 当zabbix监控的服务器数量越来越多,就会报"Zabbix housekeeper processes more than 75% busy"这个错误 机器数量多的时候,mysql里面的history表就会越来越大,虽然zabbix本身有删除功能(就是那个housekeeper的功能),但这东西太影响性能,所以网上的做法都是关闭这个东西,用mysql的表分区功能

zabbix配置部署

zabbix 实验环境: 服务端:192.168.36.131 客户端:192.168.36.129 iptables and selinux disabled 一.服务端配置 1.安装 # rpm -ivh http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/ zabbix-release-2.2-1.el6.noarch.rpm # yum install zabbix-server-mysql zabbix-web-mysql 2.mysql数据

zabbix监控分布式部署

1. 部署拓扑图 2.服务器配置 3.说明 3.1 zabbix前端访问 地址:https://ip/zabbix 3.2 mysql数据库 mysql-master/mysql-slave执行主从同步模式,通过用户bak(仅备份权限)实现数据库zabbix实时同步备份. mysql-master上对zabbix数据库进行了表分区,按天分区,并定时任务自动删除1年前数据. 数据库维护地址: 主:https://172.28.8.145/phpmyadmin 从:https://172.28.8.

【转】记毕业季的求职经历

原文地址:http://www.cnblogs.com/chkkch/p/3401015.html        (mark一下,打基础做准备!) Accept的公司:Facebook, DeNA, SAP, Intel, ARMFail的公司:阿里巴巴,腾讯,百度,Google,微软,平安科技,豆瓣,雅虎,Amazon,NVIDIA,EMC,VMware,还有各种说不上名字的小公司 今年(确切的说是从去年暑假开始)的工作实在不好找.随着国内的经济形势下降,公司的招的人也随之下降得厉害.腾讯,阿

zabbix应用之Low-level discovery监控磁盘IO

zabbix自带的"Template OS Linux"模板支持监控已挂载的磁盘空间利用率,是利用LLD(Low-level discovery)实现的,却没有对磁盘IO监控.本篇文章就介绍利用zabbix LLD功能监控磁盘IO的方法. 思路:首先创建Discovery rules,在agent端配置对应的UserParameter,调用编写好的shell脚本,动态查找出已经挂载的磁盘分区:然后创建Item prototypes,使用vfs.dev.read[device,<t

zabbix监控orace

orabix是目前网络上能找到用zabbix监控oracle最多的文章.orabix项目很久没更新,监控得到的数据不甚满意,没有再深入的去了解. 之前有过用shell写脚本在zabbix上监控业务数据的经历,第一想法就是 zabbix-agent Userparameter 自定义监控.鉴于目前python在运维方面很火,用python自己写一个脚本去抓取数据,通过zabbix-agent Userparameter调用脚本获取oracle的数据,这样的方案一来可以提升一下自己写python的能

22世纪真实链路式监控 设计理念分析

浅谈最前沿 运维22世纪真实链路式 监控报警 设计理念 51CTO 主讲老师:大米哥 本课程大纲概述 1: 通过真实案例 看清 不准确的监控报警带来危害 2: 详细分析 一个运维 在分析排查故障时候的过程细节 (同样基于真实案例)3:运维真实链路式监控 的基本理念和思路4: 本篇分享课程 总结篇 (给出大家一个 完整的框架图) 1: 通过真实案例 看清 不准确的监控报警带来危害 做过运维相关工作的朋友都知道一个词 , 7*24 也就是说 咱们当运维的 为了维护线上集群的稳定 维护企业产品的稳定

ConcurrentHashMap实现原理--转载

原文地址:http://ajax-xu.iteye.com/blog/1104649 ConcurrentHashMap是Java 5中支持高并发.高吞吐量的线程安全HashMap实现.在这之前我对ConcurrentHashMap只有一些肤浅的理解,仅知道它采用了多个锁,大概也足够了.但是在经过一次惨痛的面试经历之后,我觉得必须深入研究它的实现.面试中被问到读是否要加锁,因为读写会发生冲突,我说必须要加锁,我和面试官也因此发生了冲突,结果可想而知.还是闲话少说,通过仔细阅读源代码,现在总算理解