外观
开源监控方案
除了主流的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_data3. 监控工具本身的性能影响
监控工具本身也会消耗一定的资源,需要监控其对数据库性能的影响:
- 调整收集间隔,避免过于频繁的收集
- 对于资源占用较高的工具,考虑在非高峰时段运行
- 监控监控工具的资源使用情况
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 | 支持基本的监控功能,部分高级功能可能不可用 |
工具版本差异
| 工具 | 最新版本 | 主要变化 |
|---|---|---|
| pgBadger | 12.3 | 支持PostgreSQL 16,增强了JSON日志格式支持 |
| pgCluu | 3.2 | 改进了报告生成,增强了监控指标 |
| pg_stat_monitor | 2.0 | 重写了核心代码,提供了更多的统计信息 |
| check_postgres | 2.35.0 | 增加了新的检查项,改进了性能 |
总结
PostgreSQL有丰富的开源监控工具可供选择,每个工具都有其特定的优势和适用场景。DBA可以根据自己的需求和环境选择合适的监控工具,或者组合使用多种工具以获得更全面的监控效果。
对于实时性能监控,pg_top/pgtop是不错的选择;对于日志分析,pgBadger表现出色;对于生成详细的性能报告,pgCluu和pgsnap是理想工具;对于集成到现有监控系统,check_postgres提供了丰富的检查项;对于增强的查询统计,pg_stat_monitor提供了比pg_stat_statements更详细的信息。
无论选择哪种监控方案,都需要定期审查监控策略,确保监控工具能够有效地帮助发现和解决性能问题,保障PostgreSQL数据库的稳定运行。
