生猛干货
带你搞定MySQL实战,轻松对应海量业务处理及高并发需求,从容应对大场面试
官方文档
如果英文不好的话,可以参考 searchdoc 翻译的中文版本
http://www.searchdoc.cn/rdbms/mysql/dev.mysql.com/doc/refman/5.7/en/index.com.coder114.cn.html
监控指标
先大体说下几个点哈
- 对数据库服务可用性进行监控
有一点需要注意的是,不能仅仅监控端口或者进程是否正常,要连接进去,执行一些SQL操作。
- 对数据库性能进行监控
这一块就比较多了, 比如QPS 和TPS的监控, 并发线程的监控 (不是数据库的连接数)、 阻塞和死锁监控 等等 - 对主从复制的监控
主从链路状态 、 主从延迟 、 主从数据一致
- 对服务器资源的监控
磁盘空间、内存 、SWAP分区、网络I/O 、CPU等等
接下来,展开探讨一下
数据库可用性监控
如何确认数据库是否可以通过网络连接?
MySQL本地的SQL文件能连接,并不意味着可以通过网络连接,中间有好多东西隔着呢
通常有几种方式,选一种
- mysqladmin -umonitor_user -p -h ping
-u 监控的用户
- telnet ip db_port
- 模拟应用程序使用网络建立数据库连接 (推荐)
如何确认数据库是否可读写
- 检查数据库的read_only参数是否为off
比如从库这个参数 建议关闭 ,主从切换后,这个参数就要打开,防止新的主不可写。
- 建立监控表,并对表中数据进行更新
- 如果检测是否可读的话 ,执行
select @@version
如何监控数据库的连接数 max_connections | Threads_connected
需要时刻关注DB连接数
show variables like ‘max_connections’ , 然后 show global status like ‘Threads_connected’
max_connections参数用来设置最大连接(用户)数 , Threads_connected查看当前打开的连接的数量, 可以用这个两个参数的比值超过阈值进行告警等。
mysql> show variables like 'max_connections'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | max_connections | 151 | +-----------------+-------+ 1 row in set (0.00 sec) mysql> show global status like 'Threads_connected' ; +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | Threads_connected | 4 | +-------------------+-------+ 1 row in set (0.00 sec) mysql>
mysql> show global status like 'Threads_running'; # 当前连接数 +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | Threads_running | 2 | +-----------------+-------+ 1 row in set (0.04 sec) mysql>
数据库性能
记录性能监控中所采集到的数据库的状态
下面我们列举下最常见的监控指标
如何计算QPS和TPS
QPS 并不是仅仅只select 的,而是数据库处理所有SQL请求的。
QPS
公式 (采集两次,通过差值获取)
QPS=(Queries2 - Queries1) / (Uptime_since_flush_status2-Uptime_since_flush_status1)
这些参数都可以通过show status 来获取 如下
mysql> show global status like 'queries'; # 这个值时累加的; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Queries | 4820 | +---------------+-------+ 1 row in set (0.05 sec) mysql> show global status like 'uptime_since_flush_status'; +---------------------------+--------+ | Variable_name | Value | +---------------------------+--------+ | Uptime_since_flush_status | 536208 | +---------------------------+--------+ 1 row in set (0.03 sec) mysql>
TPS
公式
TPS = ((com_insert2+com_update2+com_delete2)-(com_insert1+com_update1+com_delete1) /(uptime_since_flush_status2-uptime_since_flush_status1);
同样的 这些参数都可以通过show status 来获取 如下
mysql> show global status like 'com_insert'; # 写入事务的数量,这个值是累加的 +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Com_insert | 1038 | +---------------+-------+ 1 row in set (0.04 sec) mysql> show global status like 'com_update'; # 更新事务的数量,这个值是累加的 +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Com_update | 4 | +---------------+-------+ 1 row in set (0.00 sec) mysql> show global status like 'com_delete'; # 删除事务的数量,这个值是累加的 +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Com_delete | 1 | +---------------+-------+ 1 row in set (0.00 sec) mysql> show global status like 'uptime_since_flush_status'; +---------------------------+--------+ | Variable_name | Value | +---------------------------+--------+ | Uptime_since_flush_status | 536404 | +---------------------------+--------+ 1 row in set (0.04 sec) mysql>
并发数量监控 Threads_running
数据库系统的性能会随着并发处理请求数量的增加而下降;
并发的数量通常会远小于同一时间连接到数据库的线程数量。
获取并发量
mysql> show global status like 'Threads_running'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | Threads_running | 2 | +-----------------+-------+ 1 row in set (0.04 sec) mysql>
Innodb的阻塞监控
阻塞时间> 60秒的 SQL
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 AS a JOIN information_schema.INNODB_TRX AS b ON a.requesting_trx_id = b.trx_id JOIN information_schema.INNODB_TRX AS c ON a.blocking_trx_id = c.trx_id WHERE ( UNIX_TIMESTAMP() - UNIX_TIMESTAMP(c.trx_started) ) > 60;
搞定MySQL
https://artisan.blog.csdn.net/article/details/104162589?spm=1001.2014.3001.5502