Prometheus 监控 PostgreSQL 深度实战:从查询延迟到锁竞争的全维可观测性落地

Prometheus 监控 PostgreSQL 深度实战:从查询延迟到锁竞争的全维可观测性落地
Prometheus 监控 PostgreSQL 深度实战从查询延迟到锁竞争的全维可观测性落地PostgreSQL 是关系型数据库领域的核心支柱其连接数、查询性能、复制延迟、锁等待、缓冲区命中率、磁盘使用等指标直接决定了业务系统的可靠性和响应速度。Prometheus 通过postgres_exporter将 PostgreSQL 丰富的统计视图转化为标准指标配合 Grafana 和告警规则构建起一条从 SQL 执行到资源消耗的完整观测链。本文将带你从部署到调优一步到位掌握 PostgreSQL 的健康监控。1. 部署 postgres_exporterpostgres_exporter是社区官方推荐的导出器通过连接 PostgreSQL 并执行大量监控查询来自pg_stat_*视图来生成指标。1.1 创建监控用户并授权为导出器创建一个只读监控用户并授予必要权限CREATEUSERmonitorWITHPASSWORDStrongPassword;ALTERUSERmonitorSETSEARCH_PATHTOmonitor,pg_catalog;-- 授予访问统计视图的权限PostgreSQL 10 使用 pg_monitor 角色GRANTpg_monitorTOmonitor;-- 若需要 pg_stat_statements 扩展用于查询性能CREATEEXTENSIONIFNOTEXISTSpg_stat_statements;GRANTSELECTONpg_stat_statementsTOmonitor;1.2 二进制部署wgethttps://github.com/prometheus-community/postgres_exporter/releases/download/v0.15.0/postgres_exporter-0.15.0.linux-amd64.tar.gztarxzf postgres_exporter-0.15.0.linux-amd64.tar.gzcdpostgres_exporter-0.15.0.linux-amd64通过环境变量传递数据库连接信息推荐使用DATA_SOURCE_NAMEexportDATA_SOURCE_NAMEpostgresql://monitor:StrongPasswordlocalhost:5432/postgres?sslmodedisable./postgres_exporter --web.listen-address:9187Docker 部署dockerrun-d\--namepostgres_exporter\--networkhost\-eDATA_SOURCE_NAMEpostgresql://monitor:StrongPasswordlocalhost:5432/postgres?sslmodedisable\prometheuscommunity/postgres-exporter:v0.15.0默认监听 9187 端口访问http://localhost:9187/metrics验证。1.3 多目标支持一个导出器监控多个实例可以通过 HTTP 参数target动态指定数据库 DSN实现一个导出器抓取多个 PostgreSQL 实例。启动时设置--multi-target-enabled并使用 Prometheus 的params模式类似 mysqld_exporter。但更简单的做法是每实例一个导出器。2. 配置 Prometheus 抓取scrape_configs:-job_name:postgresqlscrape_interval:30sstatic_configs:-targets:-10.0.0.20:9187labels:instance:pg-primaryenv:production3. 核心监控指标与 PromQLPostgreSQL 指标非常丰富以下按维度分类分类关键指标含义PromQL 示例实例存活pg_up1 可连接直接判断连接数pg_stat_database_numbackends(按数据库)当前连接数sum(pg_stat_database_numbackends) by (datname)连接使用率需结合pg_settings_max_connectionspg_stat_database_numbackends / on(instance) pg_settings_max_connections事务速率pg_stat_database_xact_commit_totalpg_stat_database_xact_rollback_total提交/回滚次数rate(pg_stat_database_xact_commit_total[1m])缓冲区命中率pg_stat_database_blks_hitpg_stat_database_blks_read从缓存命中 vs 磁盘读取pg_stat_database_blks_hit / (pg_stat_database_blks_hit pg_stat_database_blks_read)死锁pg_stat_database_deadlocks死锁次数累计rate(pg_stat_database_deadlocks[5m]) 0锁等待pg_locks_count(exporter 可以生成)当前锁数量可直接告警pg_locks_waiting 0复制延迟 (主库)pg_stat_replication_flush_lag或pg_stat_replication_replay_lag从库落后时间秒pg_stat_replication_flush_lag 5复制状态 (从库)pg_stat_wal_receiver_status(连接状态)0 表示异常检查pg_stat_wal_receiver_status 1查询性能 (pg_stat_statements)pg_stat_statements_calls_totalpg_stat_statements_seconds_total每条语句的调用次数和总耗时计算平均延迟rate(pg_stat_statements_seconds_total[5m]) / rate(pg_stat_statements_calls_total[5m])磁盘/表大小pg_stat_user_tables_size_bytes(exporter 自动暴露)表的大小监控增长趋势WAL 生成速率pg_stat_bgwriter_buffers_clean等后台写入器统计间接评估写入压力注意指标前缀取决于postgres_exporter版本和配置通常为pg_stat_database_*、pg_stat_bgwriter_*、pg_stat_replication_*等。使用pg_stat_statements需要先通过--collector.stat_statements开启部分版本默认启用。4. Grafana 仪表盘推荐全功能 PostgreSQL 概览Dashboard ID9628PostgreSQL Database包含连接、事务、缓冲、锁、复制、表大小、查询性能等非常全面。PostgreSQL 查询分析ID14654PostgreSQL Query Performance若开启了pg_stat_statements可深入监控 SQL 延迟。PostgreSQL Overview (Prometheus)ID14114UI 更现代。导入后选择数据源并将instance变量绑定到你的数据库实例。5. 告警规则实战groups:-name:postgresql_alertsrules:-alert:PostgreSQLDownexpr:pg_up 0for:1mlabels:severity:criticalannotations:summary:PostgreSQL 实例 {{ $labels.instance }} 不可达-alert:PostgreSQLTooManyConnectionsexpr:sum(pg_stat_database_numbackends) by (instance) / on(instance) pg_settings_max_connections0.85for:5mlabels:severity:warningannotations:summary:PostgreSQL 连接数使用率超过 85%-alert:PostgreSQLHighRollbackRateexpr:rate(pg_stat_database_xact_rollback_total[5m]) / (rate(pg_stat_database_xact_commit_total[5m]) rate(pg_stat_database_xact_rollback_total[5m]))0.05for:5mlabels:severity:warningannotations:summary:PostgreSQL 事务回滚率超过 5%-alert:PostgreSQLDeadlocksexpr:rate(pg_stat_database_deadlocks[5m])0for:1mlabels:severity:criticalannotations:summary:PostgreSQL 出现死锁-alert:PostgreSQLReplicationLagexpr:pg_stat_replication_flush_lag10for:2mlabels:severity:criticalannotations:summary:PostgreSQL 复制延迟超过 10 秒-alert:PostgreSQLBufferHitRateLowexpr:pg_stat_database_blks_hit / (pg_stat_database_blks_hit pg_stat_database_blks_read) 0.95for:10mlabels:severity:warningannotations:summary:缓冲区命中率低于 95%可能 shared_buffers 不足-alert:PostgreSQLSlowQueryexpr:rate(pg_stat_statements_seconds_total[5m]) / rate(pg_stat_statements_calls_total[5m])1for:5mlabels:severity:warningannotations:summary:查询平均延迟超过 1 秒 (instance {{ $labels.instance }})6. 进阶慢查询监控与自定义查询6.1 启用 pg_stat_statements在postgresql.conf中设置shared_preload_libraries pg_stat_statements pg_stat_statements.track all重启 PostgreSQL 后postgres_exporter默认会抓取该扩展的指标可通过--no-collector.stat_statements关闭。6.2 自定义监控查询postgres_exporter支持通过--extend.query-path参数指定一个 YAML 文件添加自定义查询例如监控业务表行数、特定条件数据等。示例queries.ymlmy_custom_metrics:query:SELECT count(*) AS total_orders FROM orders WHERE status pendingmetrics:-total_orders:usage:GAUGEdescription:Pending orders count启动 exporter 时加载./postgres_exporter --extend.query-pathqueries.yml这些自定义指标会以my_custom_metrics_total_orders的形式暴露。7. 多实例与 RDS/云数据库监控Amazon RDS / Cloud SQL通常不能安装 exporter可以采用Prometheus RDS Exporter(如rds_exporter) 或者通过 CloudWatch 指标桥接。也可以在外部部署postgres_exporter远程连接 RDS 实例权限按照云厂商要求设置注意安全组。Azure Database for PostgreSQL同样支持postgres_exporter远程连接。多实例使用一个postgres_exporter的 multi-target 模式Prometheus 配置使用params和 relabeling 动态传递目标适合集中监控大量远程数据库。8. 性能与安全最小化抓取开销postgres_exporter每次抓取会执行一系列查询其中包括对pg_stat_statements的聚合查询可能会消耗数据库资源。建议scrape_interval设为 30s 或 60s并在高负载时评估影响。权限最小化使用pg_monitor角色并仅授予必要权限切勿使用超级用户。TLS 连接在DATA_SOURCE_NAME中使用sslmoderequire并配置 CA 证书。防火墙仅允许 Prometheus 服务器 IP 访问 9187 端口。通过这套监控方案你的 PostgreSQL 不再是一个“黑盒”。从连接饱和、查询变慢、复制延迟到死锁爆发所有健康状态都实时转化为可查询的时序指标结合 Grafana 可视化与 Alertmanager 告警真正做到“数据驱动运维”。