外观
MariaDB 核心监控指标清单
监控指标概述
MariaDB 监控指标是评估数据库健康状态、性能和可靠性的关键依据。通过监控这些指标,可以及时发现数据库问题,预防故障发生,确保数据库服务的稳定运行。
监控指标分类
| 指标类型 | 监控内容 | 主要指标 |
|---|---|---|
| 性能指标 | 数据库响应速度和处理能力 | 查询响应时间、吞吐量、连接数、线程状态 |
| 状态指标 | 数据库运行状态 | 服务状态、复制状态、事务状态、锁状态 |
| 资源使用指标 | 系统资源消耗 | CPU、内存、磁盘 I/O、网络 I/O |
| 存储指标 | 存储使用情况 | 数据文件大小、表空间使用率、碎片率 |
| 安全指标 | 安全相关指标 | 错误连接尝试、权限变更、审计日志 |
| 特有指标 | MariaDB 特有功能指标 | Galera Cluster 状态、MaxScale 状态、ColumnStore 状态 |
性能指标
1. 查询性能指标
| 指标名称 | 指标描述 | 监控命令/变量 | 告警阈值 | 优化建议 |
|---|---|---|---|---|
| Queries per Second (QPS) | 每秒处理的查询数量 | SHOW GLOBAL STATUS LIKE 'Queries' | 根据业务需求设置 | 优化慢查询、增加缓存、扩容硬件 |
| Transactions per Second (TPS) | 每秒处理的事务数量 | SHOW GLOBAL STATUS LIKE 'Com_commit' + SHOW GLOBAL STATUS LIKE 'Com_rollback' | 根据业务需求设置 | 优化事务设计、减少锁冲突、调整事务隔离级别 |
| 慢查询数量 | 超过慢查询阈值的查询数量 | SHOW GLOBAL STATUS LIKE 'Slow_queries' | > 10 个/分钟 | 优化慢查询、调整 long_query_time 阈值 |
| 查询响应时间 | 查询的平均响应时间 | 监控工具(如 Prometheus + Grafana) | > 500ms | 优化 SQL、添加索引、调整缓存 |
| 连接使用率 | 当前连接数与最大连接数的比例 | SHOW GLOBAL STATUS LIKE 'Threads_connected' / SHOW VARIABLES LIKE 'max_connections' | > 80% | 增加 max_connections、优化连接池、减少连接占用时间 |
2. 线程状态指标
| 指标名称 | 指标描述 | 监控命令/变量 | 告警阈值 | 优化建议 |
|---|---|---|---|---|
| 活跃线程数 | 当前活跃的线程数量 | SHOW GLOBAL STATUS LIKE 'Threads_running' | > CPU 核心数 * 2 | 优化查询、增加线程池大小、调整 innodb_thread_concurrency |
| 连接线程数 | 当前连接的线程数量 | SHOW GLOBAL STATUS LIKE 'Threads_connected' | > max_connections * 0.8 | 增加 max_connections、优化连接池 |
| 缓存线程数 | 缓存的线程数量 | SHOW GLOBAL STATUS LIKE 'Threads_cached' | < 5 或 > max_connections * 0.2 | 调整 thread_cache_size |
| 创建线程数 | 每秒创建的线程数量 | SHOW GLOBAL STATUS LIKE 'Threads_created' | > 10 个/秒 | 增加 thread_cache_size |
3. 缓存性能指标
| 指标名称 | 指标描述 | 监控命令/变量 | 告警阈值 | 优化建议 |
|---|---|---|---|---|
| InnoDB 缓冲池命中率 | InnoDB 缓冲池的命中率 | (Innodb_buffer_pool_read_requests - Innodb_buffer_pool_reads) / Innodb_buffer_pool_read_requests * 100 | < 95% | 增加 innodb_buffer_pool_size |
| 查询缓存命中率 | 查询缓存的命中率 | (Qcache_hits / (Qcache_hits + Qcache_inserts + Qcache_not_cached)) * 100 | < 30% | 调整 query_cache_size、query_cache_type |
| 表缓存命中率 | 表缓存的命中率 | (Open_tables / (Open_tables + Opened_tables)) * 100 | < 80% | 增加 table_open_cache、table_definition_cache |
| 键缓存命中率 | MyISAM 键缓存的命中率 | (Key_read_requests - Key_reads) / Key_read_requests * 100 | < 95% | 增加 key_buffer_size |
状态指标
1. 服务状态指标
| 指标名称 | 指标描述 | 监控命令/变量 | 告警阈值 | 优化建议 |
|---|---|---|---|---|
| 数据库运行状态 | 数据库服务是否正常运行 | systemctl status mariadb 或 mysqladmin ping | 服务停止 | 启动服务、检查错误日志、修复故障 |
| 正常运行时间 | 数据库服务的正常运行时间 | SHOW GLOBAL STATUS LIKE 'Uptime' | < 3600 秒(频繁重启) | 检查错误日志、修复根本原因 |
| 连接错误数 | 连接数据库失败的次数 | SHOW GLOBAL STATUS LIKE 'Aborted_connects' | > 10 个/分钟 | 检查连接配置、网络状态、权限设置 |
| 拒绝连接数 | 由于连接数限制拒绝的连接数 | SHOW GLOBAL STATUS LIKE 'Connections' - SHOW GLOBAL STATUS LIKE 'Max_used_connections' | > 0 | 增加 max_connections、优化连接池 |
2. 复制状态指标
| 指标名称 | 指标描述 | 监控命令/变量 | 告警阈值 | 优化建议 |
|---|---|---|---|---|
| 复制状态 | 从库复制是否正常运行 | SHOW SLAVE STATUS\G 中的 Slave_IO_Running 和 Slave_SQL_Running | 任一为 No | 检查复制配置、网络连接、主从数据一致性 |
| 主从延迟 | 从库与主库的延迟时间(秒) | SHOW SLAVE STATUS\G 中的 Seconds_Behind_Master | > 300 秒 | 优化主库性能、调整复制参数、增加从库硬件资源 |
| 复制队列大小 | 从库 Relay Log 队列大小 | SHOW SLAVE STATUS\G 中的 Relay_Log_Space | > 1GB | 优化从库性能、增加从库硬件资源 |
| GTID 一致性 | 主从 GTID 是否一致 | SHOW SLAVE STATUS\G 中的 Executed_Gtid_Set 与主库的 SHOW MASTER STATUS | 不一致 | 修复 GTID 一致性、重新初始化从库 |
3. 事务状态指标
| 指标名称 | 指标描述 | 监控命令/变量 | 告警阈值 | 优化建议 |
|---|---|---|---|---|
| 活跃事务数 | 当前活跃的事务数量 | SHOW ENGINE INNODB STATUS 中的 TRANSACTIONS 部分 | > 100 | 优化长事务、调整事务隔离级别、增加资源 |
| 锁定事务数 | 当前锁定的事务数量 | SHOW ENGINE INNODB STATUS 中的 LOCK WAIT 部分 | > 10 | 优化锁冲突、调整事务隔离级别、减少事务持有锁的时间 |
| 回滚事务比例 | 回滚事务占总事务的比例 | Com_rollback / (Com_commit + Com_rollback) * 100 | > 10% | 检查应用逻辑、优化事务设计、增加错误处理 |
| 死锁数量 | 发生死锁的数量 | SHOW GLOBAL STATUS LIKE 'Innodb_deadlocks' | > 1 个/小时 | 优化事务顺序、减少锁持有时间、调整 innodb_deadlock_detect |
4. 锁状态指标
| 指标名称 | 指标描述 | 监控命令/变量 | 告警阈值 | 优化建议 |
|---|---|---|---|---|
| 表锁等待数 | 等待表锁的次数 | SHOW GLOBAL STATUS LIKE 'Table_locks_waited' | > 10 个/分钟 | 优化 SQL、减少锁持有时间、使用 InnoDB 引擎 |
| 行锁等待时间 | 行锁等待的总时间 | SHOW GLOBAL STATUS LIKE 'Innodb_row_lock_time' | > 1000 秒/小时 | 优化索引、减少锁冲突、调整事务隔离级别 |
| 行锁等待数 | 等待行锁的次数 | SHOW GLOBAL STATUS LIKE 'Innodb_row_lock_waits' | > 100 个/小时 | 优化索引、减少锁冲突、调整事务隔离级别 |
| 锁等待比例 | 锁等待占总请求的比例 | (Table_locks_waited + Innodb_row_lock_waits) / Queries * 100 | > 1% | 优化 SQL、添加索引、调整事务设计 |
资源使用指标
1. CPU 使用率指标
| 指标名称 | 指标描述 | 监控命令/变量 | 告警阈值 | 优化建议 |
|---|---|---|---|---|
| 数据库进程 CPU 使用率 | MariaDB 进程的 CPU 使用率 | 监控工具(如 top、htop、Prometheus) | > 80% | 优化查询、增加 CPU 核心数、调整线程池配置 |
| 系统 CPU 使用率 | 整个系统的 CPU 使用率 | 监控工具(如 top、htop、Prometheus) | > 90% | 优化查询、关闭不必要的进程、扩容硬件 |
| CPU 负载 | 系统 CPU 负载 | uptime 或监控工具 | > CPU 核心数 * 1.5 | 优化查询、增加 CPU 核心数、调整线程池配置 |
2. 内存使用率指标
| 指标名称 | 指标描述 | 监控命令/变量 | 告警阈值 | 优化建议 |
|---|---|---|---|---|
| 数据库进程内存使用率 | MariaDB 进程的内存使用率 | 监控工具(如 top、htop、Prometheus) | > 系统内存的 80% | 调整内存相关参数、增加系统内存 |
| InnoDB 缓冲池使用率 | InnoDB 缓冲池的使用率 | SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_data' / SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_total' * 100 | > 90% | 增加 innodb_buffer_pool_size、优化查询 |
| 系统内存使用率 | 整个系统的内存使用率 | 监控工具(如 free、Prometheus) | > 90% | 调整内存相关参数、增加系统内存、关闭不必要的服务 |
| Swap 使用率 | 系统 Swap 分区的使用率 | 监控工具(如 free、Prometheus) | > 20% | 增加系统内存、调整内存相关参数、关闭 Swap |
3. 磁盘 I/O 指标
| 指标名称 | 指标描述 | 监控命令/变量 | 告警阈值 | 优化建议 |
|---|---|---|---|---|
| 磁盘使用率 | 数据目录所在磁盘的使用率 | df -h 或监控工具 | > 80% | 清理数据、扩容磁盘、归档历史数据 |
| 磁盘 I/O 使用率 | 磁盘 I/O 使用率 | 监控工具(如 iostat、Prometheus) | > 80% | 优化查询、调整 innodb_io_capacity、使用 SSD 存储 |
| 读写 IOPS | 每秒的 I/O 操作数 | 监控工具(如 iostat、Prometheus) | 根据磁盘性能设置 | 优化查询、调整 innodb_io_capacity、使用 SSD 存储 |
| 平均 I/O 等待时间 | 平均 I/O 等待时间 | 监控工具(如 iostat、Prometheus) | > 10ms | 优化查询、调整 innodb_io_capacity、使用 SSD 存储 |
| InnoDB I/O pending | InnoDB 等待 I/O 的请求数 | SHOW GLOBAL STATUS LIKE 'Innodb_data_pending_reads' + SHOW GLOBAL STATUS LIKE 'Innodb_data_pending_writes' | > 100 | 优化查询、调整 innodb_io_capacity、使用 SSD 存储 |
4. 网络 I/O 指标
| 指标名称 | 指标描述 | 监控命令/变量 | 告警阈值 | 优化建议 |
|---|---|---|---|---|
| 网络发送流量 | 数据库发送的网络流量 | 监控工具(如 iftop、Prometheus) | 根据网络带宽设置 | 优化查询、减少网络传输、增加网络带宽 |
| 网络接收流量 | 数据库接收的网络流量 | 监控工具(如 iftop、Prometheus) | 根据网络带宽设置 | 优化查询、减少网络传输、增加网络带宽 |
| 网络连接数 | 数据库的网络连接数 | `netstat -an | grep 3306 | wc -l` |
存储指标
1. 数据文件指标
| 指标名称 | 指标描述 | 监控命令/变量 | 告警阈值 | 优化建议 |
|---|---|---|---|---|
| 数据文件总大小 | 数据库数据文件的总大小 | du -sh /var/lib/mysql 或 SHOW TABLE STATUS | 根据磁盘容量设置 | 清理数据、归档历史数据、扩容磁盘 |
| 表空间使用率 | 表空间的使用率 | SHOW TABLE STATUS 中的 Data_length + Index_length | > 100GB | 分区表、归档历史数据、清理碎片 |
| 日志文件大小 | 日志文件(Redo Log、Binlog)的大小 | ls -la /var/lib/mysql/*.log | 根据磁盘容量设置 | 调整日志文件大小、启用日志自动清理 |
| 临时表空间大小 | 临时表空间的大小 | SHOW GLOBAL STATUS LIKE 'Created_tmp_disk_tables' 或 ls -la /var/lib/mysql/ibtmp* | > 10GB | 优化查询、增加 tmp_table_size、max_heap_table_size |
2. 表和索引指标
| 指标名称 | 指标描述 | 监控命令/变量 | 告警阈值 | 优化建议 |
|---|---|---|---|---|
| 表数量 | 数据库中的表数量 | SHOW TABLES 或 SELECT COUNT(*) FROM information_schema.tables WHERE table_schema NOT IN ('mysql', 'information_schema', 'performance_schema') | 根据数据库设计设置 | 合并表、分区表、归档历史表 |
| 索引使用率 | 索引的使用率 | 监控工具(如 pt-index-usage) | < 50% | 删除不必要的索引、优化查询 |
| 全表扫描次数 | 全表扫描的次数 | SHOW GLOBAL STATUS LIKE 'Select_scan' | > 100 个/分钟 | 优化查询、添加索引、调整查询条件 |
| 表碎片率 | 表的碎片率 | SHOW TABLE STATUS 中的 Data_free / (Data_length + Index_length) | > 20% | 优化表(OPTIMIZE TABLE)、定期重建表 |
安全指标
1. 访问控制指标
| 指标名称 | 指标描述 | 监控命令/变量 | 告警阈值 | 优化建议 |
|---|---|---|---|---|
| 失败登录尝试次数 | 登录失败的次数 | SHOW GLOBAL STATUS LIKE 'Access_denied_errors' | > 10 个/分钟 | 检查密码策略、启用连接控制插件、监控恶意登录 |
| 用户权限变更次数 | 用户权限变更的次数 | 审计日志 | > 0(非计划变更) | 检查权限变更原因、启用审计日志、限制权限变更权限 |
| 匿名用户存在 | 是否存在匿名用户 | SELECT User, Host FROM mysql.user WHERE User='' | 存在匿名用户 | 删除匿名用户、加强权限管理 |
| 空密码用户存在 | 是否存在空密码用户 | SELECT User, Host FROM mysql.user WHERE authentication_string='' | 存在空密码用户 | 设置强密码、加强密码策略 |
2. 审计日志指标
| 指标名称 | 指标描述 | 监控命令/变量 | 告警阈值 | 优化建议 |
|---|---|---|---|---|
| 审计日志启用状态 | 审计日志是否启用 | SHOW VARIABLES LIKE 'server_audit_logging' | 未启用 | 启用审计日志、配置审计规则 |
| 敏感操作次数 | 敏感操作(如 DROP、ALTER)的次数 | 审计日志 | > 0(非计划操作) | 检查敏感操作原因、启用操作审批流程、限制敏感操作权限 |
| 审计日志大小 | 审计日志的大小 | ls -la /var/lib/mysql/server_audit.log | > 10GB | 启用日志轮转、调整审计日志保留策略 |
MariaDB 特有指标
1. Galera Cluster 指标
| 指标名称 | 指标描述 | 监控命令/变量 | 告警阈值 | 优化建议 |
|---|---|---|---|---|
| 集群状态 | Galera 集群是否正常运行 | SHOW STATUS LIKE 'wsrep_cluster_status' | 非 Primary | 检查集群配置、网络连接、节点状态 |
| 集群节点数量 | Galera 集群中的节点数量 | SHOW STATUS LIKE 'wsrep_cluster_size' | < 3 或与预期不符 | 检查节点状态、添加或移除节点 |
| 节点状态 | 节点在集群中的状态 | SHOW STATUS LIKE 'wsrep_local_state_comment' | 非 Synced | 检查节点日志、网络连接、数据一致性 |
| 复制延迟 | 节点间的复制延迟 | SHOW STATUS LIKE 'wsrep_local_recv_queue' | > 10 | 优化网络、调整 wsrep_slave_threads、增加节点资源 |
| 冲突解决次数 | 集群中冲突解决的次数 | SHOW STATUS LIKE 'wsrep_local_cert_failures' | > 10 个/分钟 | 优化应用设计、调整冲突检测级别、使用乐观锁 |
2. ColumnStore 指标
| 指标名称 | 指标描述 | 监控命令/变量 | 告警阈值 | 优化建议 |
|---|---|---|---|---|
| ColumnStore 状态 | ColumnStore 服务是否正常运行 | mcsadmin getSystemStatus | 服务异常 | 检查 ColumnStore 日志、重启服务、修复故障 |
| 查询执行时间 | ColumnStore 查询的执行时间 | 监控工具或 SHOW PROFILE | > 30 秒 | 优化查询、调整 ColumnStore 配置、增加资源 |
| 数据加载状态 | 数据加载作业的状态 | mcsadmin listLoads | 加载失败 | 检查加载日志、修复数据格式、调整加载参数 |
| 存储节点使用率 | 存储节点的磁盘使用率 | df -h 或 mcsadmin getSystemStatus | > 80% | 扩容存储节点、归档历史数据 |
监控指标收集方法
1. 使用 MariaDB 内置命令
bash
# 查看全局状态变量
SHOW GLOBAL STATUS;
# 查看特定状态变量
SHOW GLOBAL STATUS LIKE 'Queries';
SHOW GLOBAL STATUS LIKE 'Threads_connected';
# 查看 InnoDB 状态
SHOW ENGINE INNODB STATUS\G;
# 查看复制状态
SHOW SLAVE STATUS\G;
# 查看变量设置
SHOW VARIABLES LIKE 'max_connections';
# 查看表状态
SHOW TABLE STATUS LIKE 'mytable'\G;2. 使用监控工具
命令行工具
bash
# 使用 mysqladmin 查看状态
mysqladmin -u root -p extended-status
mysqladmin -u root -p processlist
mysqladmin -u root -p status
# 使用 iostat 查看磁盘 I/O
iostat -dx 1
# 使用 vmstat 查看系统资源
vmstat 1
# 使用 top 查看进程资源使用
top -p $(pgrep -f mysqld)监控平台
Prometheus + Grafana:
- 使用
node_exporter收集系统指标 - 使用
mysqld_exporter收集 MariaDB 指标 - 使用 Grafana 创建监控仪表盘
- 使用
Zabbix:
- 使用 Zabbix Agent 收集系统指标
- 使用 MariaDB 模板收集数据库指标
- 配置告警规则和通知
Nagios/Icinga:
- 使用 check_mysql 插件收集数据库指标
- 配置服务检查和告警
商业监控工具:
- SolarWinds Database Performance Monitor
- Datadog
- New Relic
监控指标最佳实践
- 选择关键指标:根据业务需求和数据库规模选择关键指标进行监控,避免监控过多无关指标
- 设置合理阈值:根据数据库性能和业务需求设置合理的告警阈值,避免误告警
- 定期调整指标:根据数据库负载和业务变化定期调整监控指标和阈值
- 集成监控平台:使用专业的监控平台进行集中监控和告警管理
- 自动化响应:对于常见问题,实现自动化响应和修复
- 监控数据可视化:使用图表和仪表盘可视化监控数据,便于快速识别问题
- 历史数据保留:保留足够的历史监控数据,便于趋势分析和容量规划
- 监控覆盖全面:覆盖性能、状态、资源、安全等各个方面的指标
常见问题(FAQ)
Q1: 监控指标太多,如何选择关键指标?
A: 可以根据以下原则选择关键指标:
- 业务相关性:选择与业务直接相关的指标,如 QPS、TPS、响应时间
- 系统健康度:选择反映系统健康状态的指标,如服务状态、复制状态、磁盘使用率
- 性能瓶颈:选择可能成为性能瓶颈的指标,如 CPU 使用率、内存使用率、磁盘 I/O
- 安全风险:选择反映安全风险的指标,如失败登录尝试、权限变更
Q2: 如何设置合理的告警阈值?
A: 可以通过以下方法设置合理的告警阈值:
- 基准测试:在系统正常运行时进行基准测试,确定正常指标范围
- 历史数据分析:分析历史监控数据,确定指标的正常波动范围
- 业务需求:根据业务的 SLA 要求设置告警阈值
- 逐步调整:先设置宽松的阈值,然后根据实际情况逐步调整
- 分层告警:设置多个告警级别(警告、严重、紧急),根据指标严重程度触发不同级别的告警
Q3: 如何处理大量的告警?
A: 可以采取以下措施:
- 优化告警规则:调整告警阈值,减少误告警
- 合并相关告警:将相关的告警合并为一个告警,减少告警数量
- 设置告警抑制:在特定情况下抑制某些告警
- 自动化响应:对于常见问题,实现自动化响应和修复
- 告警分级:根据告警严重程度进行分级,优先处理严重告警
Q4: 如何实现监控数据的可视化?
A: 可以使用以下工具实现监控数据的可视化:
- Grafana:开源的监控数据可视化工具,支持多种数据源
- Kibana:与 Elasticsearch 配合使用,支持日志和指标的可视化
- Zabbix 仪表盘:Zabbix 内置的仪表盘功能
- 商业监控工具:如 Datadog、New Relic 等提供的可视化功能
Q5: 如何进行监控数据的趋势分析?
A: 可以通过以下方法进行趋势分析:
- 长期数据保留:保留足够的历史监控数据,便于趋势分析
- 使用时间序列数据库:如 Prometheus、InfluxDB 等,专门用于存储时间序列数据
- 使用趋势分析工具:如 Grafana 的趋势图、Prometheus 的查询语言
- 定期报告:生成定期的监控报告,分析指标趋势和变化
- 容量规划:根据监控数据的趋势进行容量规划,提前扩容资源
最佳实践总结
- 全面监控:监控性能、状态、资源、安全等各个方面的指标
- 合理选择指标:选择与业务相关的关键指标,避免监控过多无关指标
- 设置合理阈值:根据数据库性能和业务需求设置合理的告警阈值
- 集成监控平台:使用专业的监控平台进行集中监控和告警管理
- 自动化响应:对于常见问题,实现自动化响应和修复
- 可视化监控数据:使用图表和仪表盘可视化监控数据,便于快速识别问题
- 历史数据分析:分析历史监控数据,进行趋势分析和容量规划
- 定期优化:根据监控数据定期优化数据库配置和查询
通过全面监控 MariaDB 的核心指标,可以及时发现数据库问题,预防故障发生,确保数据库服务的稳定运行,提高业务的可用性和可靠性。
