mysqlMonitor - juedaiyuer/researchNote GitHub Wiki
#mysql---监控#
Nagios
Zabbix
##对什么进行监控##
- 对数据库服务可用性进行监控
- 对数据库性能进行监控(QPS和TPS,并发线程数量,Innodb阻塞和死锁)
- 对主从复制进行监控
- 对服务器资源的监控(磁盘空间,CPU,内存使用,Swap分区,网络IO)
数据库进程或是端口存在并不意味着数据库就是可用的
通过网络连接到数据库并且确定数据库是可以对外提供服务的
服务器磁盘空间大并不意味着MySQL数据库服务能使用的空间就足够大
主从复制的监控
- 主从复制链路状态
- 延迟
- 定期的确认主从复制的数据是否一致
##数据库可用性监控##
如何确认数据库是否可以通过网络连接
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';