Prometheus 监控 PostgreSQL 维护文档
适用环境:node2 (192.168.56.132)・RHEL 8.6 (Ootpa)
整理日期:2026-10-10
1. 监控架构总览
PostgreSQL (5432) ──► postgres_exporter (9187) ──► Prometheus (9090) ──► Grafana (3000)
数据库源 采集/缓存(无状态) 存储TSDB(15天) 可视化展示
数据流:Prometheus 按 scrape_interval 周期抓取 exporter 暴露的 /metrics,exporter 每次响应时连库执行采集 SQL,将指标(内置 Collector + 自定义查询)以 Prometheus 文本格式返回,Prometheus 写入本地 TSDB。
关键机制
:postgres_exporter 本身有约 30 秒的后台采集循环,把指标缓存于内存。Prometheus 停止时 exporter 仍持续采集 PG,但数据不落盘;真正持久化依赖 Prometheus 运行并抓取。
2. 环境清单
| 项 | 值 |
|---|---|
| 主机名 / IP | node2 / 192.168.56.132 |
| 操作系统 | RHEL 8.6 |
| PostgreSQL | 18.3(监听 5432,含 pg_stat_statements 1.12 扩展) |
| postgres_exporter | v0.15.0(监听 9187) |
| Prometheus | v3.11.2(监听 9090) |
| Grafana | 6.0.1(监听 3000,手动启动,非托管) |
端口监听
| 端口 | 服务 |
|---|---|
| 22 | sshd |
| 5432 | PostgreSQL |
| 9187 | postgres_exporter |
| 9090 | Prometheus |
| 3000 | Grafana |
3. 组件配置
3.1 postgres_exporter
systemd 单元:/etc/systemd/system/postgres-exporter.service
[Unit]
Description=PostgreSQL Exporter
After=network.target
[Service]
Type=simple
User=postgres
Environment="DATA_SOURCE_NAME=postgresql://postgres:Lihj2026@192.168.56.132:5432/postgres?sslmode=disable"
ExecStart=/usr/local/bin/postgres_exporter --no-collector.stat_bgwriter --web.listen-address=:9187 --log.level=error --extend.query-path=/opt/postgres_exporter/pg_stat_statements.yaml
[Install]
WantedBy=multi-user.target
-
连接串:通过环境变量
DATA_SOURCE_NAME传入,sslmode=disable。 -
采集行为:通过启动参数控制(
--no-collector.*禁用采集器、--extend.query-path指定自定义查询文件)。 -
自定义查询文件:
/opt/postgres_exporter/pg_stat_statements.yaml(见第 4 节)。
3.2 Prometheus
systemd 单元:/etc/systemd/system/prometheus.service
ExecStart=/usr/local/bin/prometheus \
--config.file=/etc/prometheus/prometheus.yml \
--storage.tsdb.path=/var/lib/prometheus \
--web.console.templates=/etc/prometheus/consoles \
--web.console.libraries=/etc/prometheus/console_libraries \
--web.listen-address=0.0.0.0:9090 \
--web.external-url=
采集配置:/etc/prometheus/prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'postgresql'
scrape_interval: 5s
static_configs:
- targets: ['192.168.56.132:9187']
labels:
instance: 'prod-postgres-01'
env: 'production'
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]
labels:
app: "prometheus"
-
TSDB 数据目录:
/var/lib/prometheus(当前 21M,6 个 block) -
保留期:未显式配置,默认 15 天(见第 6 节维护要点)。
3.3 Grafana
-
版本 6.0.1,进程手动启动于
/root/grafana-6.0.1(bin/grafana-server)。 -
⚠️ 非 systemd 托管,重启系统后需手动拉起。
-
默认端口 3000,admin 密码已非默认(admin/admin 登录已被拒)。
4. 自定义监控(pg_stat_statements)
文件:/opt/postgres_exporter/pg_stat_statements.yaml
pg_stat_statements_calls:
query: "SELECT datname, sum(calls) as calls FROM pg_stat_statements JOIN pg_database ON pg_stat_statements.dbid = pg_database.oid GROUP BY datname"
metrics:
- datname:
usage: "LABEL"
description: "Database name"
- calls:
usage: "COUNTER"
description: "Number of times executed"
pg_stat_statements_total_exec_time:
query: "SELECT datname, sum(total_exec_time) as total_ms FROM pg_stat_statements JOIN pg_database ON pg_stat_statements.dbid = pg_database.oid GROUP BY datname"
metrics:
- datname:
usage: "LABEL"
description: "Database name"
- total_ms:
usage: "COUNTER"
description: "Total execution time in ms"
pg_stat_statements_total_rows:
query: "SELECT datname, sum(rows) as total_rows FROM pg_stat_statements JOIN pg_database ON pg_stat_statements.dbid = pg_database.oid GROUP BY datname"
metrics:
- datname:
usage: "LABEL"
description: "Database name"
- total_rows:
usage: "COUNTER"
description: "Total rows affected"
pg_stat_statements_wal_bytes:
query: "SELECT datname, sum(wal_bytes) as wal_bytes FROM pg_stat_statements JOIN pg_database ON pg_stat_statements.dbid = pg_database.oid GROUP BY datname"
metrics:
- datname:
usage: "LABEL"
description: "Database name"
- wal_bytes:
usage: "COUNTER"
description: "Total WAL bytes generated"
已生效指标(验证)
| 指标 | 含义 | postgres 库实测值 |
|---|---|---|
pg_stat_statements_calls_calls |
累计执行次数 | 90,108 次 |
pg_stat_statements_total_exec_time_total_ms |
累计执行耗时 | 69,357.7 ms |
pg_stat_statements_total_rows_total_rows |
累计影响行数 | 582.8 万行 |
pg_stat_statements_wal_bytes_wal_bytes |
累计 WAL | 551 MB |
指标命名规则:
<查询名>_<列名>。新增查询时名称须全局唯一,否则后加载覆盖前加载。
添加自定义监控的方法
在 yaml 中平级追加一个查询对象(每个查询一个顶层 key),保存后:
systemctl restart postgres-exporter
curl -s http://127.0.0.1:9187/metrics | grep <新指标名>
5. 服务管理命令
# 状态查看
systemctl status postgres-exporter
systemctl status prometheus
# 启停
systemctl start|stop|restart postgres-exporter
systemctl start|stop|restart prometheus
# 开机自启
systemctl enable postgres-exporter
systemctl enable prometheus
# 配置变更后重载
systemctl daemon-reload
systemctl restart <服务名>
# 查看日志
journalctl -u postgres-exporter -n 50
journalctl -u prometheus -n 50
6. 维护要点
6.1 健康检查
# exporter 是否正常
curl -s http://127.0.0.1:9187/metrics | grep -E '^pg_up'
# 期望 pg_up 1
# Prometheus 采集目标状态
curl 'http://127.0.0.1:9090/api/v1/targets' | python3 -m json.tool
# 期望 health = up
# 查询指标是否入库
curl 'http://127.0.0.1:9090/api/v1/query?query=pg_up'
6.2 TSDB 维护
| 操作 | 命令 / 说明 |
|---|---|
| 查看占用 | du -sh /var/lib/prometheus |
| 查看块 | promtool tsdb list /var/lib/prometheus |
| 保留期 | 默认 15 天,改:prometheus.service 加 --storage.tsdb.retention.time=30d |
| 磁盘不足 | 调短保留期并重启;勿删 wal/ 与 chunks_head/ |
6.3 磁盘监控
监控 /var/lib/prometheus 目录空间。数据量 ≈ 指标数 × 抓取频率 × 样本大小 × 保留天数。指标越多、抓取越勤、保留越久,占用越大。
7. 故障排查
| 现象 | 排查方向 |
|---|---|
pg_up=0 |
exporter 连不上 PG;检查 DATA_SOURCE_NAME、PG 端口、认证 |
exporter 报 permission denied |
自定义 yaml 路径对 postgres 用户不可读;移到 /opt/ 并 chown postgres |
报 yaml: unmarshal ... into UserQuery |
yaml 顶层错误地包了 custom_queries: 列表;应每个查询一个顶层 key |
| Prometheus 停止后数据不更新 | exporter 正常但数据未落盘;启动 Prometheus 恢复持久化 |
| 自定义指标不出现 | 确认 --extend.query-path 路径正确、yaml 格式正确、查询名唯一 |
| Grafana 无数据 | 确认数据源已连 Prometheus (9090)、Prometheus 在运行 |
8. 已知问题与待办
-
Prometheus 未设置开机自启(
disabled),系统重启后不会自动运行,导致监控中断。建议systemctl enable prometheus。 -
Grafana 非 systemd 托管,手动启动,重启后丢失。建议迁移为 systemd 服务。
-
多份配置中连接串 IP 不一致:
-
service:
192.168.56.132 -
/etc/systemd/system/postgres_exporter.yml:127.0.0.1 -
/opt/postgres_exporter/pg_exporter.yml:192.168.56.32(少一位,笔误,未使用) -
实际生效为 service 中的
192.168.56.132。
- Grafana 数据源未确认:provisioning 的 datasource 仍为注释示例,需确认其已连接 Prometheus。
9. 常用快速参考
-
exporter 指标端点:
http://192.168.56.132:9187/metrics -
Prometheus UI:
http://192.168.56.132:9090 -
Prometheus TSDB 状态:
http://192.168.56.132:9090/status/tsdb -
Grafana:
http://192.168.56.132:3000
本文档基于 2026-10-10 对 node2 (192.168.56.132) 的实际检查整理。
浙公网安备 33010602011771号