外观
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_mem | 0-配置值 | 接近配置值时告警 | 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/Ovmstat:监控虚拟内存和CPUtop/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 | 完整的监控解决方案,支持告警 | 企业级监控 |
| Datadog | SaaS平台,易于部署 | 云环境或混合环境 |
| Nagios | 传统监控工具,插件丰富 | 现有Nagios环境 |
| PostgreSQL Enterprise Manager | 专用于PostgreSQL,功能全面 | 大规模PostgreSQL环境 |
告警规则设计
告警级别设计:
- 严重(Critical):需要立即处理,可能导致服务中断
- 警告(Warning):需要关注,可能影响性能
- 信息(Info):仅供参考,不影响服务
告警通知方式:
- 电子邮件
- 短信
- 即时通讯工具(Slack、企业微信等)
- 电话(严重告警)
告警抑制规则:
- 避免重复告警
- 根因告警优先
- 维护时段自动静音
监控最佳实践
指标采集频率
- 核心指标(如连接数、实例状态):1分钟采集一次
- 资源指标(如CPU、内存):1分钟采集一次
- 存储指标(如磁盘使用率):1小时采集一次
- 趋势指标(如数据库大小):1天采集一次
数据保留策略
- 短期数据(1-7天):详细数据,高采样频率
- 中期数据(8-30天):聚合数据,中等采样频率
- 长期数据(30天以上):高度聚合,低采样频率
监控系统本身的监控
- 监控监控系统的可用性
- 监控指标采集成功率
- 监控告警发送成功率
定期审查监控指标
- 每季度审查监控指标,移除无效指标
- 根据业务变化添加新指标
- 调整告警阈值以减少误报
总结
PostgreSQL监控是一个系统工程,需要综合考虑实例健康、连接、事务、存储、复制、安全等多个方面。通过建立完善的监控体系,可以及时发现和解决问题,确保PostgreSQL数据库的稳定运行和良好性能。
监控指标的选择应根据业务需求和系统规模进行调整,避免监控过多无效指标导致信息过载。同时,定期的监控数据分析和告警规则优化也是确保监控系统有效性的重要环节。
