Skip to content

PostgreSQL 监控指标规范

核心概念

监控指标规范是数据库监控体系的重要组成部分,合理的监控指标设置有助于:

  • 实时了解数据库运行状态
  • 及时发现和诊断性能问题
  • 预测系统容量需求
  • 确保数据库服务的高可用性
  • 为性能优化提供数据支持

监控指标分类

1. 系统层面指标

系统层面指标反映数据库运行的基础设施状态,包括CPU、内存、磁盘、网络等资源使用情况。

指标名称指标描述采集方法告警阈值建议单位
CPU使用率数据库进程CPU使用率topiostat、监控工具≥ 90%%
内存使用率系统内存使用率freevmstat、监控工具≥ 95%%
磁盘使用率数据目录所在磁盘使用率df、监控工具≥ 85%%
磁盘I/O磁盘读写速率和IOPSiostat、监控工具读写延迟 ≥ 100msMB/s、IOPS
网络流量网络进出流量netstatiftop、监控工具根据实际带宽调整MB/s

2. 数据库层面指标

数据库层面指标反映PostgreSQL实例的整体运行状态。

指标名称指标描述采集方法告警阈值建议单位
连接数当前活跃连接数pg_stat_activity≥ 90% of max_connections
事务数每秒事务数(TPS)pg_stat_database根据业务峰值调整TPS
锁等待数当前锁等待数量pg_locks≥ 5
检查点频率每分钟检查点次数pg_stat_bgwriter≥ 10次/分钟
WAL生成速率每秒WAL生成量pg_stat_database根据业务调整MB/s

3. 查询层面指标

查询层面指标反映数据库查询的执行效率。

指标名称指标描述采集方法告警阈值建议单位
慢查询数量每秒慢查询数pg_stat_statements、慢查询日志≥ 5个/秒
全表扫描数每秒全表扫描次数pg_stat_user_tables≥ 10次/秒
索引使用率索引扫描占总扫描的比例pg_stat_user_indexes≤ 80%%
临时文件数每秒创建的临时文件数pg_stat_database≥ 20个/秒
临时文件大小临时文件总大小pg_stat_database≥ 1GBGB

4. 连接层面指标

连接层面指标反映数据库连接的使用情况。

指标名称指标描述采集方法告警阈值建议单位
活跃连接数当前活跃连接数pg_stat_activity≥ 90% of max_connections
空闲连接数当前空闲连接数pg_stat_activity≥ 70% of total_connections
连接拒绝数因连接数上限被拒绝的连接数pg_stat_database≥ 1个/分钟
连接建立速率每秒新建连接数pg_stat_database根据业务调整个/秒

5. 复制层面指标

复制层面指标反映PostgreSQL主从复制的状态。

指标名称指标描述采集方法告警阈值建议单位
复制延迟从库与主库的延迟时间pg_stat_replicationpg_last_wal_receive_lsn≥ 30秒
复制状态复制是否正常运行pg_stat_replicationpg_stat_wal_receiver异常-
WAL接收速率从库WAL接收速率pg_stat_wal_receiver根据主库WAL生成速率调整MB/s
WAL应用速率从库WAL应用速率pg_stat_replication根据主库WAL生成速率调整MB/s

6. 索引层面指标

索引层面指标反映索引的使用效率。

指标名称指标描述采集方法告警阈值建议单位
索引扫描次数索引被扫描的次数pg_stat_user_indexes-
索引命中次数索引被命中的次数pg_stat_user_indexes-
索引使用率索引扫描占总扫描的比例计算得出≤ 80%%
冗余索引数量未被使用的索引数量pg_stat_user_indexes≥ 5

监控指标采集方法

1. 使用PostgreSQL内置视图

PostgreSQL提供了丰富的系统视图用于监控,主要包括:

  • pg_stat_activity:查看当前连接状态
  • pg_stat_database:查看数据库级统计信息
  • pg_stat_bgwriter:查看后台写进程统计信息
  • pg_stat_user_tables:查看用户表统计信息
  • pg_stat_user_indexes:查看用户索引统计信息
  • pg_stat_replication:查看主库复制状态
  • pg_stat_wal_receiver:查看从库WAL接收状态
  • pg_locks:查看锁状态
sql
-- 示例:查看当前连接状态
SELECT 
    state, 
    count(*) AS count
FROM 
    pg_stat_activity 
WHERE 
    backend_type = 'client backend'
GROUP BY 
    state;

-- 示例:查看数据库级统计信息
SELECT 
    datname, 
    xact_commit, 
    xact_rollback, 
    blks_read, 
    blks_hit 
FROM 
    pg_stat_database 
WHERE 
    datname = 'postgres';

2. 使用pg_stat_statements扩展

pg_stat_statements扩展用于统计SQL语句的执行情况,是查询性能监控的重要工具。

启用方法

sql
-- 1. 在postgresql.conf中添加
shared_preload_libraries = 'pg_stat_statements'
pg_stat_statements.track = all

-- 2. 重启PostgreSQL服务

-- 3. 在数据库中创建扩展
CREATE EXTENSION pg_stat_statements;

采集示例

sql
-- 查看执行时间最长的前10条SQL
SELECT 
    query, 
    calls, 
    total_exec_time, 
    mean_exec_time 
FROM 
    pg_stat_statements 
ORDER BY 
    total_exec_time DESC 
LIMIT 10;

3. 使用外部监控工具

除了内置视图,还可以使用外部监控工具采集监控指标,如:

  • Prometheus + Grafana:开源监控解决方案,支持丰富的可视化图表
  • Zabbix:企业级监控系统,支持多种告警方式
  • Nagios:老牌监控系统,支持插件扩展
  • Datadog:云原生监控平台
  • New Relic:APM监控平台

监控指标最佳实践

1. 指标采集频率

根据指标的重要性和变化频率,设置不同的采集频率:

指标类型采集频率建议
系统层面指标10秒-1分钟
数据库层面指标10秒-1分钟
查询层面指标1-5分钟
连接层面指标10秒-1分钟
复制层面指标5-30秒
索引层面指标5-15分钟

2. 指标存储与保留

  • 短期指标(最近7天):高分辨率存储(10秒-1分钟)
  • 中期指标(最近30天):中分辨率存储(5-15分钟)
  • 长期指标(超过30天):低分辨率存储(30分钟-1小时)

3. 告警设置原则

  • 分级告警:根据问题严重程度设置不同的告警等级(P0-P3)
  • 避免误告警:设置合理的持续时间阈值,避免瞬时峰值触发告警
  • 告警聚合:对同一类型的告警进行聚合,避免告警风暴
  • 告警通知:配置多种通知方式(邮件、短信、钉钉、企业微信等)

4. 监控仪表盘设计

监控仪表盘应包含以下内容:

  • 概览面板:显示关键指标的实时状态
  • 系统资源面板:显示CPU、内存、磁盘、网络等资源使用情况
  • 数据库状态面板:显示连接数、事务数、锁等数据库级指标
  • 查询性能面板:显示慢查询、全表扫描等查询级指标
  • 复制状态面板:显示主从复制状态和延迟
  • 历史趋势面板:显示关键指标的历史趋势

监控指标分析与诊断

1. 常见性能问题诊断

问题现象可能原因关联指标诊断方法
连接数过高应用连接泄露、连接池配置不合理连接数、空闲连接数分析pg_stat_activity,检查连接来源
查询缓慢缺少索引、SQL编写不当、统计信息过期慢查询数、全表扫描数、索引使用率分析pg_stat_statements,检查执行计划
锁等待严重长事务、锁竞争激烈锁等待数、阻塞进程分析pg_locks,查看锁等待链
复制延迟高网络延迟、从库性能不足、WAL生成过快复制延迟、WAL生成速率、WAL应用速率分析pg_stat_replication,检查从库资源使用
磁盘IO高大量数据读写、缺少索引、检查点频繁磁盘I/O、检查点频率、全表扫描数分析iostat,检查pg_stat_bgwriter

2. 监控数据可视化示例

Grafana仪表盘设计建议

  1. 主页面:显示关键指标概览,包括CPU、内存、连接数、TPS等
  2. 系统资源页面:详细显示系统资源使用情况
  3. 数据库性能页面:显示数据库级和查询级指标
  4. 复制状态页面:显示主从复制详细状态
  5. 告警历史页面:显示历史告警记录和处理情况

常见问题(FAQ)

Q1:如何选择合适的监控指标?

A1:选择监控指标的原则:

  1. 覆盖系统层面和数据库层面
  2. 关注与业务相关的关键指标
  3. 结合RTO和RPO要求
  4. 考虑监控成本和资源消耗
  5. 定期 review 和调整监控指标

Q2:如何避免监控指标过多导致的信息过载?

A2:避免信息过载的方法:

  1. 建立分级监控体系,重点关注关键指标
  2. 使用仪表盘聚合相关指标
  3. 设置合理的告警阈值,避免过多告警
  4. 定期清理不相关或无用的指标
  5. 使用自动化工具分析监控数据

Q3:如何确保监控系统本身的可靠性?

A3:确保监控系统可靠性的方法:

  1. 监控系统与被监控系统分离部署
  2. 监控系统本身高可用设计
  3. 定期测试监控系统的告警功能
  4. 备份监控数据
  5. 监控监控系统本身的运行状态

Q4:如何使用监控指标进行容量规划?

A4:使用监控指标进行容量规划的方法:

  1. 收集长期的监控数据趋势
  2. 分析业务增长对资源的需求
  3. 建立资源使用模型
  4. 预测未来资源需求
  5. 制定扩容计划

Q5:如何处理监控数据的存储问题?

A5:处理监控数据存储的方法:

  1. 使用时序数据库存储监控数据(如InfluxDB、Prometheus)
  2. 制定合理的数据保留策略
  3. 对历史数据进行降采样处理
  4. 考虑使用云存储服务存储长期历史数据
  5. 定期清理过期数据

监控指标规范实施建议

  1. 建立监控体系:设计完整的监控指标体系,覆盖系统、数据库、查询、复制等层面
  2. 选择合适的监控工具:根据实际需求选择合适的监控工具
  3. 配置告警规则:根据业务需求设置合理的告警阈值和通知方式
  4. 设计可视化仪表盘:设计直观、易用的监控仪表盘
  5. 定期 review 监控指标:每季度 review 一次监控指标,根据业务变化进行调整
  6. 培训运维团队:确保运维团队熟悉监控指标的含义和分析方法
  7. 建立故障响应流程:建立基于监控告警的故障响应流程

通过遵循上述监控指标规范,可以建立一个全面、有效的PostgreSQL监控体系,确保数据库服务的高可用性和高性能运行。