赞
踩
(1) 对数据库服务可用性进行监控
数据库进程或是端口存在并不意味着数据库就是可用的;
通过网络连接到数据库并且确定数据库是可以对外提供服务的。
(2) 对数据库性能进行监控
QPS和TPS;
并发线程数量;
对Innodb阻塞和死锁进行监控。
(3) 对主从复制进行监控
主从复制链路状态的监控;
主从复制延迟的监控;
定期的确认主从复制的数据是否一致。
(4) 对服务器资源的监控
磁盘空间;CPU的使用情况;内存的使用情况;Swap分区的使用情况;网络IO的使用情况
服务器磁盘空间大并不意味着MySQL数据库服务能使用的空间就足够大;
无论是数据目录还是日志目录的磁盘空间被占满,都会出现MySQL无法对外服务的情况。
一:通过网络连接数据库时,程序建立数据库连接,还要通过一些防火墙等硬件设备,或者像iptable这种软件过滤之后才能连接到数据库。这其中呢,就可能存在一些限制,而造成程序无法连接到服务器的情况。
二、MySQL的TCP/IP连接存在可能被占满的情况
通常使用以下几种方式中的一种:
方式一:mysqladmin -umonitor_user -p -h ping
方式二:telnet ip db_port
方式三:使用程序通过网络建立数据库连接
方式一:检查数据库的read_only参数是否为off
方式二:建立监控表并对表中数据进行读写操作
方式三:执行简单的查询 select @@version
可以连接到MySQL的线程数是有限制的,有很多因素都会造成数据库的连接数突然的增长(出现阻塞、像Memcahe这样的缓存失效都可能造成数据库连接数的暴增)。
获取数据库允许的最大连接数:
show variables like 'max_connections';
获取数据库当前的连接数:
show global status like 'Threads_connected';
判断是否需要报警:
Threads_connected / max_connections > 0.8
记录性能监控过程中所采集到的数据库的状态
1、数据库可用性监控
show global status:可以列出MySQL服务器运行各种状态值。
(1) 如何计算QPS和TPS
QPS:每秒钟数据库所执行的查询的数量(包括了数据库所处理的所有请求)。
QPS = (Queries2 - Queries1) / (Uptime_since_flush_status2 - Uptime_since_flush_status1) # 两次采样的差值 / 两次采样的时间间隔
TPS:每秒钟所处理的事物的数量,也就是每秒钟所处理的UPDATE、DELETE、INSERT这样的请求的数量。从定义上可以看出TPS实际上是OPS的一个子集。
TPS = ((Com_insert2 + Com_update2 + Com_delete2) - (Com_insert1 + Com_update1 + Com_delete1)) / (Uptime_since_flush_status2 - Uptime_since_flush_status1)
(2) 如何监控数据库的并发请求数量
数据库系统的性能会随着并发处理请求数量的增加而下降。
show global status like 'Threads_running';
并发处理的数量通常会远小于同一时间连接到数据库的线程的数量。数据库出现大量阻塞的时候,可能会造成数据库并发请求数量的突增。
(3) 如何监控Innodb的阻塞
- SELECT b.trx_mysql_thread_id AS '被阻塞线程', b.trx_query AS '被阻塞SQL', c.trx_mysql_thread_id AS '阻塞线程',
- c.trx_query AS '阻塞SQL',(UNIX_TIMESTAMP()-UNIX_TIMESTAMP(c.trx_started)) AS '阻塞时间'
- FROM information_schema.INNODB_LOCK_WAITS a
- JOIN information_schema.INNODB_TRX b ON a.requesting_trx_id=b.trx_id
- JOIN information_schema.INNODB_TRX c ON a.blocking_trx_id=c.trx_id
- WHERE (UNIX_TIMESTAMP()-UNIX_TIMESTAMP(c.trx_started)) > 60
实例:
打开两个终端分别连接上数据库;
终端一:
a. 查看session的连接号:
select connection_id();
b. 将Innodb锁的自动超时时间改为180秒:
set global innodb_lock_wait_timeout=180;
c. 查询t表数据:
select * from t;
d. 开启事物:
begin;
e. 为t表开启排查锁:
select * from t for update;
终端二:
a. 查看session的连接号:
select connection_id();
b. 开启事物:
begin;
c. 为t表开启排查锁:
select * from t for update;
在MySQL可视化工具中查询阻塞信息:
show slave status;
Seconds_Behind_Master: 主从之间延迟的秒数,根据同步到从服务器上的主服务器的binlog和已经在从服务器上重新执行过的binlog日志之间的时间差来决定的。存在很多种情况都会造成数据的不准确,例如当网络存在问题的时候,主服务器还有大量的bionlog没同步到从服务器上,同时同步到从服务器上的binlog都已经被重用完了,在这种情况下,主从之间是存在很大的延迟的。
为了更加准确的反应延迟,我们需要使用使用多线程的程序同时对于主从服务器的状态来进行检查:
主服务器上:
show master status \G;
主上的二进制日志文件名和偏移量:
从服务器上:
show slave status \G
从主上已经传输到从上的主上的二进制日志文件名和偏移量:
已经传输完成的主上二进制日志的名字和偏移量:
当每次修复完主从复制,都要检查主从复制数据的一致性。
pt-table-checksum u=dba,p='PassWord' --databases mysql --replicate test.checksums
在主服务器数据库运行即可,它会主动发现主库下所有从库信息,对所有从库指定的数据库数据进行检测。
u:数据库账号用户名
p:数据库账号密码
databases:要检查的数据库的名字
replicate:指定在test库下创建checksums表,并且将数据写入到这张检测表中
创建账户SQL:
GRANT SELECT, PROCESS, SUPER, REPLICATION, SLAVE ON *.* TO 'dba'@'ip' IDENTIFIED BY ''PassWord;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。