当前位置: 代码网 > it编程>数据库>MsSqlserver > PostgreSQL监控怎么搭建?用PostgresExporter轻松实现

PostgreSQL监控怎么搭建?用PostgresExporter轻松实现

2026年07月25日 MsSqlserver 我要评论
前言postgresql出问题时,最让人难受的不是报错本身,而是不知道问题到底从哪里开始。页面突然变慢,接口偶尔超时,连接池被打满,业务端只看到请求失败,数据库里却可能已经出现了锁等待、缓存命中下降、

前言

postgresql出问题时,最让人难受的不是报错本身,而是不知道问题到底从哪里开始。页面突然变慢,接口偶尔超时,连接池被打满,业务端只看到请求失败,数据库里却可能已经出现了锁等待、缓存命中下降、事务回滚增加或连接数逼近上限。

如果只靠临时登录服务器查日志、手动执行pg_stat相关sql,很难形成连续判断。一次排查能看到当前状态,却看不到趋势;能知道现在慢,却不一定知道十分钟前发生了什么。数据库运维真正需要的,是持续采集、可视化查看和提前告警。

postgres exporter就是把postgresql运行状态接入prometheus的一层桥梁。它会把数据库内部的连接、事务、缓存、表状态、锁信息、复制延迟、wal等指标转换成prometheus能识别的格式,并通过默认9187端口暴露出来。

本文会从centos 7环境开始,演示postgres exporter下载、解压、监控专用用户创建、pg_monitor权限配置、systemd服务编写、服务启动验证,以及浏览器访问exporter指标页面。随后再把它加入prometheus配置,让数据库指标真正进入监控体系。

最后,还会补充跨网络监控场景。对于部署在家庭网络、公司内网或其他无法被prometheus直接访问的postgresql环境,可以通过 cpolar 将postgres exporter的9187端口映射到公网,让prometheus在不直接暴露数据库端口的前提下,远程抓取数据库运行指标。

前言

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)该接口,存储指标并用于告警或可视化。

1.什么是postgres exporter?

典型应用场景

  • 监控数据库性能瓶颈(慢查询、高 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

2.centos7安装postgres_exporter实时监控postgres数据

或者直接在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

2.centos7安装postgres_exporter实时监控postgres数据_图2

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

3.设置postgres监控专属用户

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

4.将postgres_exporter配置为系统服务

服务命令:

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

4.将postgres_exporter配置为系统服务_图2

也可以手动启动:

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

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

4.将postgres_exporter配置为系统服务_图3

5.配置prometheus监控postgres_exporter

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

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

5.配置prometheus监控postgres_exporter

重启prometheus服务:

systemctl restart prometheus

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

5.配置prometheus监控postgres_exporter_图2

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

5.配置prometheus监控postgres_exporter_图3

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

6.安装cpolar内网穿透工具

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

❤️以下是安装cpolar步骤:

使用一键脚本安装命令:

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

6.安装cpolar内网穿透工具

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

sudo systemctl status cpolar

6.安装cpolar内网穿透工具_图2

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

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

6.安装cpolar内网穿透工具_图3

7.配置公网地址

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

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

  • 协议:http

  • 本地地址:9187

  • 域名类型:随机域名

  • 地区:选择china top

7.配置公网地址

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

7.配置公网地址_图2

访问成功。

7.配置公网地址_图3

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

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

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

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

抓取成功!

8.将本postgres_exporter暴露给prometheus进行远程抓取_图2

9.保留固定公网地址

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

9.保留固定公网地址

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

9.保留固定公网地址_图2

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

9.保留固定公网地址_图3

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

  • 域名类型:选择二级子域名
  • sub domain:填写保留成功的二级子域名
  • 地区: china top

点击更新

9.保留固定公网地址_图4

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

9.保留固定公网地址_图5

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

9.保留固定公网地址_图6

结尾

完成部署后,postgres exporter就可以持续暴露postgresql的关键运行指标。连接数、事务提交与回滚、缓存命中、锁等待、复制状态等信息,不再只能临时登录数据库查看,而是可以进入prometheus统一采集。

这套方案的价值,在于把数据库从“出了问题再查”变成“平时就能看见趋势”。当连接数持续升高、缓存命中率下降、死元组不断积累或复制延迟扩大时,运维人员可以更早发现异常,而不是等业务端已经明显变慢才开始排查。

配置 cpolar 后,位于不同网络环境中的postgres exporter也可以被prometheus远程抓取。随机域名适合临时验证,固定二级子域名更适合长期监控,避免采集地址频繁变化导致prometheus配置失效。

需要注意的是,监控指标虽然不是数据库业务数据本身,但仍然会暴露实例状态、连接情况和运行负载。公网访问时不建议直接暴露数据库端口,exporter也应使用只读监控账号,并尽量控制访问范围。

postgres exporter负责把数据库状态变成指标,prometheus负责持续抓取和存储,cpolar负责补上跨网络访问通道。当这几部分组合起来以后,postgresql的运行状态就不再是黑盒,而是一套可以观察、分析和提前预警的数据库监控体系。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com