本页内容
- 先决条件
- PostgreSQL 服务器配置
- 下载 postgres_exporter
- 配置 postgres_exporter
- 配置防火墙
- 将 postgres_exporter 添加到 Prometheus
- 通过 Grafana 设置仪表板监控
- 结论
在本教程中,你将搭建 Prometheus 和 Grafana 监控平台来监控 PostgreSQL 数据库服务器。你将安装并配置 postgres_exporter 以收集 PostgreSQL 服务器指标,并将其暴露给 Prometheus 服务器。在本教程结束时,你将通过 Grafana 数据可视化平台为 PostgreSQL 服务器设置仪表板监控。
先决条件
要完成本教程,你需要满足以下要求:
- 一台已安装 Prometheus 和 Grafana 的服务器。
- 一台已安装 PostgreSQL 数据库服务器的目标服务器。
- 一个具有 sudo/root 管理员权限的非 root 用户。
以下是每个组件的安装指南。
如何在 Ubuntu 22.04 服务器上安装 Prometheus 和 Grafana 监控平台。如何在 Ubuntu 22.04 服务器上安装 PostgreSQL 数据库服务器。
当所有先决条件都已完成并就绪后,现在让我们开始。
PostgreSQL 服务器配置
PostgreSQL 服务器提供两种不同的密码加密方法:md5 和 scram-sha-256。这两种密码加密方式都可以通过 PostgreSQL 配置文件 'postgresql.conf' 进行配置。
在本步骤中,你将配置 PostgreSQL 使用 ' scram-sha-256 ' 密码加密。
本示例使用安装在 Ubuntu 系统上的 PostgreSQL 服务器 v14,因此 PostgreSQL 配置文件存储在 '/etc/postgresql/14/main' 目录中。
将工作目录切换到 ' /etc/postgresql/14/main ' 目录,并通过 nano 编辑器命令打开配置文件 'postgresql.conf'。
cd /etc/postgresql/14/main
sudo nano postgresql.conf
取消注释选项 ' password_encryption ' 并将其值改为 ' scram-sha-256 '。
password_encryption = scram-sha-256 # scram-sha-256 or md5
完成后保存文件并退出编辑器。

接下来,通过下面的 nano 编辑器命令打开配置文件 ' pg_hba.conf '。文件 'pg_hba.conf ' 是用于为主机或 IP 地址定义密码认证方法的配置文件。
sudo nano pg_hba.conf
将主机 ' 127.0.0.1/32 ' 和 ' ::1/128 ' 的默认认证方法改为 ' scram-sha-256 '。这样,对于到 PostgreSQL 服务器 ' 127.0.0.1 ' 的每一个客户端连接,都将使用 ' scram-sha-25 6' 认证方法。
# "local" is for Unix domain socket connections only local all all peer # IPv4 local connections: host all all 127.0.0.1/32 scram-sha-256 # IPv6 local connections: host all all ::1/128 scram-sha-256
完成后保存并退出编辑器。

最后,运行以下 systemctl 命令工具以重启 PostgreSQL 服务并应用更改。
sudo systemctl restart postgresql
PostgreSQL 服务器配置完成后,接下来你将安装 'postgres_exporter',它允许你收集 PostgreSQL 服务器的指标。
下载 postgres_exporter
' postgres_exporter ' 是一个用于 PostgreSQL 服务器指标的 Prometheus exporter。它支持多个 PostgreSQL 版本,如 9.4、9.5、9.6、10、11、12、13 和 14。'postgres_exporter ' 是一个单二进制文件应用程序,主要使用 Go 编写。
你将在这些步骤中在 PostgreSQL 服务器上下载 'postgres_exporter'。
首先,运行以下命令在你的 PostgreSQL 服务器上创建一个新系统用户 'postgres_exporter'。
sudo useradd -M -r -s /sbin/nologin postgres_exporter
之后,通过下面的 wget 命令下载 'postgres_exporter' 二进制文件。请务必查看 'postgres_exporter' 的 GitHub 页面以获取最新版本的 ' postgres_exporter' 。在撰写本文时,postgres_exporter 的最新版本是 v0.12。
wget https://github.com/prometheus-community/postgres_exporter/releases/download/v0.12.0-rc.0/postgres_exporter-0.12.0-rc.0.linux-amd64.tar.gz
接下来,运行下面的 tar 命令解压 postgres_exporter 软件包。然后,将解压后的 postgres_exporter 目录移动到 ' /opt/postgres_exporter '。
tar xvf postgres_exporter*.tar.gz
mv postgres_exporter*/ /opt/postgres_exporter
最后,验证 'postgres_exporter' 目录中的文件和目录列表。你应该能看到 ' postgres_exporter' 二进制文件可用。
ls /opt/postgres_exporter

' postgres_exporter ' 二进制文件下载完成后,你将配置 'postgres_exporter' 以收集 PostgreSQL 服务器指标。
配置 postgres_exporter
在本步骤中,你将配置 'postgres_exporter' 以收集 PostgreSQL 指标,这可以通过定义 PostgreSQL 用户和密码来完成。你还将为 'postgres_exporter' 设置并配置 systemd 服务。
借助 ' postgres_exporter ',你可以暴露 PostgreSQL 服务器上所有可用数据库的指标,也可以暴露你想要监控的特定数据库。你也可以使用安全的 SSL 模式或非 SSL 模式。
通过下面的 cd 命令将当前工作目录切换到 '/opt/postgres_exporter'。
cd /opt/postgres_exporter
现在使用下面的 nano 编辑器命令创建一个新文件 '.env '。
nano .env
向文件中添加以下行。同时,请务必修改 PostgreSQL 用户、密码和主机的详细信息。借助这个 ' .env ' 文件,你将抓取并收集所有可用数据库的 PostgreSQL 指标。你也可以从特定的 PostgreSQL 数据库收集指标,并调整以下配置文件。
# Format #DATA_SOURCE_NAME=postgresql://username:password@localhost:5432/postgres?sslmode=disable # Monitor all databases via postgres_exporter DATA_SOURCE_NAME="postgresql://postgres:strongpostgrespassword@localhost:5432/?sslmode=disable" # Monitor specific databases on the PostgreSQL server # DATA_SOURCE_NAME="postgresql://username:password@localhost:5432/database-name?sslmode=disable"
完成后保存文件并退出编辑器。
接下来,运行下面的 chown 命令,将 '/opt/postgres_exporter' 目录的属主更改为用户 'postgres_exporter'。
sudo chown -R postgres_exporter: /opt/postgres_exporter
之后,运行以下命令创建一个新 systemd 服务文件 '/etc/systemd/system/postgres_exporter.service' 。这样,你便可以通过 systemctl 命令工具轻松管理 ' postgres_exporter '。
sudo tee /etc/systemd/system/postgres_exporter.service<<EOF
[Unit]
Description=Prometheus exporter for Postgresql
Wants=network-online.target
After=network-online.target
[Service]
User=postgres_exporter
Group=postgres_exporter
WorkingDirectory=/opt/postgres_exporter
EnvironmentFile=/opt/postgres_exporter/.env
ExecStart=/opt/postgres_exporter/postgres_exporter --web.listen-address=:9187 --web.telemetry-path=/metrics
Restart=always
[Install]
WantedBy=multi-user.target
EOF

现在运行以下 systemctl 命令以重新加载 systemd 管理器并应用更改。
sudo systemctl daemon-reload
systemd 管理器重新加载后,通过下面的 systemctl 命令工具启动并启用 'postgres_exporter' 服务。
sudo systemctl start postgres_exporter
sudo systemctl enable postgres_exporter
'postgres_exporter' 应该正在运行并从 PostgreSQL 服务器抓取指标。此外,它应该已被启用,并将在启动时自动运行。

最后,运行以下命令验证 'postgres_exporter' 服务状态。同时,确保 'postgres_exporter ' 正在运行且已启用。
sudo systemctl status postgres_exporter
你将收到类似以下的输出——' postgres_exporter ' 服务正在运行且已启用。

此时,'postgres_exporter' 正在 PostgreSQL 服务器上的默认 TCP 端口 ' 9187 ' 上运行。这会将 PostgreSQL 指标暴露给 Prometheus 服务器,但在那之前,你还需要在 PostgreSQL 服务器上配置 firewalld。
配置防火墙
在本步骤中,你将配置防火墙以开放 ' postgres_exporter' 的默认端口——TCP 9187 。之后,你将验证 'postgres_exporter' 指标是否可通过网页浏览器访问。
对于使用 UFW 作为防火墙的 Ubuntu 系统,运行下面的 ufw 命令将端口 9187 添加到 ufw 防火墙。然后重新加载防火墙以应用更改。
sudo ufw allow 9187/tcp
sudo ufw reload
你现在可以通过下面的 ufw 命令验证 UFW 上的端口列表。
sudo ufw status
你将收到类似以下的输出——postgres_exporter 端口 9187 已添加到 firewalld。

对于使用 firewalld 作为默认防火墙的基于 RHEL 的发行版,运行下面的 firewall-cmd 命令将端口 9187 添加到 firewalld。然后重新加载 firewalld 以应用新更改。
sudo firewall-cmd --add-port=9187/tcp --permanent
sudo firewall-cmd --reload
之后,运行以下命令验证 postgres_exporter 端口 9187 是否已添加。
sudo firewall-cmd --list-ports
你现在应该能看到端口 9187 已添加到防火墙。
最后,打开你的网页浏览器,访问你的 PostgreSQL 服务器 IP 地址,后接 ' postgres_exporter ' 端口 9187(例如:http://192.168.5.21:9187/metrics)。
你应该能看到由 'postgres_exporter ' 收集的 PostgreSQL 服务器指标详情。

防火墙配置完成且 'postgres_exporter' 可访问后,接下来你将把 'postgres_exporter' 添加到 Prometheus 的 'scrape_configs' 目标中。
将 postgres_exporter 添加到 Prometheus
回到 Prometheus 服务器,然后通过下面的 nano 编辑器命令打开 Prometheus 配置文件 ' /etc/prometheus/prometheus.yml '。
sudo nano /etc/prometheus/prometheus.yml
在 ' scrape_configs ' 部分下,向文件中添加以下行。在本示例中,你将创建一个新作业来收集 PostgreSQL 服务器指标,作业名为 ' postgres_exporter ',PostgreSQL 的目标服务器为 ' 192.168.5.21:9187 ',即由 ' postgres_exporter ' 服务暴露的指标。
# PostgreSQL Monitoring with postgres_exporter - job_name: 'postgres_exporter' scrape_interval: 5s static_configs: - targets: ['192.168.5.21:9187']
完成后保存文件并退出编辑器。

现在运行以下 systemctl 命令以重启 Prometheus 服务并应用更改。
sudo systemctl restart prometheus
新的 scrape_configs 已创建且 Prometheus 服务器已重启后,你将通过 Prometheus Web 仪表板验证 ' postgres_exporte r'。
打开你的网页浏览器,访问 Prometheus 服务器 IP 地址,后接默认端口 9090(例如:https://192.168.5.100:9090 )。
如果你启用了 basic_auth,请使用你的用户名和密码登录 Prometheus 服务器。
在 Prometheus 仪表板上,点击 ' browser ' 图标以获取 Prometheus 查询列表。然后,输入 ' pg ' 以筛选以 ' pg ' 开头的查询。你将收到类似以下截图的输出。

接下来,点击 Status 菜单并选择 Targets,你应该能看到作业名 ' postgres_exporter' 在 IP 地址为 ' 192.168.5.21:9187 ' 的 PostgreSQL 服务器上处于运行(up)状态。

现在 ' postgres_exporter' 已添加到 Prometheus 服务器,PostgreSQL 服务器的指标现在在 Prometheus 上可用了。
在接下来的步骤中,你将设置 Grafana 仪表板来监控 PostgreSQL 服务器。
通过 Grafana 设置仪表板监控
打开你的 Grafana 域名或服务器 IP 地址,然后使用你的用户名和密码登录 Grafana 仪表板。
登录后,点击 Dashboard 菜单并选择 Import 。

输入 PostgreSQL 仪表板 id 'xxx' 并点击 Load。PostgreSQL 仪表板 id ' 9628 ' 可在 Grafana Dashboard 仓库中找到。

接下来,输入新仪表板并选择 ' Prometheus ' 作为数据源。然后点击 Import 以应用。
在本示例中,你将创建一个名为 ' PostgreSQL Monitoring ' 的新仪表板。

Grafana 仪表板导入完成后,检查你的新仪表板,你应该能看到如下的 PostgreSQL 仪表板监控。

结论
恭喜!你已通过 ' postgres_exporter ' 使用 Prometheus 和 Grafana 完成了 PostgreSQL 服务器监控。你还为 PostgreSQL 服务器监控创建了一个专用仪表板。借此,你可以获取关于 PostgreSQL 内部运行情况的深入详情。
你现在可以查看 Prometheus Community 的 GitHub 页面,以获取 Prometheus 上可用 exporter 的详情。这让你能够通过 Grafana 和 Prometheus 监控栈来监控你的应用程序。