4. 数据库监控指标:MySQL、PostgreSQL 与 Redis 关键指标

数据库是业务系统的核心状态层,其健康度直接决定应用可用性。Prometheus 生态通过 exporter 采集数据库内部计数器与状态变量,再经由告警规则触发自愈脚本。本章聚焦三类主流数据库——MySQL、PostgreSQL、Redis——必须监控的关键指标,并解释每个指标与自愈动作的对应关系。

监控指标设计原则: 每个指标都应回答“当前值是否正常?如果异常,自动恢复脚本应执行什么操作?”避免采集无用指标增加 Prometheus 存储压力。

4.1 MySQL 关键指标

MySQL 使用 mysqld_exporter 暴露指标,默认端口 9104。以下指标是自愈场景的必选项:

指标名称(PromQL 常用) 含义 告警阈值示例 自愈动作
mysql_global_status_threads_connected 当前已连接线程数 > max_connections * 0.85 Kill 空闲连接 / 临时提升 max_connections
rate(mysql_global_status_slow_queries[5m]) 慢查询速率(每秒次数) > 5 记录 TOP SQL → 发送到分析平台 / 重启从库
mysql_slave_status_seconds_behind_master 复制延迟(秒) > 30 检查 IO/SQL 线程 → 重启复制 / 提升从库
mysql_global_status_threads_running 当前正在执行的线程数 > CPU 核数 * 4 限流 / 临时 Kill 长事务
mysql_global_status_aborted_connects 累计失败连接数 rate > 10/min 检查认证配置 / 防火墙规则

4.1.1 连接数风暴与自愈

当 threads_connected 接近 max_connections 时,新连接会直接失败。自愈脚本应执行:

  1. 查询 SHOW PROCESSLIST 找出 Sleep 超过 60 秒的连接。
  2. 执行 KILL CONNECTION id 逐批释放。
  3. 若仍不足,临时执行 SET GLOBAL max_connections = 原值 * 1.5。
  4. 记录事件到告警历史,通知 DBA 介入。

4.1.2 慢查询与复制延迟联动

慢查询不仅影响本库,还会拖慢从库回放。监控应同时观察:

  • 慢查询速率:rate(mysql_global_status_slow_queries[5m])
  • 复制延迟:mysql_slave_status_seconds_behind_master

如果两者同时升高,大概率是主库大查询导致 binlog 堆积。自愈脚本可临时在从库设置 slave_parallel_workers 加速回放,或直接将从库提升为只读主库。

注意: 复制延迟告警必须区分 IO 线程中断(Slave_IO_Running: No)与 SQL 线程回放慢(Seconds_Behind_Master 持续增长)。前者需要网络修复,后者需要优化查询或增加从库。
MySQL 关键指标与自愈联动流程 MySQL 关键指标与自愈联动流程 连接数 threads_connected 慢查询 slow_queries rate 复制延迟 seconds_behind_master Prometheus 告警规则评估 自愈脚本执行动作 Kill 空闲连接 / 临时提升 max_connections 记录 TOP SQL / 重启复制 / 提升从库 指标恢复 → 告警消除

4.2 PostgreSQL 关键指标

PostgreSQL 使用 postgres_exporter(默认端口 9187)或 pg_stat_statements 扩展采集。自愈场景重点关注:

指标名称(PromQL 常用) 含义 告警阈值示例 自愈动作
pg_stat_database_numbackends 当前活跃后端连接数 > max_connections * 0.8 终止 idle in transaction 连接
rate(pg_stat_database_xact_commit[5m]) + rate(pg_stat_database_xact_rollback[5m]) 事务吞吐量(TPS) 突降 > 50% 持续 2 分钟 检查连接池 / 重启应用层
pg_replication_lag 复制延迟(字节或时间) > 100 MB 或 > 30 秒 检查 WAL 发送进程 / 重启从库
pg_stat_activity_max_query_duration_seconds 最长运行查询时长 > 300 秒 pg_terminate_backend 终止长查询
pg_stat_database_blks_hit / (pg_stat_database_blks_hit + pg_stat_database_blks_read) 缓存命中率 < 0.95 增加 shared_buffers / 检查索引

4.2.1 连接管理与长事务终止

PostgreSQL 的 idle in transaction 连接会持有锁并阻塞其他事务。自愈脚本应:

  1. 查询 pg_stat_activity 过滤 state = 'idle in transaction' 且 state_change < now() - interval '5 min'。
  2. 执行 SELECT pg_terminate_backend(pid) 逐批清理。
  3. 记录被终止的 PID 和查询文本到日志。

4.2.2 复制延迟与 WAL 堆积

PostgreSQL 复制延迟通常由 WAL 发送速率 或 从库回放能力 导致。监控应同时采集:

  • pg_stat_replication.write_lag / flush_lag / replay_lag
  • pg_stat_archiver 归档状态

自愈脚本在延迟超过阈值时,可尝试重启从库的 walreceiver 进程,或临时提升 max_wal_senders。

PostgreSQL 特有陷阱: 不要直接 Kill 所有长查询。如果长查询是 pg_dump 或 VACUUM,终止可能导致数据不一致。自愈脚本应通过 application_name 或 query 前缀做白名单过滤。

4.3 Redis 关键指标

Redis 使用 redis_exporter(默认端口 9121)采集。自愈场景关注内存、连接与持久化:

指标名称(PromQL 常用) 含义 告警阈值示例 自愈动作
redis_memory_used_bytes / redis_memory_max_bytes 内存使用率 > 0.85 触发 eviction / 临时扩容 maxmemory
redis_connected_clients 当前客户端连接数 > maxclients * 0.9 Kill 空闲客户端 / 增加 maxclients
redis_rdb_last_bgsave_status 最后一次 RDB 保存是否成功 0(失败) 检查磁盘空间 / 重启 Redis
redis_keyspace_hits / (redis_keyspace_hits + redis_keyspace_misses) 缓存命中率 < 0.8 检查过期策略 / 增加缓存容量
redis_replication_lag 主从复制延迟(字节) > 1048576(1 MB) 检查网络 / 重启从库复制

4.3.1 内存过载与逐出策略

当 used_memory 接近 maxmemory 时,Redis 根据 maxmemory-policy 逐出 key。自愈脚本应:

  1. 检查当前逐出策略:CONFIG GET maxmemory-policy。
  2. 如果策略是 noeviction,临时改为 allkeys-lru 避免写入失败。
  3. 执行 MEMORY PURGE 释放碎片。
  4. 记录告警并建议调整 maxmemory。

4.3.2 持久化失败与数据安全

RDB 或 AOF 写入失败会导致重启后数据丢失。自愈脚本应:

  • 检查 redis_rdb_last_bgsave_status 和 redis_aof_last_rewrite_status。
  • 如果失败,执行 CONFIG SET dir /tmp 临时切换持久化目录,再 BGSAVE 重试。
  • 同时检查磁盘 inode 和权限。
Redis 内存与持久化自愈决策树 Redis 内存与持久化自愈决策树 Redis 告警触发 内存使用率 > 85% 临时切换逐出策略 MEMORY PURGE + 告警 RDB/AOF 写入失败 切换持久化目录 重试 BGSAVE / BGREWRITEAOF

4.4 三库指标对比与自愈策略总结

维度 MySQL PostgreSQL Redis
连接数指标 threads_connected numbackends connected_clients
连接自愈 Kill Sleep 连接 终止 idle in transaction Kill 空闲客户端
复制延迟指标 seconds_behind_master replay_lag replication_lag
复制自愈 重启 IO/SQL 线程 重启 walreceiver 重启从库复制
性能瓶颈指标 慢查询速率 长查询时长 缓存命中率
性能自愈 记录 TOP SQL 终止长查询 调整逐出策略
持久化指标 Binlog 状态 WAL 归档状态 RDB/AOF 状态
持久化自愈 切换 binlog 目录 重启归档进程 切换持久化目录
自愈脚本编写建议: 每个数据库的自愈函数应接收 指标名称、当前值、阈值 三个参数,返回布尔值表示“是否已恢复”。这样 Prometheus 告警回调可以统一调用,无需为每个指标写独立逻辑。