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