数据库慢?连接失败?用Postgres Exporter实现PostgreSQL可观测性

前言

在现代应用架构中,PostgreSQL作为一款功能强大、稳定可靠的开源关系型数据库,被广泛应用于金融、电商、SaaS平台等关键业务场景。然而,随着数据量增长、并发请求激增或查询复杂度上升,数据库性能问题往往成为系统瓶颈的“隐形杀手”——页面加载缓慢、事务超时、连接池耗尽,甚至突发性服务中断,常常让开发者和运维人员措手不及。

更令人头疼的是,这些问题在发生时往往缺乏直观的上下文:

  • 是某个慢查询拖垮了整个实例?
  • 还是连接数达到上限导致新请求被拒绝?
  • 又或是锁等待、I/O廋竭、缓存命中率骤降?

传统的日志排查或手动执行pg_stat查询,不仅效率低下,更难以实现趋势分析与预警。我们真正需要的,是一套持续、自动、可视化的PostgreSQL可观测性能力。

此时,Postgres Exporter应运而生。

作为Prometheus官方社区维护的核心Exporter之一,Postgres Exporter能够主动采集PostgreSQL的数百项关键指标——从连接状态、查询性能、锁信息到 WAL 写入、复制延迟等——并将它们以标准时序数据格式暴露给Prometheus。结合Grafana,你可以在几分钟内构建出实时、可交互的监控看板;配合Alertmanager,更能实现“慢查询突增”“活跃连接逼近阈值”等场景的自动告警。

本文将带你从零开始,完成Postgres Exporter的安全部署、权限配置、指标解读与可视化集成,真正实现 “看得见、查得快、防得住” 的PostgreSQL运维闭环。无论你是DevOps工程师、DBA,还是全栈开发者,都能从中获得一套轻量、可靠、云原生友好的数据库监控方案。

让我们一起,把PostgreSQL的“黑盒”变成“透明引擎”。

downloaded-image (3)

1.什么是Postgres Exporter?

Postgres Exporter是PostgreSQL 与 Prometheus之间的“桥梁”——它把数据库内部的运行状态(如连接数、查询性能、锁等待等)转化为Prometheus能理解的时序数据。

它能做什么?

1.自动采集数百项PostgreSQL指标,例如:

  • 当前活跃/空闲连接数(pg_stat_database.numbackends)
  • 查询执行次数、失败次数(pg_stat_database.xact_commit, xact_rollback)
  • 块读取与缓存命中率(blks_read, blks_hit → 可计算缓存命中率)
  • 表/索引膨胀、死元组数量(用于判断是否需要 VACUUM)
  • 复制延迟(pg_stat_replication)
  • WAL写入量、检查点统计
  • 锁等待情况(pg_locks)

2.支持自定义查询

  • 通过配置文件(queries.yaml),你可以定义自己的 SQL 查询,将业务相关的数据库状态(如“待处理订单数”)也作为指标导出。

3.兼容多版本PostgreSQL

  • 支持PostgreSQL 9.4及以上版本(包括最新版)。

4.安全可控

  • 只需为Exporter创建一个只读监控用户(推荐使用 pg_monitor 角色),无需超级用户权限。

工作原理

  • Postgres Exporter作为一个独立进程运行(可部署在DB服务器、应用服务器或容器中)。
  • 它定期连接PostgreSQL,执行内置或自定义的SQL查询。
  • 将结果转换为Prometheus 指标格式(如gauge, counter)。
  • 在HTTP端口(默认 :9187)提供 /metrics接口。
  • Prometheus主动拉取(Pull)该接口,存储指标并用于告警或可视化。

downloaded-image (2)

典型应用场景

  • 监控数据库性能瓶颈(慢查询、高 I/O、低缓存命中)
  • 预防连接池耗尽
  • 跟踪复制延迟(主从同步健康度)
  • 自动化告警:如“死元组超过100万”、“事务回滚率突增”
  • 构建Grafana看板,实现数据库健康状态一目了然

为什么选择 Postgres Exporter?

优势 说明
💡 轻量无侵入 不修改数据库配置(除网络和用户权限外)
☁️ 云原生友好 支持容器化、Kubernetes、ServiceMonitor
👥 社区活跃 CNCF 生态项目,持续维护更新
🔧 灵活扩展 支持自定义指标,满足业务监控需求

2.Centos7安装Postgres_Exporter实时监控Postgres数据

本地下载后上传到linux服务器:

下载地址:https://github.com/prometheus-community/postgres_exporter/releases/tag/v0.19.1

c241899ddaabe76c7648b13aae93e9f2

或者直接在linux服务器上wget方式下载:

# 新建目录
mkdir -p /app/postgres_exporter1
# 进入目标目录
cd /app/postgres_exporter1
# 下载
wget https://github.com/prometheus-community/postgres_exporter/releases/download/v0.13.2/postgres_exporter-0.13.2.linux-amd64.tar.gz
# 解压
tar -vxzf postgres_exporter-0.13.2.linux-amd64.tar.gz
# 移动到安装目录
mv /app/postgres_exporter1/postgres_exporter-0.13.2.linux-amd64 /app/postgres_exporter
# 进入目录
cd /app/postgres_exporter

7835013be7c6079917ab70f5a3391048

3.设置Postgres监控专属用户

以postgres用户进入PostgreSQL命令行:

su - postgres
psql

创建专用监控用户(角色)– 创建用户(带登录权限),密码为 ‘your_secure_password’

CREATE USER postgres_exporter WITH PASSWORD 'your_secure_password' LOGIN;

授予必要权限:

postgres_exporter 需要读取系统视图(如 pg_stat_database、pg_stat_user_tables 等),但不能拥有超级用户权限。

方法 A:推荐方式(最小权限)

允许访问 pg_stat_* 统计信息(需显式授权)

GRANT pg_monitor TO postgres_exporter;

方法 B:旧版本兼容(PostgreSQL < 10)– 手动授权关键视图

GRANT CONNECT ON DATABASE postgres TO postgres_exporter;

如果需要监控其他数据库(如your_app_db),也需授权

GRANT CONNECT ON DATABASE your_app_db TO postgres_exporter;

授予对 pg_stat_database 等系统视图的 SELECT 权限

注意:部分视图需在每个数据库中单独授权

c your_app_db

GRANT SELECT ON pg_stat_database TO postgres_exporter;

验证用户能否连接,退出 psql:# 测试本地连接

psql -h localhost -U postgres_exporter -d postgres

06dafd45dfd6141fc477887a20157569

4.将postgres_exporter配置为系统服务

cd /usr/lib/systemd/system
vim postgres_exporter.service
[Unit]
Description= https://github.com/prometheus-community/postgres_exporter
After=network-online.target

[Service]
Type=simple
User=root
Group=root
Environment=DATA_SOURCE_NAME=postgresql://postgres_exporter:postgres_exporter@x.x.x.x:5432/postgres?sslmode=disable
ExecStart=/usr/local/postgres_exporter/postgres_exporter
ExecReload=/bin/kill -HUP
KillMode=process
TimeoutStopSec=20s
Restart=always
[Install]
WantedBy=default.target

img

服务命令:

# 生效系统systemd文件
systemctl daemon-reload
# 设置开机自启
systemctl enable postgres_exporter
# 查看状态
systemctl status postgres_exporter
# 启动
systemctl start postgres_exporter.service
# 停止
systemctl stop postgres_exporter.service

c1e8ecfd702e02f04b12992964c1efba

也可以手动启动:

# 后台启动
nohup ./postgres_exporter >> /app/postgres_exporter/postgres_exporter.out 2>&1 &

接下来我们通过使用浏览器,用IP+9187就可以访问我们安装好的postgres_exporter页面啦!

a64b18a8643b33a03357d005ad214065

5.配置prometheus监控postgres_exporter

没有prometheus的小伙伴可以参考这篇文章:监控不再局域网!Cpolar 让 Prometheus 走出内网限制! – cpolar 极点云官网

找到prometheus的配置文件,编辑添加如下内容:

vi prometheus.yml
      - targets: ["localhost:9187"]
        labels:
          app: "postgres_exporter"

image-20260416162754681

重启prometheus服务:

systemctl restart prometheus

使用浏览器Ip+9090打开promethues的页面:

image-20260416163025314

我们可以看到成功的检测到了postgres_exporter服务啦!

image-20260416163001528

为了实现Prometheus对位于公网或不同局域网中的PostgreSQL数据库的监控,可在目标机器上部署postgres_exporter以暴露数据库指标,并通过内网穿透工具cpolar将其本地监听端口(如9187)安全地映射到公网。Prometheus服务器即可通过cpolar提供的公网地址拉取远端数据库的监控数据,从而在不依赖复杂网络配置或暴露数据库本身的前提下,完成跨网络的监控集成。

6.安装cpolar内网穿透工具

cpolar 可以将你本地电脑中的服务(如 SSH、Web、数据库)映射到公网。即使你在家里或外出时,也可以通过公网地址连接回本地运行的开发环境。

❤️以下是安装cpolar步骤:

官网在此:https://www.cpolar.com

使用一键脚本安装命令:

sudo curl https://get.cpolar.sh | sh

image-20250814101639846

安装完成后,执行下方命令查看cpolar服务状态:(如图所示即为正常启动)

sudo systemctl status cpolar

22e5adfaf290a17fc3384bb296055259

Cpolar安装和成功启动服务后,在浏览器上输入虚拟机主机IP加9200端口即:【ip:9200】访问Cpolar管理界面,使用Cpolar官网注册的账号登录,登录后即可看到cpolar web 配置界面,接下来在web 界面配置即可:

打开浏览器访问本地9200端口,使用cpolar账户密码登录即可,登录后即可对隧道进行管理。

8a6698b1bf26d64ba3645827fbfb1c29

7.配置公网地址

登录cpolar web UI管理界面后,点击左侧仪表盘的隧道管理——创建隧道:

  • 隧道名称:可自定义,本例使用了:postgres_exporter,注意不要与已有的隧道名称重复

  • 协议:http

  • 本地地址:9187

  • 域名类型:随机域名

  • 地区:选择China Top

image-20260416163853733

创建成功后,打开左侧在线隧道列表,可以看到刚刚通过创建隧道生成了公网地址,接下来就可以在其他电脑或者移动端设备(异地)上,使用地址访问。

image-20260416163944620

访问成功。

image-20260416164001363

8.将本postgres_exporter暴露给Prometheus进行远程抓取

Prometheus可以通过这个公网地址51bd1f65.r2.cpolar.top访问到运行在本地9187端口的postgres_exporter服务,从而抓取系统指标。

      - targets: ["51bd1f65.r2.cpolar.top"]
        labels:
          app: "postgres_exporter"

image-20260416164214793

抓取成功!

image-20260416164506345

9.保留固定公网地址

使用cpolar为其配置二级子域名,该地址为固定地址,不会随机变化。

image-20251125141035399

点击左侧的预留,选择保留二级子域名,地区选择china Top,然后设置一个二级子域名名称,我这里演示使用的是postgres,大家可以自定义。填写备注信息,点击保留。

image-20260416164904243

登录cpolar web UI管理界面,点击左侧仪表盘的隧道管理——隧道列表,找到所要配置的隧道postgres,点击右侧的编辑

image-20260416164938948

修改隧道信息,将保留成功的二级子域名配置到隧道中

  • 域名类型:选择二级子域名
  • Sub Domain:填写保留成功的二级子域名
  • 地区: China Top

点击更新

image-20260416165019852

更新完成后,打开在线隧道列表,此时可以看到随机的公网地址已经发生变化,地址名称也变成了保留和固定的二级子域名名称。

image-20260416165044608

最后,我们使用固定的公网地址在任意设备的浏览器中访问,可以看到成功访问本地部署的页面,这样一个永久不会变化的二级子域名公网网址即设置好了。

image-20260416165105403

结尾

数据库慢?连接失败?别再靠猜排查问题!借助Postgres Exporter,轻松将PostgreSQL的关键指标(如查询性能、连接数、锁等待、缓存命中率等)暴露给Prometheus。无论实例部署在本地、云上,还是跨网络环境,结合cpolar等内网穿透工具,也能实现稳定高效的远程可观测性。让每一次慢查询、每一次连接异常都无所遁形,真正实现“看得见、查得快、防得住”的数据库运维体验。

感谢您对本篇文章的喜爱,有任何问题欢迎留言交流。cpolar官网-安全的内网穿透工具 | 无需公网ip | 远程访问 | 搭建网站

Share:

发表回复

目录

On Key

推荐文章