MySQL监控和预警

1.摘要

          本人从事Java Web开发,在项目开发中会用到很多中间件,本文主要介绍MySQL监控的一点心得和使用,公司DBA也有相应的监控,但是我们的业务比较重要,想做一个备份监控,对MySQL监控需要做监控和预警,首先需要有数据,数据采集之前要知道自己需要监控哪些指标,有可能监控之前有些指标没有想到,在做的过程中可能思路就会逐渐清晰,监控MySQL的作用:(1)定时监控MySQL的健康状况,能够及时发现问题;(2)根据一些指标的历史趋势图能够对系统做优化。

2.监控指标

(1)QPS (每秒查询量)、TPS(每秒事物量)

(2)增删改查的分量

(3)连接数、正在使用的连接数、最大连接数

(4)慢查询

(5)流量统计

(6)Innodb、MyISAM缓冲池

3.监控结构

      MySQL的监控分为两部分,一部分是定时器,每两分钟(时间间隔根据自己的需求定义)负责采集数据和监控的预警(针对QPS、连接数、流量等指标超过阈值给出短信和邮件预警),另一部分是监控结果的展示,在前端页面展示方便查看和数据的对比。


4.数据采集和显示

      可以使用两种SQL语句查询MySQL的状态变量的值,结果一样,查询方式:(1)SHOW GLOBAL STATUS;(2)SELECT * FROM information_schema.SESSION_STATUS;状态变量的详解参见:http://blog.csdn.net/zhaowenbo168/article/details/53199585


4.1 QPS、TPS

MySQL监控和预警_第1张图片

 

       MySQL的状态变量里有个Questions(已经发送给服务器的查询的个数)变量,Questions的值是增量的,我们是每隔两分钟采集一个点,QPS=(Questions2-Questions1)/Time,TPS=((Com_commit2 - Com_commit1)+ (Com_rollback2 - Com_rollback1))/Time;  监控的QPS和TPS的量,如果超出阈值(具体的阈值根据机器的性能和业务数据量来预估),则给预警,另外可以根据历史趋势图,如果发现QPS的TPS的值逐渐增高,可能是业务量增大了或者有可能有人攻击你的服务器(例如采用查询一些非热点数据,直接透过缓存,达到攻击的目的),根据历史的趋势图可以提前做好DB的扩容和优化等。

4.2 增删改查的分量

MySQL监控和预警_第2张图片

        select的量=(Com_select2 - Com_select1)/Time,insert、update和delete同理,如果要计算读和写的量,writes = insert + update + delete;

4.3 连接数、正在使用的连接数、最大连接数

MySQL监控和预警_第3张图片

       连接数=Threads_connected,正在使用的连接数=Threads_running,最大连接数使用命令SHOW VARIABLES LIKE 'max_connections'查询,如果正在使用的连接数远远小于实际的连接数,可能是你的服务连接数配置过大,如果连接数太大,可能会对你的DB会造成一定的压力,另外需要监控连接数,例如当连接数达到最大连接数的60%给出预警,可能是业务量的增大造成连接数的增加,能够提前感知DB的状态,保证服务的稳定。

4.4 慢查询

MySQL监控和预警_第4张图片

慢查询=Slow_queries,具体的慢查询的SQL语句需要查日志;MySQL默认超过10s的查询记录的为慢查询,可以自定义慢查询的时间(例如0.5s)等,监控慢查询的数量,如果出现,及时查看那些SQL语句引起的慢查询,然后可能需要对这些SQL或者服务做优化;

4.5 流量统计

MySQL监控和预警_第5张图片

      发送的流量=Bytes_sent2 - Bytes_sent2 ,接收的流量=Bytes_received2 - Bytes_received1,如果DB Server的服务器上只有DB服务,发送流量和接收流量之和就是服务器的流量情况的,监控流量是否在网卡的可承受范围之内,以便服务的稳定,如果超出阈值,提前预警和优化(比如网卡的流量等)。

4.6 Innodb、MyISAM缓冲池

        一个数据库实例中可能有的表用Innodb存储引擎,有的表用MyISAM存储引擎,MySQL 默认的存储引擎 是InnoDB,它使用了一片称为缓冲池的内存区域,用于缓存数据表与索引的数据。缓冲池指标属于资源指标,而非工作指标,前者更多地用于调查(而非检测)性能问题。如果数据库性能开始下滑,而磁盘 I/O 在不断攀升,扩大缓冲池往往能带来性能回升。可以通过SHOW TABLE STATUS from database_name where Name='table_name';查询表的存储引擎是哪个。


        Innodb缓冲池使用率=(Innodb_buffer_pool_pages_total - Innodb_buffer_pool_pages_free)/Innodb_buffer_pool_pages_total,buffer_pool_pages是缓冲池的页数,默认每页为 16 KiB,或 16,384 字节,你可以使用:SHOW VARIABLES LIKE "innodb_page_size";查看,Innodb缓冲池的大小=Innodb_buffer_pool_pages_total*innodb_page_size。


MyISAM缓冲池使用率=Key_blocks_used/(Key_blocks_unused +Key_blocks_used) 。默认MyISAM缓冲池的大小为16MB,可以使用SHOW VARIABLES LIKE '%key_buffer_size%';查看。


       本文仅供给参考,还有诸多不足,只是站在自己的角度的一些看法。

你可能感兴趣的:(MySQL,监控)