Skip to content

PostgreSQL 核心监控指标清单

PostgreSQL监控是确保数据库稳定运行和良好性能的重要手段。本文将详细介绍PostgreSQL的核心监控指标,包括服务状态、连接状态、事务指标、内存指标、存储I/O指标、复制指标等,帮助DBA建立完善的监控体系。

服务状态指标

指标名称说明取值范围告警阈值监控频率数据来源
服务状态PostgreSQL服务是否运行0=停止, 1=运行!=1 触发告警1分钟进程状态或systemd服务状态
连接可达性能否成功连接到数据库0=不可达, 1=可达!=1 触发告警1分钟pg_isready命令
数据库启动时间实例已运行时长时间值无(用于参考)5分钟pg_stat_database.startup_time

连接与会话指标

关键连接状态

指标名称说明取值范围告警阈值监控频率数据来源
当前连接数当前活跃连接数量0-配置值> max_connections×0.8 告警1分钟pg_stat_database.numbackends
最大连接数配置的最大连接数正整数无(用于参考)30分钟SHOW max_connections
连接使用率当前连接数占最大连接数的百分比0-100%> 80% 告警1分钟计算值
连接拒绝数因连接数达到上限而拒绝的连接数累计值每分钟>0 告警1分钟pg_stat_database.xact_commit
空闲连接数空闲连接数量0-当前连接数> 当前连接数×0.7 告警5分钟pg_stat_activity
空闲事务连接数处于空闲事务状态的连接数0-当前连接数> 5 或 > 当前连接数×0.1 告警5分钟pg_stat_activity

会话状态分布

指标名称说明取值范围告警阈值监控频率数据来源
事务提交率每秒提交的事务数0-∞无(用于趋势分析)1分钟pg_stat_database.xact_commit
事务回滚率每秒回滚的事务数0-∞> 提交率×0.1 告警1分钟pg_stat_database.xact_rollback
事务回滚比例回滚事务占总事务的百分比0-100%> 10% 告警1分钟计算值
长事务数量运行时间超过阈值的事务数0-当前连接数> 0 告警5分钟pg_stat_activity
长事务持续时间最长事务的运行时间时间值> 30分钟 告警5分钟pg_stat_activity

事务与SQL执行指标

SQL执行统计

指标名称说明取值范围告警阈值监控频率数据来源
平均查询响应时间所有查询的平均响应时间时间值> 1秒 告警1分钟pg_stat_statements
慢查询平均耗时慢查询的平均执行时间时间值> 10秒 告警5分钟慢查询日志
锁等待时间锁等待的总时间时间值> 60秒 告警5分钟pg_locks+pg_stat_activity
死锁发生次数每秒死锁数量0-∞> 0 告警1分钟pg_stat_database.deadlocks

内存指标

指标名称说明取值范围告警阈值监控频率数据来源
shared_buffers使用率共享缓冲区使用率0-100%> 90% 告警5分钟计算值或监控工具
work_mem使用情况单个查询使用的work_mem0-配置值接近配置值时告警5分钟pg_stat_statements
维护工作内存使用维护操作使用的内存0-配置值接近配置值时告警5分钟日志或监控工具
系统内存使用率服务器总内存使用率0-100%> 90% 告警1分钟系统监控
交换空间使用率交换分区使用率0-100%> 20% 告警5分钟系统监控

存储与I/O指标

磁盘使用率

指标名称说明取值范围告警阈值监控频率数据来源
磁盘读写IOPS每秒I/O操作次数0-存储最大值接近存储上限时告警1分钟iostat或监控工具
磁盘吞吐量每秒磁盘读写数据量0-存储最大值接近存储上限时告警1分钟iostat或监控工具
磁盘延迟平均I/O操作延迟时间值> 100ms 告警1分钟iostat或监控工具
WAL写入速率每秒写入的WAL数据量0-∞无(用于趋势分析)1分钟pg_stat_bgwriter.wal_write_time
检查点写入时间检查点写入操作耗时时间值> 配置的checkpoint_timeout 告警5分钟pg_stat_bgwriter.checkpoint_write_time
缓冲区命中率共享缓冲区命中率0-100%< 95% 告警5分钟计算值
缓冲区脏页比例脏页占共享缓冲区的比例0-100%> 70% 告警5分钟pg_stat_bgwriter.buffers_backend_fsync

复制与高可用指标

主从复制状态

指标名称说明取值范围告警阈值监控频率数据来源
复制延迟主从节点之间的延迟时间时间值> 30秒 告警1分钟pg_stat_replication.replay_lag
复制槽状态复制槽是否正常0=异常, 1=正常!=1 告警5分钟pg_replication_slots
WAL发送速率主节点发送WAL的速率数据量/秒无(用于趋势分析)1分钟pg_stat_replication
集群节点数集群中正常节点数量正整数< 配置的最小节点数 告警1分钟高可用软件API
主节点状态主节点是否正常0=否, 1=是!=1 告警1分钟高可用软件API
故障切换次数最近7天的故障切换次数0-∞> 0 告警1天高可用软件日志

索引与查询性能指标

索引使用情况

指标名称说明取值范围告警阈值监控频率数据来源
索引使用率索引被使用的频率0-100%< 50% 告警1天pg_stat_user_indexes
索引大小索引占用的存储空间数据量无(用于参考)1天pg_stat_user_indexes
全表扫描次数全表扫描的频率次数/秒> 5 告警1分钟pg_stat_user_tables

Autovacuum与维护指标

Autovacuum 统计

指标名称说明取值范围告警阈值监控频率数据来源
Autovacuum运行次数Autovacuum运行的频率次数/小时无(用于参考)1小时pg_stat_user_tables
Autovacuum耗时Autovacuum执行的时间时间值> 30分钟 告警1小时pg_stat_user_tables
表膨胀率表的膨胀程度0-∞> 2 告警1周第三方工具(如pgstattuple)
索引膨胀率索引的膨胀程度0-∞> 2 告警1周第三方工具(如pgstattuple)

安全与审计指标

指标名称说明取值范围告警阈值监控频率数据来源
失败登录次数每秒失败的登录尝试次数0-∞> 5 告警1分钟日志文件
异常连接尝试来自未知IP的连接尝试0-∞> 0 告警1分钟日志文件
权限变更次数权限相关操作的次数0-∞> 0 告警(需确认)1小时日志文件
敏感表访问次数敏感表被访问的次数0-∞无(用于审计)1小时审计日志

扩展与插件指标

指标名称说明取值范围告警阈值监控频率数据来源
扩展启用状态关键扩展是否启用0=否, 1=是!=1 告警1天pg_extension
pg_stat_statements命中率扩展的命中率0-100%< 90% 告警1天pg_stat_statements
pg_stat_monitor状态监控扩展是否正常0=否, 1=是!=1 告警1天pg_stat_monitor

监控指标的获取方法

使用内置视图

常用的内置监控视图

  • pg_stat_database:数据库级统计信息
  • pg_stat_bgwriter:后台写入器统计信息
  • pg_stat_activity:当前会话信息
  • pg_stat_user_tables:用户表统计信息
  • pg_stat_user_indexes:用户索引统计信息
  • pg_stat_replication:复制统计信息
  • pg_replication_slots:复制槽信息

示例查询

sql
-- 获取当前连接数
SELECT COUNT(*) FROM pg_stat_activity WHERE state <> 'idle';

-- 获取缓冲区命中率
SELECT 
  100 - ((sum(heap_blks_read) * 100) / nullif(sum(heap_blks_hit + heap_blks_read), 0)) AS buffer_hit_ratio
FROM pg_stat_user_tables;

-- 获取复制延迟
SELECT 
  client_addr,
  state,
  write_lag,
  flush_lag,
  replay_lag
FROM pg_stat_replication;

使用命令行工具

常用的命令行工具

  • pg_isready:检查实例是否可达
  • pg_controldata:查看控制文件信息
  • psql -c "查询":执行SQL查询
  • iostat:监控磁盘I/O
  • vmstat:监控虚拟内存和CPU
  • top/htop:监控进程和CPU

示例命令

bash
# 检查实例是否可达
pg_isready -h localhost -p 5432

# 获取当前连接数
psql -h localhost -U postgres -c "SELECT COUNT(*) FROM pg_stat_activity;"

# 监控磁盘I/O
iostat -x 1

使用监控扩展

推荐的监控扩展

  • pg_stat_statements:收集SQL执行统计信息
  • pg_stat_monitor:高级监控和查询分析
  • pg_stat_kcache:监控内核级缓存使用
  • pg_stat_plans:跟踪执行计划
  • pg_profile:查询性能分析

安装示例

sql
-- 安装pg_stat_statements扩展
CREATE EXTENSION pg_stat_statements;

-- 安装pg_stat_monitor扩展
CREATE EXTENSION pg_stat_monitor;

监控指标的可视化与告警

推荐的监控平台

监控平台特点适用场景
Prometheus + Grafana开源、强大的指标收集和可视化大多数场景
Zabbix完整的监控解决方案,支持告警企业级监控
DatadogSaaS平台,易于部署云环境或混合环境
Nagios传统监控工具,插件丰富现有Nagios环境
PostgreSQL Enterprise Manager专用于PostgreSQL,功能全面大规模PostgreSQL环境

告警规则设计

告警级别设计

  • 严重(Critical):需要立即处理,可能导致服务中断
  • 警告(Warning):需要关注,可能影响性能
  • 信息(Info):仅供参考,不影响服务

告警通知方式

  • 电子邮件
  • 短信
  • 即时通讯工具(Slack、企业微信等)
  • 电话(严重告警)

告警抑制规则

  • 避免重复告警
  • 根因告警优先
  • 维护时段自动静音

监控最佳实践

指标采集频率

  • 核心指标(如连接数、实例状态):1分钟采集一次
  • 资源指标(如CPU、内存):1分钟采集一次
  • 存储指标(如磁盘使用率):1小时采集一次
  • 趋势指标(如数据库大小):1天采集一次

数据保留策略

  • 短期数据(1-7天):详细数据,高采样频率
  • 中期数据(8-30天):聚合数据,中等采样频率
  • 长期数据(30天以上):高度聚合,低采样频率

监控系统本身的监控

  • 监控监控系统的可用性
  • 监控指标采集成功率
  • 监控告警发送成功率

定期审查监控指标

  • 每季度审查监控指标,移除无效指标
  • 根据业务变化添加新指标
  • 调整告警阈值以减少误报

总结

PostgreSQL监控是一个系统工程,需要综合考虑实例健康、连接、事务、存储、复制、安全等多个方面。通过建立完善的监控体系,可以及时发现和解决问题,确保PostgreSQL数据库的稳定运行和良好性能。

监控指标的选择应根据业务需求和系统规模进行调整,避免监控过多无效指标导致信息过载。同时,定期的监控数据分析和告警规则优化也是确保监控系统有效性的重要环节。