Skip to content

MySQL 监控指标规范

监控指标分类

系统层面指标

  • CPU 使用率:数据库服务器 CPU 使用率,包括用户态、系统态和空闲率
  • 内存使用率:系统内存使用情况,包括已用内存、可用内存、缓冲区和缓存
  • 磁盘空间:数据目录、日志目录和临时目录的磁盘空间使用情况
  • 磁盘 I/O:磁盘读写速率、IOPS、等待时间和利用率
  • 网络流量:网络发送和接收速率、连接数和错误率

MySQL 服务指标

  • 连接状态:当前连接数、最大连接数、连接使用率、连接错误数
  • 查询性能:QPS(每秒查询数)、TPS(每秒事务数)、慢查询数
  • 线程状态:活跃线程数、连接线程数、缓存线程数、线程创建速率
  • 锁定状态:表锁数量、行锁数量、锁等待时间、死锁数量
  • 复制状态:主从延迟、复制错误、复制线程状态

存储引擎指标

  • InnoDB 缓冲池:缓冲池命中率、脏页比例、缓冲池大小使用率
  • InnoDB 日志:日志写入速率、日志刷新频率、日志缓冲区命中率
  • InnoDB 行操作:行查询、插入、更新、删除速率
  • InnoDB 锁:行锁等待数、行锁等待时间、锁冲突数
  • 表空间:表空间大小、表空间增长速率

SQL 性能指标

  • 慢查询:慢查询数量、慢查询比例、慢查询平均执行时间
  • 索引使用:索引命中率、全表扫描次数、索引扫描次数
  • 临时表:磁盘临时表数量、内存临时表数量、临时表大小
  • 排序操作:排序次数、排序行数量、排序使用内存大小
  • 连接操作:连接查询次数、连接类型分布、连接效率

核心监控指标

必须监控的关键指标

指标名称描述监控频率告警阈值版本差异
CPU 使用率数据库服务器 CPU 使用率1分钟>80% 持续5分钟
内存使用率系统内存使用率1分钟>85% 持续5分钟
磁盘空间使用率数据目录磁盘空间5分钟>90%
连接使用率当前连接数/最大连接数1分钟>80% 持续3分钟
QPS/TPS每秒查询数/事务数1分钟突增/骤降 >50%
慢查询数每秒慢查询数量1分钟>5个持续5分钟
InnoDB 缓冲池命中率缓冲池读取命中率5分钟<95% 持续10分钟
主从延迟从库落后主库秒数1分钟>30秒5.7+ 支持更精确的延迟监控
死锁数量每秒死锁次数5分钟>1个持续5分钟
锁等待时间平均锁等待时间5分钟>100ms

推荐监控的扩展指标

  • InnoDB 脏页比例:反映写入压力,>25% 可能影响性能
  • 线程创建速率:过高表示连接池配置不合理
  • 临时表使用率:过高表示查询优化不足
  • 全表扫描次数:过高表示索引设计不合理
  • 日志刷新频率:过高可能导致 I/O 瓶颈
  • 网络错误率:反映网络连接稳定性

监控频率规范

高频监控指标(1分钟)

  • CPU 使用率
  • 内存使用率
  • 连接状态
  • QPS/TPS
  • 慢查询数
  • 主从延迟
  • 线程状态

中频监控指标(5分钟)

  • 磁盘空间
  • 磁盘 I/O
  • 网络流量
  • InnoDB 缓冲池指标
  • 锁状态
  • 死锁数量

低频监控指标(30分钟)

  • 表空间增长
  • 索引使用情况
  • 临时表使用情况
  • 连接效率
  • 排序操作统计

告警阈值设置

阈值设置原则

  • 基于历史数据:根据系统正常运行时的历史数据设置基线
  • 分级告警:设置警告、严重、紧急三个级别的告警阈值
  • 考虑业务场景:不同业务类型的阈值设置应有所不同
  • 避免告警风暴:合理设置告警间隔和抑制规则
  • 定期调整:根据系统变化和业务增长定期调整阈值

告警级别定义

  • 警告级别:系统出现异常但不影响业务,需要关注
  • 严重级别:系统性能下降,可能影响业务,需要立即处理
  • 紧急级别:系统出现故障,业务受到严重影响,需要紧急处理

常见告警规则示例

yaml
# CPU 使用率告警
- 指标:cpu_usage
  警告:>80% 持续5分钟
  严重:>90% 持续3分钟
  紧急:>95% 持续1分钟

# 连接使用率告警
- 指标:connection_usage
  警告:>80% 持续3分钟
  严重:>90% 持续2分钟
  紧急:>95% 持续1分钟

# 主从延迟告警
- 指标:replication_delay
  警告:>30秒 持续5分钟
  严重:>60秒 持续3分钟
  紧急:>120秒 持续1分钟

# 慢查询告警
- 指标:slow_queries
  警告:>5个/分钟 持续5分钟
  严重:>10个/分钟 持续3分钟
  紧急:>20个/分钟 持续1分钟

监控数据存储

数据保留策略

  • 实时数据:保存7天,用于近期问题排查
  • 聚合数据:按小时聚合保存30天,用于趋势分析
  • 历史数据:按天聚合保存1年,用于容量规划和长期趋势分析

数据采集方式

  • MySQL 内置状态变量:通过 SHOW GLOBAL STATUS 命令获取
  • Performance Schema:MySQL 5.7+ 提供的性能监控架构
  • Sys Schema:基于 Performance Schema 的视图集合,提供更易用的监控数据
  • 日志文件:慢查询日志、错误日志、二进制日志
  • 操作系统命令:通过 sar、iostat、vmstat 等命令获取系统指标

监控工具集成

  • Zabbix:支持 MySQL 模板,提供完整的监控和告警功能
  • Prometheus + Grafana:开源监控解决方案,支持自定义指标和可视化
  • Nagios:传统监控工具,支持 MySQL 插件
  • MySQL Enterprise Monitor:官方商业监控工具,提供全面的监控和建议
  • OpenTelemetry:云原生可观测性框架,支持 MySQL 指标采集

监控最佳实践

监控体系设计

  • 分层监控:从系统层、服务层到应用层的全栈监控
  • 集中管理:所有监控数据集中存储和管理,便于关联分析
  • 可视化展示:使用仪表盘直观展示关键指标,支持多维度分析
  • 智能告警:结合机器学习和历史数据,实现智能告警和异常检测
  • 自动化响应:对于常见问题,实现自动化处理和恢复

告警管理

  • 告警分级:根据影响范围和严重程度分级处理
  • 告警降噪:合并重复告警,设置合理的告警间隔
  • 告警升级:长时间未处理的告警自动升级
  • 告警统计:定期分析告警数据,优化告警规则
  • 告警演练:定期进行告警演练,确保告警系统正常工作

性能优化建议

  • 基于监控数据优化:根据监控指标识别性能瓶颈,针对性优化
  • 定期性能评估:每月进行一次全面的性能评估,识别潜在问题
  • 容量规划:根据监控数据的趋势分析,提前进行容量规划
  • 参数调优:根据监控指标调整 MySQL 配置参数
  • 查询优化:分析慢查询日志,优化 SQL 语句和索引

常见问题(FAQ)

Q1: 监控指标过多如何选择核心指标?

A1: 优先选择影响业务的关键指标,如 CPU 使用率、内存使用率、连接状态、QPS/TPS、慢查询数和主从延迟,然后根据业务特点和系统架构选择扩展指标。

Q2: 告警阈值如何设置才合理?

A2: 告警阈值应基于系统正常运行时的历史数据设置基线,考虑业务高峰期的指标变化,设置分级告警,并定期根据系统变化调整阈值。

Q3: 如何处理大量的告警信息?

A3: 实现告警分级、告警降噪和告警升级机制,合并重复告警,设置合理的告警间隔,对于常见问题实现自动化处理,定期分析告警数据优化告警规则。

Q4: 监控数据保存多久比较合适?

A4: 实时数据保存7天,小时聚合数据保存30天,天聚合数据保存1年,根据实际需求和存储成本调整保存周期。

Q5: MySQL 5.7 和 8.0 的监控指标有什么差异?

A5: MySQL 8.0 增强了 Performance Schema 的功能,增加了更多的监控指标,特别是在复制、安全和资源使用方面,同时优化了部分指标的采集性能。

Q6: 如何监控 MySQL 集群?

A6: 除了监控单个实例的指标外,还需要监控集群整体状态,如集群节点状态、集群复制延迟、集群负载均衡情况和故障转移状态。

Q7: 慢查询监控的最佳实践是什么?

A7: 合理设置慢查询阈值,定期分析慢查询日志,优化 SQL 语句和索引,使用 Performance Schema 和 Sys Schema 深入分析查询性能问题。

Q8: 如何监控 InnoDB 缓冲池的使用情况?

A8: 监控 InnoDB 缓冲池命中率、脏页比例、缓冲池大小使用率和缓冲池读写速率,结合业务特点调整缓冲池大小。

Q9: 如何监控主从复制的健康状态?

A9: 监控主从延迟、复制线程状态、复制错误、二进制日志和中继日志的状态,定期验证主从数据一致性。

Q10: 如何实现 MySQL 监控的自动化?

A10: 使用自动化监控工具采集和分析监控数据,设置智能告警规则,实现常见问题的自动化处理和恢复,定期生成性能报告。