Skip to content

开源监控方案

除了主流的Prometheus + Grafana和Zabbix监控方案外,还有许多专门为PostgreSQL设计的开源监控工具。这些工具通常专注于特定的监控需求,如实时性能监控、日志分析、性能报告生成等。本文将介绍几种常用的PostgreSQL开源监控工具,帮助DBA选择适合自己环境的监控方案。

pg_top / pgtop

pg_top(也称为pgtop)是一个基于终端的实时监控工具,类似于Linux的top命令,专门用于监控PostgreSQL数据库的性能。

安装与配置

在RHEL/CentOS上安装

bash
# 安装pg_top
sudo yum install -y postgresql-pg_top

# 或者从源码编译安装
git clone https://github.com/darold/pg_top.git
cd pg_top
./configure
make
sudo make install

在Debian/Ubuntu上安装

bash
# 安装pgtop
sudo apt-get update
sudo apt-get install -y pgtop

使用方法

bash
# 基本使用
pg_top -h localhost -p 5432 -U postgres

# 显示指定数据库的监控信息
pg_top -d mydatabase

# 以批处理模式运行,输出到文件
pg_top -b -n 1 > pg_top_output.txt

# 设置刷新间隔为2秒
pg_top -i 2

主要功能

  • 实时性能指标:显示CPU使用率、内存使用率、连接数、事务数等实时指标
  • 进程列表:显示当前运行的PostgreSQL进程,包括查询内容、执行时间、状态等
  • 排序功能:支持按照不同字段排序,如CPU使用率、执行时间等
  • 自定义视图:支持自定义显示的指标和格式
  • 批处理模式:支持非交互式运行,便于生成报告或集成到其他监控系统

pgBadger

pgBadger是一个高性能的PostgreSQL日志分析工具,能够生成详细的HTML格式性能报告。

安装与配置

使用Perl模块安装

bash
# 安装pgBadger
sudo cpan App::cpanminus
sudo cpanm pgBadger

# 或者直接下载脚本
wget https://github.com/dalibo/pgbadger/archive/v12.3.tar.gz
tar -xzf v12.3.tar.gz
cd pgbadger-12.3
chmod +x pgbadger
cp pgbadger /usr/local/bin/

使用方法

bash
# 基本使用,分析PostgreSQL日志
pgbadger -o pgbadger_report.html /var/log/postgresql/postgresql-14-main.log

# 分析压缩的日志文件
pgbadger -o pgbadger_report.html /var/log/postgresql/postgresql-14-main.log.gz

# 分析多个日志文件
pgbadger -o pgbadger_report.html /var/log/postgresql/*.log

# 设置时间范围
pgbadger -o pgbadger_report.html --start "2023-01-01 00:00:00" --end "2023-01-31 23:59:59" /var/log/postgresql/*.log

# 结合pg_stat_statements数据
pgbadger -o pgbadger_report.html --extension pg_stat_statements --dbname postgres --username postgres --host localhost /var/log/postgresql/*.log

主要功能

  • 详细的性能报告:生成包含查询性能、连接统计、锁等待、慢查询等内容的HTML报告
  • 支持多种日志格式:支持PostgreSQL的各种日志格式,包括csvlog、stderr等
  • 高性能:能够快速分析大型日志文件(GB级)
  • 支持压缩文件:直接分析gzip、bzip2等压缩的日志文件
  • 与pg_stat_statements集成:结合pg_stat_statements数据生成更全面的报告
  • 定期报告生成:可以通过cron定时生成报告

pgCluu

pgCluu是一个PostgreSQL性能监控和报告生成工具,能够生成详细的HTML格式性能报告。

安装与配置

bash
# 下载pgCluu
git clone https://github.com/dalibo/pgcluu.git
cd pgcluu
chmod +x pgcluu_collectd pgcluu
cp pgcluu_collectd pgcluu /usr/local/bin/

# 安装依赖
sudo apt-get install -y libdbi-perl libdbd-pg-perl libjson-perl
# 或在RHEL/CentOS上
sudo yum install -y perl-DBI perl-DBD-Pg perl-JSON

使用方法

bash
# 收集监控数据
pgcluu_collectd -h localhost -p 5432 -U postgres -d postgres -D /tmp/pgcluu_data

# 生成报告
pgcluu -o /tmp/pgcluu_report /tmp/pgcluu_data

# 收集指定时间范围的数据
pgcluu_collectd -h localhost -p 5432 -U postgres -d postgres -D /tmp/pgcluu_data -i 60 -t 3600

# 结合日志文件生成更全面的报告
pgcluu -o /tmp/pgcluu_report /tmp/pgcluu_data --logfile /var/log/postgresql/postgresql-14-main.log

主要功能

  • 全面的性能报告:生成包含服务器信息、配置参数、性能指标、慢查询等内容的HTML报告
  • 数据收集与报告生成分离:支持先收集数据,然后离线生成报告
  • 支持长时间监控:可以收集数小时或数天的数据,生成趋势报告
  • 与PostgreSQL日志集成:结合日志文件生成更全面的报告
  • 支持远程监控:可以从远程主机收集PostgreSQL的性能数据

pgsnap

pgsnap是一个PostgreSQL性能数据收集工具,能够定期收集数据库的性能指标,并生成历史趋势报告。

安装与配置

bash
# 下载pgsnap
git clone https://github.com/tplaner/pgsnap.git
cd pgsnap
chmod +x pgsnap
cp pgsnap /usr/local/bin/

# 安装依赖
sudo apt-get install -y libdbi-perl libdbd-pg-perl libdatetime-perl libdatetime-format-pg-perl

使用方法

bash
# 基本使用,收集性能数据
pgsnap -h localhost -p 5432 -U postgres -d postgres -o /tmp/pgsnap_data

# 设置收集间隔为5分钟
pgsnap -h localhost -p 5432 -U postgres -d postgres -o /tmp/pgsnap_data -i 300

# 生成HTML报告
pgsnap --report -o /tmp/pgsnap_report /tmp/pgsnap_data

# 配置cron定期收集数据
*/5 * * * * /usr/local/bin/pgsnap -h localhost -p 5432 -U postgres -d postgres -o /var/lib/pgsnap/data

主要功能

  • 定期性能数据收集:按照指定间隔收集PostgreSQL的性能指标
  • 历史趋势分析:生成性能指标的历史趋势图,便于分析性能变化
  • HTML报告生成:生成包含各种性能指标的HTML报告
  • 支持多个数据库:可以同时监控多个PostgreSQL数据库
  • 轻量级设计:资源占用低,适合长期运行

check_postgres

check_postgres是一个用于Nagios/Icinga监控系统的PostgreSQL插件集合,包含了50多个检查项。

安装与配置

使用CPAN安装

bash
# 安装check_postgres
sudo cpanm check_postgres

# 或者从源码安装
git clone https://github.com/bucardo/check_postgres.git
cd check_postgres
cp check_postgres.pl /usr/local/nagios/libexec/

使用方法

bash
# 基本使用,检查数据库连接
check_postgres.pl --action=connection --host=localhost --port=5432 --dbname=postgres --username=postgres

# 检查复制延迟
check_postgres.pl --action=replication_lag --host=localhost --port=5432 --dbname=postgres --username=postgres

# 检查慢查询数量
check_postgres.pl --action=slow_queries --host=localhost --port=5432 --dbname=postgres --username=postgres --warning=5 --critical=10

# 检查表膨胀
check_postgres.pl --action=bloat --host=localhost --port=5432 --dbname=postgres --username=postgres

# 列出所有可用的检查项
check_postgres.pl --list

主要功能

  • 丰富的检查项:包含50多个检查项,覆盖PostgreSQL的各个方面
  • 与监控系统集成:支持Nagios、Icinga、Zabbix等监控系统
  • 灵活的配置:支持通过配置文件或命令行参数配置
  • 支持多个数据库:可以同时检查多个PostgreSQL数据库
  • 详细的帮助信息:每个检查项都有详细的帮助文档

pg_stat_monitor

pg_stat_monitor是一个增强版的pg_stat_statements扩展,提供了更详细的SQL语句执行统计信息。

安装与配置

安装扩展

bash
# 从源码编译安装
git clone https://github.com/percona/pg_stat_monitor.git
cd pg_stat_monitor
make
sudo make install

配置postgresql.conf

ini
# 加载扩展
shared_preload_libraries = 'pg_stat_monitor'

# 配置参数
pg_stat_monitor.pgsm_max = 1000  # 最多存储1000条语句
pg_stat_monitor.pgsm_query_max_len = 1024  # 查询最大长度
pg_stat_monitor.pgsm_histogram_max = 10  # 直方图桶数量
pg_stat_monitor.pgsm_track = all  # 跟踪所有语句

使用方法

sql
-- 安装扩展
CREATE EXTENSION pg_stat_monitor;

-- 查看监控数据
SELECT * FROM pg_stat_monitor;

-- 按照执行时间排序
SELECT query, calls, total_time, mean_time, rows
FROM pg_stat_monitor
ORDER BY total_time DESC
LIMIT 10;

-- 按照等待事件分组
SELECT wait_event_type, wait_event, count(*)
FROM pg_stat_monitor
GROUP BY wait_event_type, wait_event
ORDER BY count(*) DESC;

-- 重置统计信息
SELECT pg_stat_monitor_reset();

主要功能

  • 增强的统计信息:提供比pg_stat_statements更详细的统计信息,如等待事件、直方图等
  • 查询采样:支持查询采样,减少资源占用
  • 时间窗口统计:支持按时间窗口分组统计
  • 直方图支持:提供执行时间、锁等待时间等指标的直方图
  • 参数化查询支持:更好地支持参数化查询的统计

pganalyze

pganalyze是一个开源的PostgreSQL性能监控和分析平台,提供了Web界面和详细的性能报告。

安装与配置

安装Collector

bash
# 下载并安装Collector
curl -sSL https://packages.pganalyze.com/setup | bash
sudo apt-get install pganalyze-collector
# 或在RHEL/CentOS上
sudo yum install pganalyze-collector

配置Collector

yaml
# /etc/pganalyze-collector.conf
api_key: "your-api-key"
enabled_collectors: [metrics, query_stats, log, explain]

# 配置PostgreSQL实例
[[pg_instances]]
host: localhost
port: 5432
dbname: postgres
username: pganalyze
password: "secure_password"

使用方法

bash
# 启动Collector服务
sudo systemctl start pganalyze-collector
sudo systemctl enable pganalyze-collector

# 手动运行Collector,测试配置
pganalyze-collector --test --verbose

主要功能

  • Web界面:提供直观的Web界面,便于查看性能指标和报告
  • 自动分析:自动分析性能问题,如慢查询、索引问题等
  • 查询执行计划分析:自动收集和分析慢查询的执行计划
  • 日志分析:分析PostgreSQL日志,识别问题
  • 性能趋势报告:生成性能趋势报告,便于长期分析

选择适合的监控方案

选择适合的PostgreSQL监控方案需要考虑以下因素:

1. 监控需求

  • 实时监控:如果需要实时监控数据库性能,pg_top/pgtop是不错的选择
  • 日志分析:如果需要详细分析PostgreSQL日志,pgBadger是理想工具
  • 性能报告:如果需要生成定期性能报告,pgCluu或pgsnap更适合
  • 集成到现有监控系统:如果已经使用Nagios/Icinga,check_postgres是很好的补充

2. 部署规模

  • 小规模部署:对于只有几个PostgreSQL实例的环境,简单的工具如pg_top/pgtop或pgBadger就足够了
  • 大规模部署:对于大规模部署,建议使用Prometheus + Grafana或Zabbix等分布式监控系统

3. 资源占用

  • 轻量级工具:如pg_top/pgtop、check_postgres等资源占用较低,适合在生产环境长期运行
  • 重量级工具:如pgCluu、pganalyze等资源占用较高,建议根据实际情况调整收集间隔

4. 技术栈

  • 命令行工具:如果偏好命令行界面,pg_top/pgtop、pgBadger等工具更适合
  • Web界面:如果偏好Web界面,pganalyze或结合Prometheus + Grafana使用
  • 集成现有系统:如果已经使用特定的监控系统,选择与之兼容的工具

最佳实践

1. 组合使用多种工具

不同的监控工具具有不同的优势,可以组合使用以获得更全面的监控效果:

  • 使用pg_top/pgtop进行实时性能监控
  • 使用pgBadger进行日志分析
  • 使用pg_stat_monitor进行详细的查询性能分析
  • 使用Prometheus + Grafana进行长期趋势监控和可视化

2. 定期生成性能报告

定期生成性能报告,如每周或每月,便于分析长期性能趋势和识别潜在问题:

bash
# 每周日凌晨2点生成pgBadger报告
0 2 * * 0 /usr/local/bin/pgbadger -o /var/www/html/pgbadger/$(date +\%Y\%m\%d)_report.html /var/log/postgresql/postgresql-14-main.log

# 每月1日生成pgCluu报告
0 3 1 * * /usr/local/bin/pgcluu -o /var/www/html/pgcluu/$(date +\%Y\%m)_report /tmp/pgcluu_data

3. 监控工具本身的性能影响

监控工具本身也会消耗一定的资源,需要监控其对数据库性能的影响:

  • 调整收集间隔,避免过于频繁的收集
  • 对于资源占用较高的工具,考虑在非高峰时段运行
  • 监控监控工具的资源使用情况

4. 保存监控数据

保存监控数据,便于后续分析和审计:

  • 设置合理的数据保留策略
  • 定期备份监控数据
  • 考虑使用长期存储解决方案,如Prometheus的远程存储

常见问题与解决方案

1. 权限不足

问题:监控工具无法连接到PostgreSQL或无法访问某些视图

解决方案

  • 确保监控用户具有足够的权限
  • 参考各工具的文档,授予必要的权限
  • 对于pg_stat_statements等扩展,确保已正确安装和配置

2. 资源占用过高

问题:监控工具占用过多的CPU或内存资源

解决方案

  • 调整收集间隔,减少收集频率
  • 减少收集的指标数量
  • 考虑使用更轻量级的监控工具
  • 对于批处理工具,调整运行时间到非高峰时段

3. 日志格式不兼容

问题:日志分析工具无法正确解析PostgreSQL日志

解决方案

  • 确保PostgreSQL日志格式设置正确
  • 参考工具文档,调整PostgreSQL日志格式
  • 对于pgBadger,确保log_line_prefix设置正确

4. 报告生成失败

问题:性能报告生成失败

解决方案

  • 检查监控数据是否完整
  • 检查工具有无错误日志
  • 确保工具依赖的库已正确安装
  • 尝试重新生成报告

版本差异注意事项

PostgreSQL版本差异

版本监控工具兼容性
PostgreSQL 16支持最新版本的pg_stat_monitor、pgBadger等工具
PostgreSQL 14-15支持大多数监控工具,可能需要调整某些配置
PostgreSQL 10-13支持大部分监控工具,但某些新功能可能不可用
PostgreSQL 9.x支持基本的监控功能,部分高级功能可能不可用

工具版本差异

工具最新版本主要变化
pgBadger12.3支持PostgreSQL 16,增强了JSON日志格式支持
pgCluu3.2改进了报告生成,增强了监控指标
pg_stat_monitor2.0重写了核心代码,提供了更多的统计信息
check_postgres2.35.0增加了新的检查项,改进了性能

总结

PostgreSQL有丰富的开源监控工具可供选择,每个工具都有其特定的优势和适用场景。DBA可以根据自己的需求和环境选择合适的监控工具,或者组合使用多种工具以获得更全面的监控效果。

对于实时性能监控,pg_top/pgtop是不错的选择;对于日志分析,pgBadger表现出色;对于生成详细的性能报告,pgCluu和pgsnap是理想工具;对于集成到现有监控系统,check_postgres提供了丰富的检查项;对于增强的查询统计,pg_stat_monitor提供了比pg_stat_statements更详细的信息。

无论选择哪种监控方案,都需要定期审查监控策略,确保监控工具能够有效地帮助发现和解决性能问题,保障PostgreSQL数据库的稳定运行。