Postgres Exporter部署实践:让Prometheus监控PostgreSQL运行状态
前言PostgreSQL服务正常运行并不代表数据库状态一直健康。连接数接近上限、事务回滚增加、锁等待持续累积、缓存命中率下降或主从复制延迟都可能在业务明显变慢之前出现仅靠日志和临时执行pg_stat查询很难持续掌握变化趋势。Postgres Exporter可以使用专用监控账号读取PostgreSQL统计视图将连接、事务、缓存、锁、WAL和复制状态等数据转换为Prometheus能够采集的指标。Prometheus定时抓取后可以保存历史趋势、执行PromQL查询并结合Grafana和Alertmanager完成可视化与异常告警。这套方案适合单机数据库、主从复制环境和多实例集中监控。Exporter与Prometheus位于不同网络时可以通过cpolar映射9187指标端口让远端监控服务器继续抓取数据而不必直接开放PostgreSQL的5432端口。实际部署时应使用pg_monitor等最小权限角色并限制指标接口的访问范围。本文将带你从零开始完成Postgres Exporter的安全部署、权限配置、指标解读与可视化集成真正实现 “看得见、查得快、防得住” 的PostgreSQL运维闭环。无论你是DevOps工程师、DBA还是全栈开发者都能从中获得一套轻量、可靠、云原生友好的数据库监控方案。让我们一起把PostgreSQL的“黑盒”变成“透明引擎”。1.什么是Postgres ExporterPostgres Exporter是PostgreSQL 与 Prometheus之间的“桥梁”——它把数据库内部的运行状态如连接数、查询性能、锁等待等转化为Prometheus能理解的时序数据。它能做什么1.自动采集数百项PostgreSQL指标例如当前活跃/空闲连接数pg_stat_database.numbackends查询执行次数、失败次数pg_stat_database.xact_commit, xact_rollback块读取与缓存命中率blks_read, blks_hit → 可计算缓存命中率表/索引膨胀、死元组数量用于判断是否需要 VACUUM复制延迟pg_stat_replicationWAL写入量、检查点统计锁等待情况pg_locks2.支持自定义查询通过配置文件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该接口存储指标并用于告警或可视化。典型应用场景监控数据库性能瓶颈慢查询、高 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或者直接在linux服务器上wget方式下载# 新建目录mkdir-p/app/postgres_exporter1# 进入目标目录cd/app/postgres_exporter1# 下载wgethttps://github.com/prometheus-community/postgres_exporter/releases/download/v0.13.2/postgres_exporter-0.13.2.linux-amd64.tar.gz# 解压tar-vxzfpostgres_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_exporter3.设置Postgres监控专属用户以postgres用户进入PostgreSQL命令行su- postgres psql创建专用监控用户角色-- 创建用户带登录权限密码为 ‘your_secure_password’CREATEUSERpostgres_exporter WITH PASSWORDyour_secure_passwordLOGIN;授予必要权限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-hlocalhost-Upostgres_exporter-dpostgres4.将postgres_exporter配置为系统服务cd/usr/lib/systemd/systemvimpostgres_exporter.service[Unit]Descriptionhttps://github.com/prometheus-community/postgres_exporterAfternetwork-online.target[Service]TypesimpleUserrootGrouprootEnvironmentDATA_SOURCE_NAMEpostgresql://postgres_exporter:postgres_exporterx.x.x.x:5432/postgres?sslmodedisableExecStart/usr/local/postgres_exporter/postgres_exporterExecReload/bin/kill-HUPKillModeprocessTimeoutStopSec20sRestartalways[Install]WantedBydefault.target服务命令# 生效系统systemd文件systemctl daemon-reload# 设置开机自启systemctlenablepostgres_exporter# 查看状态systemctl status postgres_exporter# 启动systemctl start postgres_exporter.service# 停止systemctl stop postgres_exporter.service也可以手动启动# 后台启动nohup./postgres_exporter/app/postgres_exporter/postgres_exporter.out21接下来我们通过使用浏览器用IP9187就可以访问我们安装好的postgres_exporter页面啦5.配置prometheus监控postgres_exporter找到prometheus的配置文件编辑添加如下内容viprometheus.yml- targets:[localhost:9187]labels: app:postgres_exporter重启prometheus服务:systemctl restart prometheus使用浏览器Ip9090打开promethues的页面我们可以看到成功的检测到了postgres_exporter服务啦为了实现Prometheus对位于公网或不同局域网中的PostgreSQL数据库的监控可在目标机器上部署postgres_exporter以暴露数据库指标并通过内网穿透工具cpolar将其本地监听端口如9187安全地映射到公网。Prometheus服务器即可通过cpolar提供的公网地址拉取远端数据库的监控数据从而在不依赖复杂网络配置或暴露数据库本身的前提下完成跨网络的监控集成。6.安装cpolar内网穿透工具cpolar 可以将你本地电脑中的服务如 SSH、Web、数据库映射到公网。即使你在家里或外出时也可以通过公网地址连接回本地运行的开发环境。❤️以下是安装cpolar步骤使用一键脚本安装命令sudocurlhttps://get.cpolar.sh|sh安装完成后执行下方命令查看cpolar服务状态如图所示即为正常启动sudosystemctl status cpolarCpolar安装和成功启动服务后在浏览器上输入虚拟机主机IP加9200端口即:【ip:9200】访问Cpolar管理界面使用Cpolar官网注册的账号登录,登录后即可看到cpolar web 配置界面,接下来在web 界面配置即可打开浏览器访问本地9200端口使用cpolar账户密码登录即可,登录后即可对隧道进行管理。7.配置公网地址登录cpolar web UI管理界面后,点击左侧仪表盘的隧道管理——创建隧道隧道名称可自定义本例使用了:postgres_exporter注意不要与已有的隧道名称重复协议http本地地址9187域名类型随机域名地区选择China Top创建成功后打开左侧在线隧道列表,可以看到刚刚通过创建隧道生成了公网地址接下来就可以在其他电脑或者移动端设备异地上使用地址访问。访问成功。8.将本postgres_exporter暴露给Prometheus进行远程抓取Prometheus可以通过这个公网地址51bd1f65.r2.cpolar.top访问到运行在本地9187端口的postgres_exporter服务从而抓取系统指标。- targets:[51bd1f65.r2.cpolar.top]labels: app:postgres_exporter抓取成功9.保留固定公网地址使用cpolar为其配置二级子域名该地址为固定地址不会随机变化。点击左侧的预留选择保留二级子域名地区选择china Top然后设置一个二级子域名名称我这里演示使用的是postgres大家可以自定义。填写备注信息点击保留。登录cpolar web UI管理界面点击左侧仪表盘的隧道管理——隧道列表找到所要配置的隧道postgres点击右侧的编辑。修改隧道信息将保留成功的二级子域名配置到隧道中域名类型选择二级子域名Sub Domain填写保留成功的二级子域名地区: China Top点击更新更新完成后打开在线隧道列表此时可以看到随机的公网地址已经发生变化地址名称也变成了保留和固定的二级子域名名称。最后我们使用固定的公网地址在任意设备的浏览器中访问可以看到成功访问本地部署的页面这样一个永久不会变化的二级子域名公网网址即设置好了。结尾Postgres Exporter打通了PostgreSQL与Prometheus之间的监控链路使连接数、事务状态、缓存效率、锁等待和复制延迟等指标能够被持续采集和分析。相比故障发生后再查看日志历史数据和告警规则更有利于提前发现性能变化。cpolar可以补充跨网络采集能力适合异地数据库和没有公网IP的环境。长期使用时应采用固定地址、保护/metrics接口并妥善保存数据库监控凭据。告警阈值还需要结合数据库规模和实际负载调整避免直接照搬示例产生误报。