京东MySQL监控之Zabbix优化、自动化

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

随着京东业务的飞速发展, MySQL数据库的使用更加普及、服务器量级飞速增长,这对京东MySQL DBA团队的要求也越来越高。监控系统为数据库管理和维护提供了精确的数据依据,是数据库运维人员的千里眼和顺风耳。


准确、及时、有效的监控,能够使运维人员对生产服务系统运行情况了如指掌。通过分析获得的监控信息,判断被监控数据库的运行状态,对可能出现的问题进行预测,可以及时制定出适当的优化方案,从而保证整个系统正常、高效地运行。这也就在很大程度上保证了数据库的安全性,避免了一些不必要的损失。所以,我们有必要对Zabbix系统有更加深刻的认识和理解。


一、Zabbix功能简介


zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。zabbix能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。这是百度百科上对zabbix上的一段定义,市面上的监控软件很多,为什么选择zabbix呢?我们来看一下它的几个特点:


1、自动发现服务器和网络设备。


这功能有点鸡肋,在多种应用、多种设备混合场景下不实用,给zabbix整体运维管理带来不便。这在实际使用中也存在各种问题,特别是在设备种类繁多、数量较大的情况下,不建议使用这个功能,zabbix监控添加设备结合CMDB来完成,这样定位设备用途和添加模板将会更加准确;


2、底层自动发现。


这点很方便实用,比如自带的自动发现系统分区、自动发现多网卡等。这个功能也是可以自定义的,比如监控一台主机上的MySQL多实例服务,通过这个功能可以轻松搞定;


3、分布式的监控体系和集中式的web管理。


zabbix支持主动监控和被动监控模式(模式是相对于客户端来说的,主动推监控数据给服务器端或是服务器端来拉取监控数据。建议使用主动模式,以便减轻服务器端压力), 并且可以实现秒级监控,这点是一些监控软件达不到的,但对重要业务来说,这点很重要;


4、支持范围广。


支持监控多种设备以及目前市面常见的各种OS、服务、日志等,可以使用自带的agent监控,也有无agent监控等多种监控方法,如SNMP;


5、灵活的监控项设置。


zabbix本身已经支持很多常见的监控项,用户也可以自己写脚本来灵活自定义监控项,可以灵活组合多项报警阈值来准确报警,如监控硬盘的报警阈值可以设置为达到硬盘空间80%并且剩余空间低于50G时报警;


6、高水平的业务视图监控资源,监控情况展示方面可以垂直、水平对比展示。


比如一套数据库的分片,可以把所有主库的某个性能指标做在一个Graphs中,可以方便对比各个主库的负载情况是否均衡。也可以将多个Graphs做成一个Screens,然后在一个Screens中可以看到多种性能指标的各种情况,方便直观的进行对比;


7、灵活的用户权限设置。


支持自定义事件和邮件发送,也支持报警升级及日志审计


8、基于zabbix报警的故障自愈。


Zabbix具有规范化的故障处理流程,对报警进行分级、分类,可以自动处理一些低级别、固化处理方法的故障,以达到快速恢复故障的效果。这点很重要,做的好可以最大限度的保证业务的可用性稳定性,降低人为操作失误风险以及人员成本;


9、强悍的内置API。


几乎所有的zabbix服务器端web页面配置操作,都可以通过他自身的API来完成,用户可以非常方便地对它进行二次开发,以满足自己的自动化运维需求。


Zabbix最大的一个缺点应该就是没有合并报警这个功能,在极端的情况下会出现报警风暴。不过很多监控软件应该也没有实现这个功能,用户可以通过对它进行二次开发,以实现合并报警的效果。


二、Zabbix的优化


有不少企业使用zabbix监控的设备数量达到一两百台,运行半年后性能极差,打开监控图需要很长时间,甚至打不开。这个问题比较常见,主要是因为没有对zabbix做到合理的规划和优化。如果能对zabbix做出合理的优化及架构上的规划,zabbix监控几万台设备还是很轻松的。


1、配置文件参数的优化


对于较大量级、海量设备的监控需要对zabbix相关参数进行调整,主要包含进程数量、缓存大小、超时时间三个方面,根据实际监控情况对zabbix自身的参数进行调整,禁用掉如VMware、Java等方面不使用的监控方式:

1
2
3
4
5
6
7
8
9
10
11
12
StartPollers = 200
StartPollersUnreachable = 100
StartTrappers = 200
StartPingers = 100
StartTimers = 50
StartDBSyncers = 100
Timeout = 30
TrapperTimeout = 30
StartProxyPollers = 50
HistoryTextCacheSize = 1024M
TrendCacheSize = 1024M
HistoryCacheSize = 1024M


2、监控项和报警项的优化


监控项越多,对zabbix数据库和它本身的性能的考验就越大。精简监控项,只监控必要的监控项,对运维没有帮助的监控项可以取消,以减少系统资源的浪费。最典型的一个MySQL监控模板,是网上比较流行的percona官方出品的zabbix监控模板,监控项高达200多个,基本囊括show global status中的所有项目,好多监控项对运维来说是没有意义的,却对数据库和zabbix自身性能产生严重的影响,当监控量级达到一定程度后,性能之差可想而知。


监控项的类型最好使用数字,尽量避免使用字符。字符在数据库中的存储空间使用较大,在设置trigger时也相对麻烦,并且zabbix本身处理数字的效率要相对高。如果业务需要字符类型的监控项,可以适当的降低数据采集的时间间隔以提高处理效率。


Trigger中,正则表达式函数last(),nodata()的速度最快,min()、max()、avg()的速度最慢。在使用过程中,尽量选择速度较快的函数。配置Trigger时,也应注意使用正确的逻辑,错误的逻辑可能导致数据库查询较慢的现象。


3、zabbix数据库的优化


对数据库进行分区是必须要做的,这便于删除历史数据。同时要关闭zabbix自身删除历史数据的设置。如果不做分区和删除规则设置的话,随着时间的推移,zabbix本身查询和二次开发时查询性能都会变得很低,甚至查询不出数据。表分区的相关内容可以参考如下文件:https://www.zabbix.org/wiki/Docs/howto/mysql_partition。


关闭zabbix自身删除历史数据的设置SQL语句如下:

1
2
3
4
5
UPDATE  config  SET  hk_events_trigger=60,hk_events_internal=60,
hk_events_discovery=60,hk_events_autoreg=60,hk_audit=60,hk_sessions=60,
hk_history=30,hk_history_mode=0,
hk_history_global=1,hk_trends_mode=0,
hk_trends_global=1,hk_trends=730,hk_services=60;


在页面上设置位置为:

                         wKioL1ef8AmQvzuIAAEj-iUkERU622.jpg  

建议对历史表中时间字段添加索引,在二次开发时这个字段用到的几率比较大。建议对历史数据表启用innodb压缩,具体做法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/ * 启用innodb压缩,设置历史表启用压缩 * /
SET  GLOBAL innodb_file_format = 'barracuda' ;
SET  GLOBAL innodb_file_format_max = 'barracuda' ;
/ * innodb_file_format和innodb_file_format_max要写入my.cnf配置文件中 * /
ALTER TABLE history ROW_FORMAT = COMPRESSED KEY_BLOCK_SIZE = 8 ;
ALTER TABLE history_log ROW_FORMAT = COMPRESSED KEY_BLOCK_SIZE = 8 ;
ALTER TABLE history_str ROW_FORMAT = COMPRESSED KEY_BLOCK_SIZE = 8 ;
ALTER TABLE history_str_sync ROW_FORMAT = COMPRESSED KEY_BLOCK_SIZE = 8 ;
ALTER TABLE history_text ROW_FORMAT = COMPRESSED KEY_BLOCK_SIZE = 8 ;
ALTER TABLE history_uint ROW_FORMAT = COMPRESSED KEY_BLOCK_SIZE = 8 ;
ALTER TABLE history_uint_sync ROW_FORMAT = COMPRESSED KEY_BLOCK_SIZE = 8 ;
ALTER TABLE history_str ROW_FORMAT = COMPRESSED KEY_BLOCK_SIZE = 8 ;
ALTER TABLE history_uint_sync ROW_FORMAT = COMPRESSED KEY_BLOCK_SIZE = 8 ;
ALTER TABLE trends ROW_FORMAT = COMPRESSED KEY_BLOCK_SIZE = 8 ;
ALTER TABLE trends_uint ROW_FORMAT = COMPRESSED KEY_BLOCK_SIZE = 8 ;


MySQL的版本建议使用PerconaDB5.6,设置thread_handling= pool-of-threads,启用线程池。MySQL配置文件其他参数的优化这里不多说,可以参考如链接中的配置文件:http://wangwei007.blog.51cto.com/68019/1623329。


4、zabbix监控系统的架构优化


Zabbix架构的优化,主要原则是server端的压力分担到proxy端,proxy端的压力分担到agent端,监控项采用被动模式server端和proxy端均做高可用,防止单点造成监控不可用。以下是zabbix的架构和流程图,仅供参考:

wKioL1ef8EyhhDvwAAFQV9RJ1y8546.jpg


三、Zabbix自动化


运维自动化的真谛在于解放、简化、方便运维人员的工作,提高效率,减少人为故障,基本运维思路是能自动坚决不手动,运维人员要培养自己“懒”这个好习惯。自动化的基础是基础信息的准确性和各种配置信息规则的规范化。


1、监控自动化规范


约定主机名规范,以期达到见名知意的效果,见到主机名大概知道这个设备是什么业务在使用,角色是什么。出问题时运维也可以快速的知道影响范围和影响的严重性,方便运维。主机规范一般可以包含机房信息、业务信息、业务登记、业务中的角色信息、IP等相关信息;


约定主机组的名字,这点主要是方便相同业务、相同研发查看自己主机的监控,接收报警信息,也方便zabbix本身做组图在screen中展现,做性能对比图。比如数据库的一个sharding集群,可以定义一个主机组,再做成Graphs汇总图时方便研发直观对比各个分片上的性能指标是否均衡;

报警等级的规范,这个主要是用于区分报警发给谁,怎么发,如何做报警升级等,还可以根据等级和监控项进行自动处理,等级较高的优先处理,较低的可以集中处理等;


主机维护暂停报警的规范。报警很重要,暂停监控需谨慎,不建议使用自带的Maintenance预维护,主要是因为处于维护状态的主机依然会显示在监控首页,虽然有标记,但是主机量大的时候不方便运维查看监控。建议进行二次开发,约定处于维护状态的主机关闭trigger,维护结束后自动打开;

不建议手动的修改主机监控的各种配置,这样容易遗忘,而且手工效率低下,容易造成各种设置和规则的混乱,后续问题堆积起来更加复杂,可维护性差。对zabbix进行二次开发时,配置的改动需要记录修改的原因,生效的时间段等信息;监控的增删改都自动完成,各种规范用程序来约束,由程序去自动完成。


2、部署配置的自动化


Zabbix的服务器端和客户端的部署较为简单,网上教程也比较多,把整个部署过程脚本化,然后和CMDB结合,自动批量部署和添加主机到监控中。部署过程可以参考此链接:http://wangwei007.blog.51cto.com/68019/1047953。


3、日常运维自动化


Zabbix自身提供了丰富的API接口,可以通过调用这些API,规范化操作配置zabbix。可以去http://www.zabbix.com/documentation.php查看各个版本的使用说明,包含zabbix的各种操作;

在API的说明中,也讲述了zabbix数据库中表的数据库字典,每个字段代表什么,都有详细说明。zabbix的二次开发和自动化运维主要是调用zabbix的API和读取zabbix的数据库来搞定的,不建议直接对zabbix数据库原表进行直写操作,一般也没有必要。大家可以参考一下这个python写的API:http://wangwei007.blog.51cto.com/68019/1139982


4、报警的自动化处理


Zabbix可以在action中设置调用系统命令,在保证安全的情况下,可以使用这个功能来自动处理指定报警。设置如下图:

wKioL1ef8HKStAmCAAFLsgd5qjM905.jpg


用户可以对常见的报警归纳总结,对一些固定处理方法的报警,把过程脚本化,当达到某个阈值的时候,自动的处理,比如清理固定位置的日志等,达到报警快速恢复的目的。


5、LLD的使用


Zabbix中的LLD是一个非常好的扩展,方便监控主机上多实例MySQL、Redis等服务、端口、硬盘多分区、多网卡等情况。用户可以自定义discovery rules,可以自动的生成指定items、triggers、graphs等,较为灵活,极大地方便了监控的运维。


6、zabbix的二次开发


Zabbix的二次开发主要是对监控数据的二次分析,可以最大限度地发挥这些数据的作用,从而更好的服务和指导运维。

Zabbix的详细历史数据按照数据采集的类型存在于以下的表中:

history,history_log,history_str,history_str_sync,history_sync,history_text,history_uint,history_uint_sync,events

zabbix的趋势数据存放在trends,trends_uint两张表中。趋势数据是通过详细的监控数据计算而来,每个监控项每个小时会产生最小值、最大值和平均值。

利用这些历史数据,可以自动生成一些性能参数的统计汇总报表,比如某个性能指标压力较大的TOP100等,方便运维排查安全隐患。通过对对报警历史进行分析,可以找出经常报警的监控项,对可用性进行评估等。

最后,感谢我们DBA团队老大樊健刚樊总对本文的指导和建议,同时也感谢他对MySQL监控这块一直以来的重视和支持。

本文转自 lover00751CTO博客,原文链接:http://blog.51cto.com/wangwei007/1833332,如需转载请自行联系原作者



相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
3月前
|
SQL 缓存 关系型数据库
MySQL 慢查询是怎样优化的
本文深入解析了MySQL查询速度变慢的原因及优化策略,涵盖查询缓存、执行流程、SQL优化、执行计划分析(如EXPLAIN)、查询状态查看等内容,帮助开发者快速定位并解决慢查询问题。
157 0
|
1月前
|
缓存 关系型数据库 MySQL
降低MySQL高CPU使用率的优化策略。
通过上述方法不断地迭代改进,在实际操作中需要根据具体场景做出相对合理判断。每一步改进都需谨慎评估其变动可能导致其他方面问题,在做任何变动前建议先在测试环境验证其效果后再部署到生产环境中去。
87 6
|
2月前
|
存储 SQL 关系型数据库
MySQL 核心知识与索引优化全解析
本文系统梳理了 MySQL 的核心知识与索引优化策略。在基础概念部分,阐述了 char 与 varchar 在存储方式和性能上的差异,以及事务的 ACID 特性、并发事务问题及对应的隔离级别(MySQL 默认 REPEATABLE READ)。 索引基础部分,详解了 InnoDB 默认的 B+tree 索引结构(多路平衡树、叶子节点存数据、双向链表支持区间查询),区分了聚簇索引(数据与索引共存,唯一)和二级索引(数据与索引分离,多个),解释了回表查询的概念及优化方法,并分析了 B+tree 作为索引结构的优势(树高低、效率稳、支持区间查询)。 索引优化部分,列出了索引创建的六大原则
|
7月前
|
SQL 关系型数据库 MySQL
MySQL进阶突击系列(07) 她气鼓鼓递来一条SQL | 怎么看执行计划、SQL怎么优化?
在日常研发工作当中,系统性能优化,从大的方面来看主要涉及基础平台优化、业务系统性能优化、数据库优化。面对数据库优化,除了DBA在集群性能、服务器调优需要投入精力,我们研发需要负责业务SQL执行优化。当业务数据量达到一定规模后,SQL执行效率可能就会出现瓶颈,影响系统业务响应。掌握如何判断SQL执行慢、以及如何分析SQL执行计划、优化SQL的技能,在工作中解决SQL性能问题显得非常关键。
|
2月前
|
存储 SQL 关系型数据库
MySQL 动态分区管理:自动化与优化实践
本文介绍了如何利用 MySQL 的存储过程与事件调度器实现动态分区管理,自动化应对数据增长,提升查询性能与数据管理效率,并详细解析了分区创建、冲突避免及实际应用中的关键注意事项。
126 0
|
2月前
|
数据采集 存储 监控
Python爬虫自动化:定时监控快手热门话题
Python爬虫自动化:定时监控快手热门话题
|
4月前
|
监控 安全 Linux
Arista CloudVision 2025.1 - 多云和数据中心网络自动化、监控和分析
Arista CloudVision 2025.1 - 多云和数据中心网络自动化、监控和分析
179 2
Arista CloudVision 2025.1 - 多云和数据中心网络自动化、监控和分析
|
4月前
|
存储 SQL 关系型数据库
京东面试:mysql深度分页 严重影响性能?根本原因是什么?如何优化?
京东面试:mysql深度分页 严重影响性能?根本原因是什么?如何优化?
京东面试:mysql深度分页 严重影响性能?根本原因是什么?如何优化?
|
6月前
|
数据采集 运维 监控
数据采集监控与告警:错误重试、日志分析与自动化运维
本文探讨了数据采集技术从“简单采集”到自动化运维的演进。传统方式因反爬策略和网络波动常导致数据丢失,而引入错误重试、日志分析与自动化告警机制可显著提升系统稳定性与时效性。正方强调健全监控体系的重要性,反方则担忧复杂化带来的成本与安全风险。未来,结合AI与大数据技术,数据采集将向智能化、全自动方向发展,实现动态调整与智能识别反爬策略,降低人工干预需求。附带的Python示例展示了如何通过代理IP、重试策略及日志记录实现高效的数据采集程序。
296 7
数据采集监控与告警:错误重试、日志分析与自动化运维
|
6月前
|
存储 关系型数据库 MySQL
MySQL细节优化:关闭大小写敏感功能的方法。
通过这种方法,你就可以成功关闭 MySQL 的大小写敏感功能,让你的数据库操作更加便捷。
494 19

推荐镜像

更多