数据库监控
数据库监控模块提供对各类数据库服务的全面监控能力,支持MySQL、Redis、MongoDB等多种数据库类型,帮助用户实时掌握数据库的运行状态、性能指标和异常情况,保障数据服务的稳定运行。
1. 功能概述
数据库监控模块提供以下核心功能:
- 多类型数据库支持:支持MySQL、Redis、MongoDB、PostgreSQL等主流数据库
- 实时性能监控:实时监控数据库的关键性能指标,如查询响应时间、连接数、缓存命中率等
- 资源使用监控:监控数据库服务器的CPU、内存、磁盘I/O等资源使用情况
- SQL性能分析:分析慢查询、高频查询等SQL执行情况,识别性能瓶颈
- 数据库结构监控:监控数据库表、索引、连接池等结构信息的变化
- 异常告警:针对数据库异常状态、性能阈值等设置告警规则
- 历史数据趋势分析:提供长期性能趋势分析,支持容量规划
- 数据库健康评分:综合多维度指标评估数据库健康状况
2. 支持的数据库类型
| 数据库类型 | 版本支持 | 监控重点 | 告警关键指标 |
|---|---|---|---|
| MySQL | 5.6+ | 连接数、缓存命中率、慢查询、InnoDB指标 | 连接数、锁等待、复制延迟、TPS/QPS |
| Redis | 3.2+ | 内存使用、命令执行率、命中率、客户端连接数 | 内存使用率、命中率、过期键数 |
| MongoDB | 3.4+ | 操作延迟、连接数、队列长度、写入锁 | 慢查询、连接数、队列长度 |
| PostgreSQL | 9.6+ | 事务数、锁等待、缓存命中率、索引使用情况 | 连接数、锁等待、缓存命中率 |
| Oracle | 11g+ | SGA/PGA使用率、会话数、锁等待、SQL性能 | 缓存命中率、连接数、锁等待 |
| SQL Server | 2012+ | 缓冲池、锁等待、死锁、阻塞 | 缓存命中率、锁等待、死锁数 |
3. MySQL监控
3.1 关键监控指标
3.1.1 全局状态指标
| 指标名称 | 单位 | 描述 | 告警阈值建议 |
|---|---|---|---|
| Connections | 个 | 当前数据库连接数 | >max_connections的80% |
| Threads_running | 个 | 当前运行中的线程数 | >CPU核心数的10倍 |
| Threads_connected | 个 | 当前已连接的线程数 | >max_connections的80% |
| Slow_queries | 个 | 慢查询数量 | 趋势增加或>特定值 |
| Queries | 个 | 查询总数 | 监控趋势 |
| Questions | 个 | 客户端问题数量 | 监控趋势 |
| Uptime | 秒 | 服务器运行时间 | 监控重启 |
3.1.2 性能指标
| 指标名称 | 单位 | 描述 | 告警阈值建议 |
|---|---|---|---|
| TPS | 事务/秒 | 每秒事务处理量 | 监控趋势 |
| QPS | 查询/秒 | 每秒查询处理量 | 监控趋势 |
| Com_select | 次/秒 | 每秒SELECT查询数 | 监控趋势 |
| Com_insert | 次/秒 | 每秒INSERT操作数 | 监控趋势 |
| Com_update | 次/秒 | 每秒UPDATE操作数 | 监控趋势 |
| Com_delete | 次/秒 | 每秒DELETE操作数 | 监控趋势 |
| Com_commit | 次/秒 | 每秒提交事务数 | 监控趋势 |
| Com_rollback | 次/秒 | 每秒回滚事务数 | >总事务的5% |
3.1.3 InnoDB指标
| 指标名称 | 单位 | 描述 | 告警阈值建议 |
|---|---|---|---|
| Innodb_buffer_pool_reads | 次/秒 | 物理读取次数 | 监控趋势 |
| Innodb_buffer_pool_read_requests | 次/秒 | 逻辑读取请求次数 | 监控趋势 |
| Buffer Pool命中率 | % | InnoDB缓冲池命中率 | <95% |
| Innodb_row_lock_waits | 次/秒 | 行锁等待次数 | >10次/秒 |
| Innodb_row_lock_time_avg | 微秒 | 平均行锁等待时间 | >1000微秒 |
| Innodb_deadlocks | 次/秒 | 每秒死锁数 | >0 |
| Innodb_data_fsyncs | 次/秒 | 数据文件同步次数 | 监控I/O压力 |
| Innodb_os_log_fsyncs | 次/秒 | 日志文件同步次数 | 监控I/O压力 |
3.1.4 主从复制指标
| 指标名称 | 单位 | 描述 | 告警阈值建议 |
|---|---|---|---|
| Slave_IO_Running | 状态 | I/O线程是否运行 | 非Yes |
| Slave_SQL_Running | 状态 | SQL线程是否运行 | 非Yes |
| Seconds_Behind_Master | 秒 | 从库延迟时间 | >300秒 |
3.2 慢查询分析
MySQL慢查询监控功能可以帮助用户识别性能瓶颈SQL,主要提供以下信息:
- 慢查询SQL语句
- 执行时间
- 扫描行数
- 锁定行数
- 索引使用情况
- 执行计划
- 数据库/表信息
- 时间分布
3.3 表空间监控
- 数据库总体大小趋势
- 各表空间大小
- 各表空间增长率
- 碎片情况
- 空间使用率预警
4. Redis监控
4.1 关键监控指标
4.1.1 内存指标
| 指标名称 | 单位 | 描述 | 告警阈值建议 |
|---|---|---|---|
| used_memory | 字节 | Redis使用的内存总量 | 接近maxmemory |
| used_memory_rss | 字节 | 操作系统分配给Redis的内存总量 | 监控内存碎片 |
| used_memory_peak | 字节 | Redis内存使用峰值 | 监控趋势 |
| mem_fragmentation_ratio | 比率 | 内存碎片率 | <1.0或>1.5 |
| maxmemory | 字节 | Redis配置的最大内存 | 监控配置 |
| mem_used_percent | % | 内存使用率 | >80% |
4.1.2 性能指标
| 指标名称 | 单位 | 描述 | 告警阈值建议 |
|---|---|---|---|
| instantaneous_ops_per_sec | 操作/秒 | 每秒执行的命令数 | 监控趋势 |
| total_commands_processed | 个 | 处理的命令总数 | 监控趋势 |
| hit_rate | % | 键空间命中率 | <90% |
| miss_rate | % | 键空间未命中率 | >10% |
| evicted_keys | 个/秒 | 每秒被驱逐的键数 | >0(当内存不足时) |
| rejected_connections | 个/秒 | 拒绝的连接数 | >0 |
4.1.3 连接指标
| 指标名称 | 单位 | 描述 | 告警阈值建议 |
|---|---|---|---|
| connected_clients | 个 | 当前连接的客户端数 | >maxclients的80% |
| blocked_clients | 个 | 被阻塞的客户端数 | 监控异常 |
| client_longest_output_list | 个 | 最长的客户端输出列表长度 | 监控异常 |
| client_biggest_input_buf | 字节 | 最大的客户端输入缓冲区大小 | 监控异常 |
4.1.4 持久化指标
| 指标名称 | 单位 | 描述 | 告警阈值建议 |
|---|---|---|---|
| rdb_changes_since_last_save | 个 | 自上次RDB保存以来数据库的更改数 | 监控变化频率 |
| rdb_last_bgsave_status | 状态 | 上次RDB保存状态 | 非ok |
| rdb_last_bgsave_time_sec | 秒 | 上次RDB保存耗时 | >10秒 |
| aof_enabled | 状态 | AOF是否启用 | 根据配置检查 |
| aof_last_rewrite_time_sec | 秒 | 上次AOF重写耗时 | >10秒 |
| aof_last_bgrewrite_status | 状态 | 上次AOF重写状态 | 非ok |
5. MongoDB监控
5.1 关键监控指标
| 指标名称 | 单位 | 描述 | 告警阈值建议 |
|---|---|---|---|
| connections_current | 个 | 当前连接数 | >connections_available的80% |
| connections_available | 个 | 可用连接数 | <20 |
| op_counters_query | 次/秒 | 每秒查询操作数 | 监控趋势 |
| op_counters_insert | 次/秒 | 每秒插入操作数 | 监控趋势 |
| op_counters_update | 次/秒 | 每秒更新操作数 | 监控趋势 |
| op_counters_delete | 次/秒 | 每秒删除操作数 | 监控趋势 |
| network_bytes_in | 字节/秒 | 网络接收字节数 | 监控趋势 |
| network_bytes_out | 字节/秒 | 网络发送字节数 | 监控趋势 |
| mem_resident | 字节 | 物理内存使用量 | 监控趋势 |
| mem_virtual | 字节 | 虚拟内存使用量 | 监控趋势 |
| globalLock_currentQueue_total | 个 | 全局锁当前队列总数 | >10 |
| globalLock_currentQueue_reader | 个 | 全局锁当前读队列数 | 监控趋势 |
| globalLock_currentQueue_writer | 个 | 全局锁当前写队列数 | >5 |
6. 部署与配置
6.1 数据源配置
- 在AIOPS平台界面中,点击"配置中心" > "数据源管理"
- 点击"新增数据源",选择对应的数据库类型
- 填写以下基本信息:
- 名称:数据库实例名称
- 类型:选择数据库类型(MySQL、Redis等)
- 地址:数据库服务器地址
- 端口:数据库服务端口
- 用户名:具有监控权限的数据库用户名
- 密码:对应的数据库密码
- 数据库名:需要监控的数据库名(MySQL)或实例号(Redis等)
- 采集间隔:数据采集间隔,建议10-30秒
- 超时时间:连接超时时间,建议5秒
- 点击"测试连接"验证连接是否成功
- 点击"确定"保存配置
6.2 MySQL采集器配置
对于MySQL数据库,AIOPS平台使用两种方式采集数据:
- MySQL客户端连接:直接连接MySQL实例,通过执行SHOW STATUS、SHOW GLOBAL VARIABLES等命令获取指标
- MySQL Exporter(可选):对于大规模部署,可以部署Prometheus MySQL Exporter,通过HTTP接口采集指标
6.2.1 MySQL用户权限配置
创建具有监控权限的MySQL用户:
CREATE USER 'aiops_monitor'@'%' IDENTIFIED BY 'secure_password';
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'aiops_monitor'@'%';
FLUSH PRIVILEGES;
6.2.2 启用慢查询日志
为了监控慢查询,需要在MySQL配置中启用慢查询日志:
# my.cnf
slow_query_log = 1
slow_query_log_file = /var/lib/mysql/slow-query.log
long_query_time = 1 # 秒
log_queries_not_using_indexes = 1 # 记录未使用索引的查询
6.3 Redis采集器配置
对于Redis,AIOPS平台通过Redis客户端连接获取INFO命令返回的指标数据:
6.3.1 Redis认证配置
如果Redis启用了认证,需要在配置中提供密码
6.3.2 Redis监控优化
为减少监控对Redis性能的影响,可以配置以下参数:
# 避免频繁的INFO命令影响性能
maxmemory-samples 10 # 内存策略采样数
6.4 MongoDB采集器配置
MongoDB监控需要具有读取admin数据库权限的用户:
use admin;
db.createUser({
user: "aiops_monitor",
pwd: "secure_password",
roles: [{ role: "read", db: "admin" }]
});
7. 使用指南
7.1 数据库列表
在AIOPS平台界面中,点击左侧菜单栏的"监控中心" > "数据库监控" > "数据库列表",进入数据库列表页面:
- 数据库实例列表:展示所有已添加的数据库实例的基本信息
- 健康状态:显示数据库实例的当前健康状态
- 关键指标摘要:显示CPU、内存、连接数等关键指标的当前值
- 筛选与搜索:支持按类型、状态等筛选数据库实例
- 操作:支持编辑、删除、查看详情等操作
7.2 数据库详情
点击数据库实例名称,进入数据库详情页面:
- 概览:显示数据库实例的详细信息和核心指标
- 性能监控:展示TPS/QPS、响应时间等性能指标的趋势图
- 资源使用:展示CPU、内存、磁盘等资源使用情况
- 连接监控:展示连接数、线程数等连接相关指标
- 慢查询:展示慢查询列表和详细信息
- 表/键监控:展示表/键的数量、大小等信息
- 告警历史:展示该数据库实例的历史告警信息
7.3 MySQL详情页特有功能
- InnoDB监控:展示InnoDB相关指标
- 复制状态:展示主从复制状态和延迟
- 表空间分析:展示各数据库和表的大小
- SQL性能分析:分析SQL执行情况和性能瓶颈
7.4 Redis详情页特有功能
- 内存分析:展示内存使用详情和键分布
- 命令统计:展示各类命令的执行统计
- 命中率监控:展示缓存命中率趋势
- 持久化状态:展示RDB/AOF持久化状态
8. 告警配置
8.1 MySQL告警规则示例
- name: "MySQL连接数过多"
description: "MySQL当前连接数超过最大连接数的80%"
severity: "high"
condition: "mysql_global_status_threads_connected > mysql_global_variables_max_connections * 0.8"
duration: 300
notifiers: ["email", "sms"]
tags: ["mysql", "connection"]
- name: "MySQL慢查询增多"
description: "MySQL慢查询数量在5分钟内增加超过50个"
severity: "medium"
condition: "changes(mysql_global_status_slow_queries[5m]) > 50"
duration: 300
notifiers: ["email"]
tags: ["mysql", "performance"]
- name: "MySQL主从复制延迟"
description: "MySQL从库延迟超过300秒"
severity: "high"
condition: "mysql_slave_status_seconds_behind_master > 300"
duration: 180
notifiers: ["email", "sms"]
tags: ["mysql", "replication"]
8.2 Redis告警规则示例
- name: "Redis内存使用率过高"
description: "Redis内存使用率超过80%"
severity: "high"
condition: "redis_memory_used_bytes / redis_memory_max_bytes * 100 > 80"
duration: 300
notifiers: ["email", "sms"]
tags: ["redis", "memory"]
- name: "Redis缓存命中率过低"
description: "Redis缓存命中率低于90%"
severity: "medium"
condition: "(redis_keyspace_hits / (redis_keyspace_hits + redis_keyspace_misses)) * 100 < 90"
duration: 300
notifiers: ["email"]
tags: ["redis", "performance"]
- name: "Redis被驱逐键过多"
description: "Redis每分钟被驱逐的键数超过100个"
severity: "high"
condition: "rate(redis_evicted_keys_total[1m]) > 100"
duration: 60
notifiers: ["email", "sms"]
tags: ["redis", "memory"]
8.3 数据库通用告警规则示例
- name: "数据库连接失败"
description: "无法连接到数据库"
severity: "critical"
condition: "database_connection_status == 0"
duration: 60
notifiers: ["email", "sms", "wechat"]
tags: ["database", "connectivity"]
- name: "数据库服务器CPU使用率高"
description: "数据库服务器CPU使用率超过85%"
severity: "high"
condition: "system_cpu_usage > 85"
duration: 300
notifiers: ["email", "sms"]
tags: ["database", "resource"]
- name: "数据库服务器磁盘空间不足"
description: "数据库服务器磁盘使用率超过85%"
severity: "high"
condition: "system_disk_usage > 85"
duration: 300
notifiers: ["email", "sms"]
tags: ["database", "resource"]
9. 性能优化建议
9.1 MySQL性能优化
9.1.1 配置优化
- 调整缓冲池大小:设置InnoDB缓冲池大小为服务器内存的50-70%
innodb_buffer_pool_size = 4G - 优化连接数:根据服务器资源设置合理的最大连接数
max_connections = 500 - 优化查询缓存:对于读多写少的场景,启用查询缓存
query_cache_size = 64M query_cache_type = 1 - 优化日志设置:调整二进制日志、慢查询日志等设置
innodb_flush_log_at_trx_commit = 2 sync_binlog = 100
9.1.2 索引优化
- 为常用查询条件创建索引:在WHERE子句、JOIN条件中使用的列上创建索引
- 避免创建过多索引:每个索引都会增加写操作的开销
- 使用覆盖索引:索引包含查询所需的所有列,避免回表
- 定期维护索引:使用OPTIMIZE TABLE命令优化表和索引
9.1.3 SQL优化
- **避免SELECT ***:只查询需要的列
- 使用LIMIT限制结果集大小:特别是在分页查询中
- 优化JOIN查询:确保JOIN条件上有索引,避免跨大表JOIN
- 避免在WHERE子句中使用函数:这会导致索引失效
- 避免使用ORDER BY RAND():这会导致全表扫描
9.2 Redis性能优化
9.2.1 内存优化
- 设置合理的maxmemory:根据服务器内存设置合适的最大内存
- 选择合适的淘汰策略:根据业务需求选择合适的键淘汰策略
maxmemory-policy allkeys-lru - 使用小键名和小数据类型:减少内存占用
- 使用共享对象池:对于小整数等常用值,启用共享对象池
object-sharing enabled
9.2.2 命令优化
- 使用批量命令:使用MSET、MGET等批量命令减少网络往返
- 使用Pipeline:通过Pipeline批量执行命令
- 避免使用KEYS命令:在生产环境中使用SCAN代替KEYS
- 使用Redis集群:对于大规模部署,使用Redis集群分散负载
9.3 MongoDB性能优化
9.3.1 索引优化
- 为常用查询创建索引:在查询条件和排序字段上创建索引
- 使用复合索引:根据查询模式创建合适的复合索引
- 考虑覆盖索引:索引包含查询所需的所有字段
- 监控索引使用情况:使用explain()分析查询执行计划
9.3.2 数据模型优化
- 适当反范式:根据查询模式适当反范式化数据,减少JOIN操作
- 使用嵌入文档:对于一对一、一对多关系,考虑使用嵌入文档
- 使用引用文档:对于多对多关系,使用引用文档
9.3.3 配置优化
- 调整WiredTiger缓存:设置合适的WiredTiger缓存大小
wiredTiger: engineConfig: cacheSizeGB: 4 - 优化写入操作:根据需求设置合适的写入关注级别
- 使用副本集和分片集群:提高可用性和扩展性
10. 常见问题排查
10.1 MySQL连接数过多
症状:
- 应用程序无法连接到MySQL
- 日志中出现"Too many connections"错误
- 数据库响应缓慢
排查步骤:
- 检查当前连接数:
SHOW STATUS LIKE 'Threads_connected' - 查看最大连接数配置:
SHOW VARIABLES LIKE 'max_connections' - 查看活跃连接详情:
SHOW PROCESSLIST - 识别长时间运行的查询:
SELECT * FROM information_schema.processlist WHERE command != 'Sleep' ORDER BY time DESC - 分析连接来源,检查是否有连接泄漏
解决方案:
- 增加max_connections配置
- 优化应用程序,关闭不必要的连接
- 实施连接池管理
- 终止长时间运行的查询
10.2 Redis内存使用率过高
症状:
- Redis内存使用率持续上升
- 出现键被驱逐的情况
- 性能下降
排查步骤:
- 查看内存使用详情:
INFO memory - 分析键的分布和大小:使用SCAN和MEMORY USAGE命令
- 检查是否有大键:使用redis-cli --bigkeys
- 查看驱逐策略:
CONFIG GET maxmemory-policy - 分析内存碎片率:
INFO memory | grep mem_fragmentation_ratio
解决方案:
- 调整maxmemory配置
- 选择合适的淘汰策略
- 清理过期或不再使用的键
- 优化键的数据结构和大小
- 考虑使用Redis集群进行分片
10.3 慢查询性能问题
症状:
- 应用程序响应缓慢
- 数据库CPU使用率高
- 慢查询日志中记录了大量慢查询
排查步骤:
- 查看慢查询日志
- 分析慢查询的执行计划:
EXPLAIN SELECT ... - 检查相关表的索引:
SHOW INDEX FROM table_name - 监控数据库负载:
SHOW ENGINE INNODB STATUS
解决方案:
- 优化查询语句,避免全表扫描
- 添加合适的索引
- 优化表结构和数据模型
- 考虑使用分区表
- 调整数据库参数
11. 最佳实践
11.1 监控覆盖
- 全面监控:监控数据库的各个层面,从服务器资源到数据库内部指标
- 设置合理阈值:根据业务需求和数据库性能特性设置合理的告警阈值
- 关注趋势:除了当前值,还要关注指标的变化趋势
- 关联分析:将数据库指标与应用性能、服务器资源等指标关联分析
11.2 性能基线建立
- 建立性能基线:记录正常运行时的各项指标,作为性能基准
- 定期评估:定期评估性能基线,根据业务发展调整
- 压力测试:定期进行压力测试,了解系统极限
- 容量规划:基于性能基线和业务增长预测进行容量规划
11.3 定期维护
- 定期备份:确保数据库定期备份,并验证备份可用性
- 定期优化:定期运行OPTIMIZE TABLE、ANALYZE TABLE等维护命令
- 定期审计:定期审计数据库结构、索引使用情况和性能
- 版本更新:及时更新数据库版本,获取性能改进和安全补丁
11.4 安全最佳实践
- 最小权限原则:为监控用户分配最小必要权限
- 加密连接:使用SSL/TLS加密数据库连接
- 定期密码更新:定期更新数据库用户密码
- 审计日志:启用审计日志,记录关键操作
- 防火墙配置:配置防火墙,限制数据库访问
