炎龙智能炎龙智能
AIOPS智能运维平台
AIOPS智能运维平台
  • 数据库监控

数据库监控

数据库监控模块提供对各类数据库服务的全面监控能力,支持MySQL、Redis、MongoDB等多种数据库类型,帮助用户实时掌握数据库的运行状态、性能指标和异常情况,保障数据服务的稳定运行。

1. 功能概述

数据库监控模块提供以下核心功能:

  • 多类型数据库支持:支持MySQL、Redis、MongoDB、PostgreSQL等主流数据库
  • 实时性能监控:实时监控数据库的关键性能指标,如查询响应时间、连接数、缓存命中率等
  • 资源使用监控:监控数据库服务器的CPU、内存、磁盘I/O等资源使用情况
  • SQL性能分析:分析慢查询、高频查询等SQL执行情况,识别性能瓶颈
  • 数据库结构监控:监控数据库表、索引、连接池等结构信息的变化
  • 异常告警:针对数据库异常状态、性能阈值等设置告警规则
  • 历史数据趋势分析:提供长期性能趋势分析,支持容量规划
  • 数据库健康评分:综合多维度指标评估数据库健康状况

2. 支持的数据库类型

数据库类型版本支持监控重点告警关键指标
MySQL5.6+连接数、缓存命中率、慢查询、InnoDB指标连接数、锁等待、复制延迟、TPS/QPS
Redis3.2+内存使用、命令执行率、命中率、客户端连接数内存使用率、命中率、过期键数
MongoDB3.4+操作延迟、连接数、队列长度、写入锁慢查询、连接数、队列长度
PostgreSQL9.6+事务数、锁等待、缓存命中率、索引使用情况连接数、锁等待、缓存命中率
Oracle11g+SGA/PGA使用率、会话数、锁等待、SQL性能缓存命中率、连接数、锁等待
SQL Server2012+缓冲池、锁等待、死锁、阻塞缓存命中率、锁等待、死锁数

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 数据源配置

  1. 在AIOPS平台界面中,点击"配置中心" > "数据源管理"
  2. 点击"新增数据源",选择对应的数据库类型
  3. 填写以下基本信息:
    • 名称:数据库实例名称
    • 类型:选择数据库类型(MySQL、Redis等)
    • 地址:数据库服务器地址
    • 端口:数据库服务端口
    • 用户名:具有监控权限的数据库用户名
    • 密码:对应的数据库密码
    • 数据库名:需要监控的数据库名(MySQL)或实例号(Redis等)
    • 采集间隔:数据采集间隔,建议10-30秒
    • 超时时间:连接超时时间,建议5秒
  4. 点击"测试连接"验证连接是否成功
  5. 点击"确定"保存配置

6.2 MySQL采集器配置

对于MySQL数据库,AIOPS平台使用两种方式采集数据:

  1. MySQL客户端连接:直接连接MySQL实例,通过执行SHOW STATUS、SHOW GLOBAL VARIABLES等命令获取指标
  2. 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"错误
  • 数据库响应缓慢

排查步骤:

  1. 检查当前连接数:SHOW STATUS LIKE 'Threads_connected'
  2. 查看最大连接数配置:SHOW VARIABLES LIKE 'max_connections'
  3. 查看活跃连接详情:SHOW PROCESSLIST
  4. 识别长时间运行的查询:SELECT * FROM information_schema.processlist WHERE command != 'Sleep' ORDER BY time DESC
  5. 分析连接来源,检查是否有连接泄漏

解决方案:

  • 增加max_connections配置
  • 优化应用程序,关闭不必要的连接
  • 实施连接池管理
  • 终止长时间运行的查询

10.2 Redis内存使用率过高

症状:

  • Redis内存使用率持续上升
  • 出现键被驱逐的情况
  • 性能下降

排查步骤:

  1. 查看内存使用详情:INFO memory
  2. 分析键的分布和大小:使用SCAN和MEMORY USAGE命令
  3. 检查是否有大键:使用redis-cli --bigkeys
  4. 查看驱逐策略:CONFIG GET maxmemory-policy
  5. 分析内存碎片率:INFO memory | grep mem_fragmentation_ratio

解决方案:

  • 调整maxmemory配置
  • 选择合适的淘汰策略
  • 清理过期或不再使用的键
  • 优化键的数据结构和大小
  • 考虑使用Redis集群进行分片

10.3 慢查询性能问题

症状:

  • 应用程序响应缓慢
  • 数据库CPU使用率高
  • 慢查询日志中记录了大量慢查询

排查步骤:

  1. 查看慢查询日志
  2. 分析慢查询的执行计划:EXPLAIN SELECT ...
  3. 检查相关表的索引:SHOW INDEX FROM table_name
  4. 监控数据库负载:SHOW ENGINE INNODB STATUS

解决方案:

  • 优化查询语句,避免全表扫描
  • 添加合适的索引
  • 优化表结构和数据模型
  • 考虑使用分区表
  • 调整数据库参数

11. 最佳实践

11.1 监控覆盖

  • 全面监控:监控数据库的各个层面,从服务器资源到数据库内部指标
  • 设置合理阈值:根据业务需求和数据库性能特性设置合理的告警阈值
  • 关注趋势:除了当前值,还要关注指标的变化趋势
  • 关联分析:将数据库指标与应用性能、服务器资源等指标关联分析

11.2 性能基线建立

  • 建立性能基线:记录正常运行时的各项指标,作为性能基准
  • 定期评估:定期评估性能基线,根据业务发展调整
  • 压力测试:定期进行压力测试,了解系统极限
  • 容量规划:基于性能基线和业务增长预测进行容量规划

11.3 定期维护

  • 定期备份:确保数据库定期备份,并验证备份可用性
  • 定期优化:定期运行OPTIMIZE TABLE、ANALYZE TABLE等维护命令
  • 定期审计:定期审计数据库结构、索引使用情况和性能
  • 版本更新:及时更新数据库版本,获取性能改进和安全补丁

11.4 安全最佳实践

  • 最小权限原则:为监控用户分配最小必要权限
  • 加密连接:使用SSL/TLS加密数据库连接
  • 定期密码更新:定期更新数据库用户密码
  • 审计日志:启用审计日志,记录关键操作
  • 防火墙配置:配置防火墙,限制数据库访问
Last Updated:: 11/28/25, 3:06 PM
Contributors: sunxiaokun