PostgreSQL 教程: 使用 Prometheus 和 Grafana 监控 PostgreSQL

四月 21, 2024

摘要:在本教程中,您将设置 Prometheus 和 Grafana 监控平台,来监控 PostgreSQL 数据库服务器。您将安装设置 postgres_exporter,以收集 PostgreSQL 服务器指标,并将其提供给 Prometheus 服务器。在本教程结束时,您将通过 Grafana 数据可视化平台,为 PostgreSQL 服务器设置监控仪表板。

什么是 Prometheus?

Prometheus 是一个开源工具,可让您监控数据库、虚拟机和其他任何组件。凭借其云原生的监控能力,它有一个时序数据库,可以从您定义的一堆导出器中扫描数据,从而导出所需的所有资源监控指标,以用于正确监控数据库服务器。在系统级资源监控方面,最流行的导出器是 Prometheus 的 node-exporter。

Prometheus Alertmanager 可在指标达到阈值时生成警报。此外,您可以使用 Grafana 设置 Prometheus 的监控仪表板,观察您收集的指标的模式和行为。对于 PostgreSQL,您还可以使用 PostgreSQL 导出器来导出一些重要指标,例如活动会话、数据库锁和复制。

什么是 Grafana?

Grafana 是一个支持多平台的分析和可视化开源工具,由排列在网格中的多个独立面板组成。这些面板与配置的数据源(如 AWS CloudWatch、Microsoft SQL Server、Prometheus、MySQL、InfluxDB 等)进行交互。Grafana 的设计是这样的,每个面板都绑定到一个数据源。Grafana 仪表板在单个网格中包含多个面板,有助于同时可视化来自多个数据源的结果。

Grafana 附带了一个内置的 PostgreSQL 数据源插件,允许您从一个兼容 PostgreSQL 的数据库中查询和可视化数据。集成 PostgreSQL 的 Grafana 预置仪表板,允许您实时可视化重要的历史性能监控信息,例如系统资源监控(CPU、内存、存储、网络)、数据库监控(活动会话、复制状态、查询性能等)。

Prometheus 和 Grafana 的好处

  • 它们是基于开源的
  • 可定制,并允许创建自己的监控仪表板
  • 使用时间选取下拉列表,访问相对时间范围内的监控信息,提供自动刷新选项,可自定义设置绝对时间范围
  • 图形图例可提供图形中的图例信息
  • 提供自动服务发现功能
  • 无处不在的社区支持
  • 支持系统数据库性能指标
  • 对于 PostgreSQL 导出器默认不支持的指标,可灵活配置自定义指标

前提条件

要完成本教程的操作步骤,需要满足以下要求:

  • 一台安装了 Prometheus 和 Grafana 的服务器。
  • 安装了 PostgreSQL 数据库服务器的目标服务器。
  • 具有 sudo/root 管理员权限的非 root 用户。

当所有前提条件都完成并准备后,现在让我们开始吧。

PostgreSQL 服务器配置

PostgreSQL 服务器提供了两种不同的密码加密方法:md5 和 scram-sha-256。这两种密码加密都可以通过 PostgreSQL 配置文件 “postgresql.conf” 进行配置。

在此步骤中,您将设置 PostgreSQL 使用 “scram-sha-256” 密码加密。

通过编辑器打开配置文件 “postgresql.conf”。取消对参数 “password_encryption” 的注释,并将值更改为 “scram-sha-256”。

password_encryption = scram-sha-256     # scram-sha-256 or md5

接下来,打开配置文件 “pg_hba.conf”。文件 “pg_hba.conf” 是为主机或 IP 地址定义密码身份验证方法的配置。将主机 “127.0.0.1/32” 和 “::1/128” 的默认身份验证方法更改为 “scram-sha-256”。这样,身份验证方法 “scram-sha-256” 将用于与 PostgreSQL 服务器 “127.0.0.1” 的每个客户端连接。

# "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

最后,重新启动 PostgreSQL 服务以应用更改。配置 PostgreSQL 服务器后,接下来将安装允许您收集 PostgreSQL 服务器指标的 “postgres_exporter”。

下载 postgres_exporter

postgres_exporter” 是一个 prometheus 导出器,以用于获取 PostgreSQL 服务器指标。它支持 PostgreSQL 的多个版本,例如9.4~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.15。

wget https://github.com/prometheus-community/postgres_exporter/releases/download/v0.15.0/postgres_exporter-0.15.0.linux-amd64.tar.gz

接下来,运行下面的 tar 命令,以解压 postgres_exporter 包。然后,将提取的 postgres_exporter 目录移动到 “/opt/postgres_exporter”。

tar xf postgres_exporter*.tar.gz
mv postgres_exporter*/ /opt/postgres_exporter

最后,验证 “postgres_exporter” 目录上的文件和目录列表。您应该会看到 “postgres_exporter” 二进制文件。

$ ls /opt/postgres_exporter
LICENSE  NOTICE  postgres_exporter

下载 “postgres_exporter” 二进制文件后,您将配置 “postgres_exporter”,以收集 PostgreSQL 服务器指标。

配置 postgres_exporter

在此步骤中,您将配置 “postgres_exporter” 来收集 PostgreSQL 指标,这可以通过定义 PostgreSQL 用户和密码来完成。您还将为 “postgres_exporter” 设置和配置 systemd 服务。

使用 “postgres_exporter”,您可以公开 PostgreSQL 服务器上所有数据库的指标,也可以只公开要监视的特定数据库。您还可以使用安全 SSL 模式或非 SSL 模式。

现在创建一个新文件 “/opt/postgres_exporter/.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:password@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” 上运行。这会向 Prometheus 服务器公开 PostgreSQL 指标,但在此之前,您还需要在 PostgreSQL 服务器上设置防火墙。

设置防火墙

在此步骤中,你将设置防火墙,以打开 “postgres_exporter” 的默认 TCP 端口 9187。之后,您将验证 “postgres_exporter” 指标是否可通过 Web 浏览器访问。

对于使用 UFW 作为防火墙的 Ubuntu 系统,运行以下 ufw 命令将端口 9187 添加到 ufw 防火墙。然后,重新加载防火墙以应用更改。

sudo ufw allow 9187/tcp
sudo ufw reload

您现在可以通过下面的 ufw 命令验证 UFW 上的端口列表。

sudo ufw status

您应该会看到类似这样的输出:postgres_exporter 端口 9187 已添加到防火墙中。

对于使用 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 已添加到防火墙中。

最后,打开您的 Web 浏览器,并访问您的 PostgreSQL 服务器 IP 地址,和 “postgres_exporter” 端口 9187(即:http://192.168.5.21:9187/metrics)。

您应该会看到 “postgres_exporter” 收集的 PostgreSQL 服务器指标的详细信息。

pstgres_exporter metrics

配置防火墙并可访问 “postgres_exporter” 后,接下来将 “postgres_exporter” 添加到 Prometheus 的 “scrape_configs” 目标中。

向 Prometheus 添加 postgres_exporter

返回到 Prometheus 服务器,然后打开 Prometheus 配置文件 ‘/etc/prometheus/prometheus.yml’。在 “scrape_configs” 部分下,将以下行添加到文件中。在此示例中,您将设置一个新的任务,用于收集名为 “postgres_exporter” 的 PostgreSQL 服务器指标,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 网络仪表板验证 “postgres_exporter”。

打开您的 Web 浏览器,并访问 Prometheus 服务器 IP 地址,后跟默认端口 9090(即:https://192.168.5.100:9090)。

在启用 basic_auth 后,您需要使用用户名和密码登录 Prometheus 服务器。

在 Prometheus 仪表板上,单击 “浏览器” 图标以获取 Prometheus 查询列表。然后,输入 “pg” 以筛选出以 “pg” 开头的查询。然后,您将看到如下面屏幕截图所示的输出。

pg queries

接下来,单击“状态”菜单并选择“目标”,您应该会看到名为 “postgres_exporter” 的任务已启动,并在 IP 地址为 “192.168.5.21:9187” 的 PostgreSQL 服务器上运行。

postgres_exporter prometheus

现在,“postgres_exporter” 已添加到 Prometheus 服务器,并且来自 PostgreSQL 服务器的指标现在可以在 Prometheus 上使用。

在接下来的步骤中,您将设置用于监视 PostgreSQL 服务器的 Grafana 仪表板。

使用 Grafana 设置监控面板

打开您的 Grafana 域名或服务器 IP 地址,然后使用您的用户名和密码登录 Grafana 仪表板。

登录后,单击“仪表板”菜单,然后选择“导入”。

dashboard import

输入 PostgreSQL 仪表板 ID ‘xxx’,然后单击 Load。PostgreSQL 仪表板 ID ‘9628’ 在 Grafana 仪表板存储库中是可用的。

import dashboard id

接下来,输入新的仪表板,并选择 “Prometheus” 作为数据源。然后单击“导入”进行应用。

在此示例中,您将创建一个名为 “PostgreSQL Monitoring” 的新仪表板。

coinfigure new dashboard

导入 Grafana 仪表板后,检查您的新仪表板,您应该会看到 PostgreSQL 的监控仪表板,如下所示。

PostgreSQL dashboard monitoring

结论

很好!现在,您已经通过 “postgres_exporter”,使用 Prometheus 和 Grafana 完成了对 PostgreSQL 服务器的监控。您还为 PostgreSQL 服务器监控创建了一个特定的仪表板。有了这个,您可以获得有关 PostgreSQL 中正在发生的事情的深入的详细信息。

现在,您可以查看 Prometheus 社区 GitHub 页面,以获取 Prometheus 上可用的导出器的详细信息。这允许您通过 Grafana 和 Prometheus 监控软件栈来监控您的应用程序。

了解更多

Prometheus 中的 PostgreSQL 监控指标

PostgreSQL 监控