mysqlMonitor - juedaiyuer/researchNote GitHub Wiki

#mysql---监控#

Nagios

Zabbix

##对什么进行监控##

  1. 对数据库服务可用性进行监控
  2. 对数据库性能进行监控(QPS和TPS,并发线程数量,Innodb阻塞和死锁)
  3. 对主从复制进行监控
  4. 对服务器资源的监控(磁盘空间,CPU,内存使用,Swap分区,网络IO)

数据库进程或是端口存在并不意味着数据库就是可用的

通过网络连接到数据库并且确定数据库是可以对外提供服务的

服务器磁盘空间大并不意味着MySQL数据库服务能使用的空间就足够大

主从复制的监控

  1. 主从复制链路状态
  2. 延迟
  3. 定期的确认主从复制的数据是否一致

##数据库可用性监控##

如何确认数据库是否可以通过网络连接

mysqladmin -umonitor_user -p -h ping

telnet ip db_port

使用程序通过网络建立数据库连接

如何监控数据库能否可读写

检查数据库的read-only参数是否为off

执行简单的查询 select @@version

定期对主从服务器中的主数据库的这个参数进行检查

如何监控数据库的连接数

可以连接到MySQL的线程数是有限制的

show variables like 'max_connections';

show global status like 'Threads_connected';

Threads_connected/max_connections >0.8 报警设置

连接数暴增

出现阻塞,像memcache这样的缓存失效

##数据库性能监控##

记录性能监控过程中所采集到的数据库的状态

如何计算QPS和TPS

QPS=(Queries2-Queries1)/(Uptime_since_flush_status2-Uptime_since_flush_status1)

TPS=((Com_insert2+Com_update2+Com_delete2)-(Com_insert1+Com_update1+Com_delete1))/(Uptime_since_flush_status2-Uptime_since_flush_status1)

如何监控数据库的并发请求数量

数据库系统的性能会随着并发处理请求数量的增加而降低

并发处理的数量通常会远小于同一时间连接到数据库的线程的数量

show global status like 'Threads_running';

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


mysql> select connection_id(); 查看当前用户的连接数

mysql> set global innodb_lock_wait_timeout=180; 

mysql> begin; 

#线程1
mysql> select * from t for update; t表加排它锁

#线程2
mysql> select * from t for update; 遭到阻塞

##MySQL主从复制监控##

参与复制的主从服务器之间一定会存在着一些延迟

show slave status;

当网络出现问题时,master上有大量的binlog没有同步到slave上,上面的命令并不能有效的显示延迟值

show master status\G;

当每次修复完主从复制,都要检查主从复制数据的一致性

pt-table-checksum 工具

pt-table-checksum u=dba,p='password' \
	--databases mysql \
	--replicate test.checksums

GRANT SELECT,PROCESS,SUPER,REPLICATION SLAVE ON *.* TO 'dba'@'ip' IDENTIFIED BY 'password';