外观
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 --version2. 配置 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 prometheusPostgreSQL 指标导出器配置
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_exporter2. 配置 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
EOF3. 启动 pg_exporter 服务
bash
# 启动 pg_exporter 服务
sudo systemctl daemon-reload
sudo systemctl start pg_exporter
sudo systemctl enable pg_exporter
# 检查服务状态
sudo systemctl status pg_exporterGrafana 安装与配置
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-server2. 配置 Grafana 数据源
- 访问 Grafana Web 界面(默认地址:http://localhost:3000,默认用户名/密码:admin/admin)
- 点击左侧菜单的 "Configuration" -> "Data Sources"
- 点击 "Add data source"
- 选择 "Prometheus"
- 在 "URL" 字段中输入 Prometheus 地址(默认:http://localhost:9090)
- 点击 "Save & Test" 验证连接
3. 导入 PostgreSQL 仪表盘
- 点击左侧菜单的 "Create" -> "Import"
- 在 "Import via grafana.com" 字段中输入仪表盘 ID:763(PostgreSQL 官方仪表盘)
- 点击 "Load"
- 选择之前配置的 Prometheus 数据源
- 点击 "Import" 完成导入
常用 PostgreSQL 监控指标
1. 数据库状态指标
txt
# 数据库连接数
pg_stat_database_numbackends
# 数据库大小
pg_database_size_bytes
# 事务提交和回滚数
pg_stat_database_xact_commit
pg_stat_database_xact_rollback2. 表和索引指标
txt
# 表大小
pg_table_size_bytes
# 索引大小
pg_indexes_size_bytes
# 全表扫描次数
pg_stat_user_tables_seq_scan
# 索引扫描次数
pg_stat_user_tables_idx_scan3. 查询性能指标
txt
# 慢查询数
pg_stat_database_conflicts
# 锁定等待时间
pg_stat_database_conflicts
# 缓冲区命中率
pg_stat_database_blks_hit / (pg_stat_database_blks_hit + pg_stat_database_blks_read) * 1004. 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:可以通过以下方式添加自定义监控指标:
- 在 PostgreSQL 中创建自定义函数,返回需要监控的值
- 在 pg_exporter 配置中添加自定义查询
- 重启 pg_exporter 服务
- 在 Prometheus 中验证指标是否可见
Q2:如何监控多个 PostgreSQL 实例?
A2:监控多个 PostgreSQL 实例的方法:
- 在每个 PostgreSQL 实例上安装 pg_exporter
- 在 Prometheus 配置文件中添加多个 PostgreSQL 目标
- 使用标签区分不同实例
- 在 Grafana 中创建多实例仪表盘
Q3:如何排查监控数据缺失问题?
A3:排查监控数据缺失的步骤:
- 检查 pg_exporter 服务是否正常运行
- 检查 Prometheus 是否能够连接到 pg_exporter
- 检查 PostgreSQL 数据库连接字符串是否正确
- 查看 pg_exporter 日志,检查是否有错误信息
- 检查 Prometheus 日志,查看是否有抓取错误
Q4:如何优化 Grafana 仪表盘性能?
A4:优化 Grafana 仪表盘性能的方法:
- 减少仪表盘上的面板数量
- 优化查询语句,减少数据返回量
- 增加查询的时间范围步长
- 使用变量过滤数据
- 启用仪表盘缓存
Q5:如何备份和恢复 Grafana 配置?
A5:备份和恢复 Grafana 配置的方法:
- 备份:使用 Grafana API 导出仪表盘配置,备份数据库
- 恢复:使用 Grafana API 导入仪表盘配置,恢复数据库
- 定期备份:设置定期备份任务,确保配置安全
Q6:如何设置不同级别的告警?
A6:设置不同级别告警的方法:
- 在告警规则中使用 severity 标签区分告警级别(critical、warning、info)
- 在 Alertmanager 中根据 severity 标签配置不同的通知方式
- 为不同级别的告警设置不同的通知渠道(邮件、短信、钉钉等)
- 为不同级别的告警设置不同的通知频率
