4. 数据库监控指标:MySQL、PostgreSQL 与 Redis 关键指标
数据库是业务系统的核心状态层,其健康度直接决定应用可用性。Prometheus 生态通过 exporter 采集数据库内部计数器与状态变量,再经由告警规则触发自愈脚本。本章聚焦三类主流数据库——MySQL、PostgreSQL、Redis——必须监控的关键指标,并解释每个指标与自愈动作的对应关系。
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 时,新连接会直接失败。自愈脚本应执行:
- 查询
SHOW PROCESSLIST找出 Sleep 超过 60 秒的连接。 - 执行
KILL CONNECTION id逐批释放。 - 若仍不足,临时执行
SET GLOBAL max_connections = 原值 * 1.5。 - 记录事件到告警历史,通知 DBA 介入。
4.1.2 慢查询与复制延迟联动
慢查询不仅影响本库,还会拖慢从库回放。监控应同时观察:
- 慢查询速率:
rate(mysql_global_status_slow_queries[5m]) - 复制延迟:
mysql_slave_status_seconds_behind_master
如果两者同时升高,大概率是主库大查询导致 binlog 堆积。自愈脚本可临时在从库设置 slave_parallel_workers 加速回放,或直接将从库提升为只读主库。
Slave_IO_Running: No)与 SQL 线程回放慢(Seconds_Behind_Master 持续增长)。前者需要网络修复,后者需要优化查询或增加从库。
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 连接会持有锁并阻塞其他事务。自愈脚本应:
- 查询
pg_stat_activity过滤state = 'idle in transaction'且state_change < now() - interval '5 min'。 - 执行
SELECT pg_terminate_backend(pid)逐批清理。 - 记录被终止的 PID 和查询文本到日志。
4.2.2 复制延迟与 WAL 堆积
PostgreSQL 复制延迟通常由 WAL 发送速率 或 从库回放能力 导致。监控应同时采集:
pg_stat_replication.write_lag/flush_lag/replay_lagpg_stat_archiver归档状态
自愈脚本在延迟超过阈值时,可尝试重启从库的 walreceiver 进程,或临时提升 max_wal_senders。
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。自愈脚本应:
- 检查当前逐出策略:
CONFIG GET maxmemory-policy。 - 如果策略是
noeviction,临时改为allkeys-lru避免写入失败。 - 执行
MEMORY PURGE释放碎片。 - 记录告警并建议调整
maxmemory。
4.3.2 持久化失败与数据安全
RDB 或 AOF 写入失败会导致重启后数据丢失。自愈脚本应:
- 检查
redis_rdb_last_bgsave_status和redis_aof_last_rewrite_status。 - 如果失败,执行
CONFIG SET dir /tmp临时切换持久化目录,再BGSAVE重试。 - 同时检查磁盘 inode 和权限。
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 目录 | 重启归档进程 | 切换持久化目录 |