1. 环境准备与安装部署
最近在帮客户部署Zabbix 7.0监控PostgreSQL 16.6时,发现新版组合确实比老版本更稳定高效。先说说我的安装经验,这里会包含一些官方文档没提到的实用技巧。
首先需要准备两台服务器:一台跑Zabbix Server 7.0,另一台跑PostgreSQL 16.6。我建议使用AlmaLinux 8.10作为基础系统,这个发行版对Zabbix的支持特别好。下载官方提供的Zabbix Appliance镜像能省去很多麻烦,镜像里已经预装了所有必要组件。
安装时有个小坑要注意:默认网卡配置是DHCP模式,生产环境一定要改成静态IP。修改/etc/sysconfig/network-scripts/ifcfg-eth0文件时,记得把BOOTPROTO改成static,然后配上IPADDR、NETMASK这些参数。改完后别急着重启网络,先用nmcli con show检查下连接名称,有时候不一定是eth0。
中文环境配置也是个常见需求。除了安装langpacks-zh_CN包外,我建议额外执行dnf install glibc-langpack-zh,这样能确保所有中文编码都支持。改完locale后记得重启zabbix-server服务,否则Web界面可能还是显示英文。
2. Zabbix Agent2深度配置
Zabbix 7.0最大的改进之一就是Agent2的增强,特别是对PostgreSQL的监控支持。安装agent时要用这个命令:
yum install zabbix-agent2 zabbix-agent2-plugin-postgresql配置文件/etc/zabbix/zabbix_agent2.conf里有几个关键参数:
- ServerActive=192.168.24.17 # 指向Zabbix Server的IP
- Hostname=pgtest1 # 必须和Web界面里配置的主机名一致
- Plugins.PostgreSQL.ConnPoolSize=5 # 连接池大小根据监控项数量调整
实测发现PostgreSQL插件默认的5分钟采集间隔对于关键指标来说太长了。我通常会在/etc/zabbix/zabbix_agent2.d/plugins下新建一个postgresql.conf,加入:
Plugins.PostgreSQL.Timeout=30 Plugins.PostgreSQL.KeepAlive=60 Plugins.PostgreSQL.Sessions.=SELECT * FROM pg_stat_activity这样就能实时监控会话情况了。重启agent后记得用zabbix_agent2 -t pg.stat_activity测试下能否正常获取数据。
3. PostgreSQL监控模板优化
Zabbix自带的PostgreSQL模板虽然能用,但针对16.6版本还需要做些调整。在模板"PostgreSQL by Zabbix agent2"中,我通常会修改这几个地方:
宏配置:
- {$PG.USER} 改成实际的监控账号
- {$PG.PASSWORD} 设置密码
- {$PG.CONNSTRING.AGENT2} 调整为"host=127.0.0.1 dbname=postgres"
监控项新增:
- 添加WAL监控项:
pg_current_wal_lsn()和pg_wal_lsn_diff() - 复制延迟监控:
pg_stat_replication相关指标 - 锁等待监控:
pg_blocking_pids()
- 添加WAL监控项:
触发器优化:
- 将默认的30秒连接超时改为10秒
- 增加长事务告警:
{pgtest1:pg.stat_activity.max(5m)}>300 - 调整慢查询阈值:
{pgtest1:pg.stat_statements.max_time.avg(10m)}>5000
这些调整需要根据实际业务特点来定。比如金融类业务可能需要更严格的锁监控,而分析型系统则要更关注WAL增长情况。
4. 性能调优实战技巧
经过多次压测,我总结出几个提升监控效率的关键点:
数据库端优化:
-- 创建专用监控账号 CREATE ROLE zabbix_mon WITH LOGIN PASSWORD 'securepassword'; GRANT pg_monitor TO zabbix_mon; ALTER ROLE zabbix_mon SET statement_timeout = '3s'; -- 调整统计参数 ALTER SYSTEM SET track_activities = on; ALTER SYSTEM SET track_counts = on; ALTER SYSTEM SET track_io_timing = on;Zabbix Server端优化:
- 调整Housekeeper频率:把默认的1小时改为4小时
- 增加预处理工作线程:
StartPreprocessors=10 - 优化缓存大小:
CacheSize=1G(根据内存调整)
监控策略优化:
- 关键指标(如连接数、锁等待)采用1分钟间隔
- 次要指标(如表空间使用率)用5分钟间隔
- 历史数据保留策略:
- 原始数据保留7天
- 小时聚合数据保留1个月
- 日聚合数据保留1年
这套配置在我负责的几个PB级数据库上运行稳定,Zabbix Server的资源消耗能控制在5%以内。
5. 常见问题排查指南
遇到监控数据不更新时,可以按这个流程排查:
- 检查agent日志:
journalctl -u zabbix-agent2 -f --lines=50常见错误包括:
- 认证失败:检查{$PG.USER}和{$PG.PASSWORD}宏
- 连接超时:调整Plugins.PostgreSQL.Timeout
- 权限不足:确保监控账号有pg_monitor角色
- 测试插件连接:
zabbix_agent2 -t pg.version- 检查PostgreSQL日志:
SELECT * FROM pg_stat_activity WHERE application_name LIKE '%zabbix%';- 网络连通性测试:
psql -h 127.0.0.1 -U zabbix_mon -d postgres -c "SELECT 1"中文乱码问题通常是因为字体缺失,解决方法:
- 把Windows的simsun.ttc字体上传到服务器
- 复制到/usr/share/zabbix/assets/fonts/
- 修改define.inc.php中的字体配置
6. 高级监控场景实现
对于需要深度监控的场景,我推荐使用自定义LLD(Low-Level Discovery)来动态发现数据库对象。比如监控所有表的膨胀情况:
首先创建发现规则:
{ "data": [ { "{#SCHEMA}": "public", "{#TABLE}": "users" } ] }然后创建监控项原型:
SELECT n_dead_tup FROM pg_stat_user_tables WHERE schemaname='{#SCHEMA}' AND relname='{#TABLE}'再配置触发器原型:
{pgtest1:pg.stat_user_tables.n_dead_tup[{#SCHEMA},{#TABLE}].avg(5m)}>1000这样就能自动监控所有表的死元组数量了。类似的方法还可以用于监控:
- 索引使用率
- 分区表大小
- 复制槽状态
- 后台worker进程
7. 可视化与告警优化
Zabbix 7.0的仪表盘功能增强了很多,我习惯这样配置:
- 创建专属PostgreSQL仪表盘
- 添加这些核心组件:
- 连接数趋势图
- 查询响应时间热力图
- 锁等待矩阵图
- 缓冲区命中率仪表
告警策略建议分级设置:
- 紧急级(P0):数据库不可用、主从不同步
- 重要级(P1):连接数超过80%、长事务
- 警告级(P2):空间不足、缓存命中率下降
告警通知最好带上上下文信息,比如:
[P1告警] PostgreSQL连接数过高 (当前值: {ITEM.VALUE}) 受影响对象: {HOST.NAME} 触发条件: >80%最大连接数 相关指标: 活动连接: {pgtest1:pg.stat_activity.count.last()} 最大连接数: {pgtest1:pg.settings.max_connections.last()}这样的告警信息能帮运维人员快速定位问题。