A-speed

每个人都是🏆
  新随笔  :: 管理

Prometheus 监控 PostgreSQL 维护文档

Posted on 2026-10-10 10:24  a-speed  阅读(5)  评论(0)    收藏  举报

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. 已知问题与待办

  1. Prometheus 未设置开机自启(disabled),系统重启后不会自动运行,导致监控中断。建议 systemctl enable prometheus。

  2. Grafana 非 systemd 托管,手动启动,重启后丢失。建议迁移为 systemd 服务。

  3. 多份配置中连接串 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。

  1. 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) 的实际检查整理。