Skip to content

PostgreSQL Prometheus + Grafana 监控

Prometheus 安装与配置

1. 安装 Prometheus

bash
# 使用包管理器安装(Ubuntu/Debian)
sudo apt-get update
sudo apt-get install prometheus prometheus-node-exporter

# 使用包管理器安装(CentOS/RHEL)
sudo yum install epel-release
sudo yum install prometheus prometheus-node-exporter

# 验证安装
prometheus --version

2. 配置 Prometheus

yaml
# Prometheus 配置文件示例(/etc/prometheus/prometheus.yml)
global:
  scrape_interval:     15s
  evaluation_interval: 15s

rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

scrape_configs:
  # 监控 Prometheus 自身
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  # 监控 Node Exporter
  - job_name: 'node'
    static_configs:
      - targets: ['localhost:9100']

  # 监控 PostgreSQL(使用 pg_exporter)
  - job_name: 'postgresql'
    static_configs:
      - targets: ['localhost:9187']
    metrics_path: /metrics
    params:
      format: ['prometheus']

3. 启动 Prometheus 服务

bash
# 启动 Prometheus 服务
sudo systemctl start prometheus
sudo systemctl enable prometheus

# 检查服务状态
sudo systemctl status prometheus

PostgreSQL 指标导出器配置

1. 安装 pg_exporter

bash
# 下载 pg_exporter
wget https://github.com/prometheus-community/postgres_exporter/releases/download/v0.14.0/postgres_exporter-0.14.0.linux-amd64.tar.gz

# 解压并安装
tar -xzf postgres_exporter-0.14.0.linux-amd64.tar.gz
sudo cp postgres_exporter-0.14.0.linux-amd64/postgres_exporter /usr/local/bin/
sudo chmod +x /usr/local/bin/postgres_exporter

2. 配置 pg_exporter

bash
# 创建 pg_exporter 配置文件
sudo mkdir -p /etc/pg_exporter

# 创建数据库连接字符串
echo "DATA_SOURCE_NAME=postgresql://postgres:password@localhost:5432/postgres?sslmode=disable" | sudo tee /etc/pg_exporter/pg_exporter.env

# 创建 systemd 服务文件
sudo tee /etc/systemd/system/pg_exporter.service << EOF
[Unit]
Description=PostgreSQL Prometheus Exporter
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
User=postgres
Group=postgres
EnvironmentFile=/etc/pg_exporter/pg_exporter.env
ExecStart=/usr/local/bin/postgres_exporter --web.listen-address=:9187
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

3. 启动 pg_exporter 服务

bash
# 启动 pg_exporter 服务
sudo systemctl daemon-reload
sudo systemctl start pg_exporter
sudo systemctl enable pg_exporter

# 检查服务状态
sudo systemctl status pg_exporter

Grafana 安装与配置

1. 安装 Grafana

bash
# 使用包管理器安装(Ubuntu/Debian)
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee /etc/apt/sources.list.d/grafana.list
sudo apt-get update
sudo apt-get install grafana

# 使用包管理器安装(CentOS/RHEL)
sudo tee /etc/yum.repos.d/grafana.repo << EOF
[grafana]
name=grafana
baseurl=https://packages.grafana.com/oss/rpm
enabled=1
gpgcheck=1
gpgkey=https://packages.grafana.com/gpg.key
EOF
sudo yum install grafana

# 启动 Grafana 服务
sudo systemctl start grafana-server
sudo systemctl enable grafana-server

# 检查服务状态
sudo systemctl status grafana-server

2. 配置 Grafana 数据源

  1. 访问 Grafana Web 界面(默认地址:http://localhost:3000,默认用户名/密码:admin/admin)
  2. 点击左侧菜单的 "Configuration" -> "Data Sources"
  3. 点击 "Add data source"
  4. 选择 "Prometheus"
  5. 在 "URL" 字段中输入 Prometheus 地址(默认:http://localhost:9090
  6. 点击 "Save & Test" 验证连接

3. 导入 PostgreSQL 仪表盘

  1. 点击左侧菜单的 "Create" -> "Import"
  2. 在 "Import via grafana.com" 字段中输入仪表盘 ID:763(PostgreSQL 官方仪表盘)
  3. 点击 "Load"
  4. 选择之前配置的 Prometheus 数据源
  5. 点击 "Import" 完成导入

常用 PostgreSQL 监控指标

1. 数据库状态指标

txt
# 数据库连接数
pg_stat_database_numbackends

# 数据库大小
pg_database_size_bytes

# 事务提交和回滚数
pg_stat_database_xact_commit
pg_stat_database_xact_rollback

2. 表和索引指标

txt
# 表大小
pg_table_size_bytes

# 索引大小
pg_indexes_size_bytes

# 全表扫描次数
pg_stat_user_tables_seq_scan

# 索引扫描次数
pg_stat_user_tables_idx_scan

3. 查询性能指标

txt
# 慢查询数
pg_stat_database_conflicts

# 锁定等待时间
pg_stat_database_conflicts

# 缓冲区命中率
pg_stat_database_blks_hit / (pg_stat_database_blks_hit + pg_stat_database_blks_read) * 100

4. WAL 和复制指标

txt
# WAL 生成速率
rate(pg_stat_bgwriter_wal_written_bytes[5m])

# 复制延迟
pg_stat_replication_replay_lag_seconds

# 复制状态
pg_stat_replication_state

告警配置

1. 配置 Prometheus 告警规则

yaml
# 创建告警规则文件 /etc/prometheus/alert_rules.yml
groups:
- name: postgresql_alerts
  rules:
  - alert: PostgreSQLDown
    expr: pg_up == 0
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "PostgreSQL 实例不可用"
      description: "PostgreSQL 实例 {{ $labels.instance }} 已停止响应超过 5 分钟"

  - alert: PostgreSQLHighConnections
    expr: pg_stat_database_numbackends > 80
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "PostgreSQL 连接数过高"
      description: "PostgreSQL 实例 {{ $labels.instance }} 连接数已超过 80% 阈值"

  - alert: PostgreSQLSlowQueries
    expr: rate(pg_stat_database_conflicts[5m]) > 10
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "PostgreSQL 慢查询过多"
      description: "PostgreSQL 实例 {{ $labels.instance }} 慢查询速率超过 10 次/分钟"

2. 在 Prometheus 中加载告警规则

yaml
# 修改 prometheus.yml 添加告警规则文件
rule_files:
  - "/etc/prometheus/alert_rules.yml"

3. 配置 Alertmanager

yaml
# 创建 Alertmanager 配置文件 /etc/prometheus/alertmanager.yml
global:
  smtp_smarthost: 'smtp.example.com:587'
  smtp_from: 'alertmanager@example.com'
  smtp_auth_username: 'alertmanager'
  smtp_auth_password: 'password'

route:
  group_by: ['alertname', 'instance']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  receiver: 'email-alerts'

receivers:
- name: 'email-alerts'
  email_configs:
  - to: 'admin@example.com'
    send_resolved: true

最佳实践

1. 监控配置最佳实践

  • 合理设置抓取间隔:根据系统负载调整 scrape_interval,建议 15-30 秒
  • 监控关键指标:重点监控数据库连接数、慢查询、缓冲区命中率、复制延迟等
  • 设置合理的告警阈值:根据实际业务情况调整告警阈值
  • 定期备份仪表盘:定期导出 Grafana 仪表盘配置,避免配置丢失

2. 性能优化建议

  • 使用持久化存储:为 Prometheus 配置持久化存储,避免数据丢失
  • 合理设置数据保留时间:根据存储容量调整 --storage.tsdb.retention.time 参数
  • 使用标签过滤:在 Prometheus 查询中使用标签过滤,减少查询范围
  • 优化仪表盘查询:避免在仪表盘上使用过于复杂的查询,影响加载性能

3. 安全配置建议

  • 限制访问权限:为 Prometheus 和 Grafana 设置访问控制,使用用户名和密码认证
  • 使用 HTTPS:为 Prometheus 和 Grafana 配置 SSL/TLS 加密
  • 限制网络访问:使用防火墙限制只有特定 IP 可以访问监控服务
  • 定期更新软件:定期更新 Prometheus、Grafana 和 pg_exporter 到最新版本

常见问题(FAQ)

Q1:如何添加自定义监控指标?

A1:可以通过以下方式添加自定义监控指标:

  1. 在 PostgreSQL 中创建自定义函数,返回需要监控的值
  2. 在 pg_exporter 配置中添加自定义查询
  3. 重启 pg_exporter 服务
  4. 在 Prometheus 中验证指标是否可见

Q2:如何监控多个 PostgreSQL 实例?

A2:监控多个 PostgreSQL 实例的方法:

  1. 在每个 PostgreSQL 实例上安装 pg_exporter
  2. 在 Prometheus 配置文件中添加多个 PostgreSQL 目标
  3. 使用标签区分不同实例
  4. 在 Grafana 中创建多实例仪表盘

Q3:如何排查监控数据缺失问题?

A3:排查监控数据缺失的步骤:

  1. 检查 pg_exporter 服务是否正常运行
  2. 检查 Prometheus 是否能够连接到 pg_exporter
  3. 检查 PostgreSQL 数据库连接字符串是否正确
  4. 查看 pg_exporter 日志,检查是否有错误信息
  5. 检查 Prometheus 日志,查看是否有抓取错误

Q4:如何优化 Grafana 仪表盘性能?

A4:优化 Grafana 仪表盘性能的方法:

  1. 减少仪表盘上的面板数量
  2. 优化查询语句,减少数据返回量
  3. 增加查询的时间范围步长
  4. 使用变量过滤数据
  5. 启用仪表盘缓存

Q5:如何备份和恢复 Grafana 配置?

A5:备份和恢复 Grafana 配置的方法:

  1. 备份:使用 Grafana API 导出仪表盘配置,备份数据库
  2. 恢复:使用 Grafana API 导入仪表盘配置,恢复数据库
  3. 定期备份:设置定期备份任务,确保配置安全

Q6:如何设置不同级别的告警?

A6:设置不同级别告警的方法:

  1. 在告警规则中使用 severity 标签区分告警级别(critical、warning、info)
  2. 在 Alertmanager 中根据 severity 标签配置不同的通知方式
  3. 为不同级别的告警设置不同的通知渠道(邮件、短信、钉钉等)
  4. 为不同级别的告警设置不同的通知频率