外观
PostgreSQL Zabbix监控方案
Zabbix监控架构
监控架构组成
Zabbix Server
- 负责接收和存储监控数据
- 处理告警规则和发送告警通知
- 管理监控模板和主机配置
Zabbix Agent
- 部署在PostgreSQL数据库服务器上
- 收集系统和应用级监控数据
- 执行自定义监控脚本
PostgreSQL监控扩展
- pg_stat_statements:收集SQL执行统计信息
- pg_stat_monitor:提供更详细的查询监控
- pg_stat_kcache:监控PostgreSQL的内核缓存使用
自定义监控脚本
- 收集PostgreSQL特定指标
- 执行周期性检查和分析
监控数据流
- Zabbix Agent通过自定义脚本连接PostgreSQL数据库
- 脚本执行SQL查询获取监控指标
- Zabbix Agent将数据发送到Zabbix Server
- Zabbix Server存储数据并应用告警规则
- 触发告警时,Zabbix Server发送通知
Zabbix Agent配置
安装Zabbix Agent
在PostgreSQL服务器上安装Zabbix Agent
bash# CentOS/RHEL系统 rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/7/x86_64/zabbix-release-6.0-4.el7.noarch.rpm yum install -y zabbix-agent # Ubuntu/Debian系统 wget https://repo.zabbix.com/zabbix/6.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.0-4+ubuntu20.04_all.deb dpkg -i zabbix-release_6.0-4+ubuntu20.04_all.deb apt update apt install -y zabbix-agent配置Zabbix Agent
修改
/etc/zabbix/zabbix_agentd.conf文件:txt# 基本配置 Server=192.168.1.100 # Zabbix Server IP地址 ServerActive=192.168.1.100 Hostname=postgres-server-01 # 启用自定义脚本 EnableRemoteCommands=1 LogRemoteCommands=1 Include=/etc/zabbix/zabbix_agentd.d/*.conf启动Zabbix Agent服务
bash# CentOS/RHEL系统 systemctl enable zabbix-agent systemctl start zabbix-agent # Ubuntu/Debian系统 systemctl enable zabbix-agent systemctl start zabbix-agent
PostgreSQL监控用户配置
创建监控专用用户
连接PostgreSQL数据库
bashpsql -U postgres创建监控用户
sqlCREATE USER zabbix_monitor WITH PASSWORD 'zabbix_password' NOSUPERUSER NOCREATEDB NOCREATEROLE;授予必要权限
sql-- 授予监控视图访问权限 GRANT SELECT ON ALL TABLES IN SCHEMA pg_catalog TO zabbix_monitor; GRANT SELECT ON ALL TABLES IN SCHEMA information_schema TO zabbix_monitor; -- 授予扩展访问权限(如果使用) GRANT USAGE ON SCHEMA public TO zabbix_monitor; GRANT SELECT ON ALL TABLES IN SCHEMA public TO zabbix_monitor;配置pg_hba.conf
修改
pg_hba.conf文件,允许Zabbix Agent连接:txt# 允许本地Zabbix Agent连接 local all zabbix_monitor md5 host all zabbix_monitor 127.0.0.1/32 md5 host all zabbix_monitor ::1/128 md5重新加载配置
bashpg_ctl reload -D /var/lib/pgsql/14/data
自定义监控脚本
创建监控脚本目录
bash
mkdir -p /etc/zabbix/scripts/postgresql
chown -R zabbix:zabbix /etc/zabbix/scripts编写基本监控脚本
创建数据库连接配置文件
txt# /etc/zabbix/scripts/postgresql/pg.conf PG_HOST=localhost PG_PORT=5432 PG_USER=zabbix_monitor PG_PASSWORD=zabbix_password PG_DATABASE=postgres编写基本状态监控脚本
bash#!/bin/bash # /etc/zabbix/scripts/postgresql/pg_status.sh source /etc/zabbix/scripts/postgresql/pg.conf case $1 in connections) psql -h $PG_HOST -p $PG_PORT -U $PG_USER -d $PG_DATABASE -t -c "SELECT count(*) FROM pg_stat_activity;" ;; active_connections) psql -h $PG_HOST -p $PG_PORT -U $PG_USER -d $PG_DATABASE -t -c "SELECT count(*) FROM pg_stat_activity WHERE state = 'active';" ;; idle_connections) psql -h $PG_HOST -p $PG_PORT -U $PG_USER -d $PG_DATABASE -t -c "SELECT count(*) FROM pg_stat_activity WHERE state = 'idle';" ;; database_size) psql -h $PG_HOST -p $PG_PORT -U $PG_USER -d $PG_DATABASE -t -c "SELECT pg_database_size('$PG_DATABASE');" ;; xact_commit) psql -h $PG_HOST -p $PG_PORT -U $PG_USER -d $PG_DATABASE -t -c "SELECT sum(xact_commit) FROM pg_stat_database;" ;; xact_rollback) psql -h $PG_HOST -p $PG_PORT -U $PG_USER -d $PG_DATABASE -t -c "SELECT sum(xact_rollback) FROM pg_stat_database;" ;; *) echo "Usage: $0 {connections|active_connections|idle_connections|database_size|xact_commit|xact_rollback}" exit 1 ;; esac编写慢查询监控脚本
bash#!/bin/bash # /etc/zabbix/scripts/postgresql/pg_slow_queries.sh source /etc/zabbix/scripts/postgresql/pg.conf # 获取慢查询数量(执行时间超过1秒) psql -h $PG_HOST -p $PG_PORT -U $PG_USER -d $PG_DATABASE -t -c " SELECT count(*) FROM pg_stat_statements WHERE mean_time > 1000;"编写复制状态监控脚本
bash#!/bin/bash # /etc/zabbix/scripts/postgresql/pg_replication.sh source /etc/zabbix/scripts/postgresql/pg.conf case $1 in replication_lag) psql -h $PG_HOST -p $PG_PORT -U $PG_USER -d $PG_DATABASE -t -c " SELECT CASE WHEN pg_last_wal_receive_lsn() = pg_last_wal_replay_lsn() THEN 0 ELSE EXTRACT(EPOCH FROM now() - pg_last_xact_replay_timestamp())::integer END AS replication_lag;" ;; sync_state) psql -h $PG_HOST -p $PG_PORT -U $PG_USER -d $PG_DATABASE -t -c " SELECT sync_state FROM pg_stat_replication;" ;; replication_slots) psql -h $PG_HOST -p $PG_PORT -U $PG_USER -d $PG_DATABASE -t -c " SELECT count(*) FROM pg_replication_slots;" ;; *) echo "Usage: $0 {replication_lag|sync_state|replication_slots}" exit 1 ;; esac设置脚本执行权限
bashchmod +x /etc/zabbix/scripts/postgresql/*.sh chown zabbix:zabbix /etc/zabbix/scripts/postgresql/*.sh
Zabbix监控项配置
创建Zabbix监控项配置文件
创建UserParameter配置文件
txt# /etc/zabbix/zabbix_agentd.d/postgresql.conf # PostgreSQL基本状态监控 UserParameter=postgres.connections,/etc/zabbix/scripts/postgresql/pg_status.sh connections UserParameter=postgres.active_connections,/etc/zabbix/scripts/postgresql/pg_status.sh active_connections UserParameter=postgres.idle_connections,/etc/zabbix/scripts/postgresql/pg_status.sh idle_connections UserParameter=postgres.database_size,/etc/zabbix/scripts/postgresql/pg_status.sh database_size UserParameter=postgres.xact_commit,/etc/zabbix/scripts/postgresql/pg_status.sh xact_commit UserParameter=postgres.xact_rollback,/etc/zabbix/scripts/postgresql/pg_status.sh xact_rollback # PostgreSQL慢查询监控 UserParameter=postgres.slow_queries,/etc/zabbix/scripts/postgresql/pg_slow_queries.sh # PostgreSQL复制状态监控 UserParameter=postgres.replication_lag,/etc/zabbix/scripts/postgresql/pg_replication.sh replication_lag UserParameter=postgres.sync_state,/etc/zabbix/scripts/postgresql/pg_replication.sh sync_state UserParameter=postgres.replication_slots,/etc/zabbix/scripts/postgresql/pg_replication.sh replication_slots # PostgreSQL WAL监控 UserParameter=postgres.wal_files,/usr/bin/psql -h localhost -p 5432 -U zabbix_monitor -d postgres -t -c "SELECT count(*) FROM pg_ls_waldir();" UserParameter=postgres.wal_size,/usr/bin/psql -h localhost -p 5432 -U zabbix_monitor -d postgres -t -c "SELECT sum(size) FROM pg_ls_waldir();" # PostgreSQL表空间监控 UserParameter=postgres.tablespace.size[*],/usr/bin/psql -h localhost -p 5432 -U zabbix_monitor -d postgres -t -c "SELECT pg_tablespace_size('$1');"重启Zabbix Agent
bashsystemctl restart zabbix-agent测试监控项
bash# 在Zabbix Server上测试 zabbix_get -s postgres-server-01 -k postgres.connections zabbix_get -s postgres-server-01 -k postgres.active_connections
Zabbix模板配置
创建PostgreSQL监控模板
登录Zabbix Web界面
- 导航到:配置 > 模板 > 创建模板
- 模板名称:Template PostgreSQL
- 模板组:数据库
- 点击:添加
创建应用集
- 导航到:Template PostgreSQL > 应用集 > 创建应用集
- 创建以下应用集:
- PostgreSQL Connections
- PostgreSQL Database
- PostgreSQL Replication
- PostgreSQL Slow Queries
- PostgreSQL WAL
创建监控项
- 导航到:Template PostgreSQL > 监控项 > 创建监控项
- 为每个UserParameter创建监控项,例如:
- 名称:PostgreSQL Connections
- 类型:Zabbix Agent(主动式)
- 键值:postgres.connections
- 应用集:PostgreSQL Connections
- 更新间隔:30s
- 历史数据保留:7d
- 趋势数据保留:30d
创建触发器
- 导航到:Template PostgreSQL > 触发器 > 创建触发器
- 为关键指标创建告警触发器,例如:
- 名称:PostgreSQL连接数过高
- 表达式:{Template PostgreSQL:postgres.connections.last()}>500
- 严重性:警告
- 描述:PostgreSQL数据库连接数超过500,当前值:
创建图形
- 导航到:Template PostgreSQL > 图形 > 创建图形
- 创建连接数、复制延迟等关键指标的图形
导入社区模板(可选)
下载社区模板
- 从Zabbix共享库下载PostgreSQL模板:https://share.zabbix.com/databases/postgresql
导入模板
- 导航到:配置 > 模板 > 导入
- 选择下载的模板文件
- 点击:导入
调整模板
- 根据实际环境调整监控项和触发器
- 确保模板与自定义脚本兼容
关键监控指标
连接指标
| 指标名称 | 监控项键值 | 告警阈值 | 严重性 |
|---|---|---|---|
| 总连接数 | postgres.connections | >500 | 警告 |
| 活跃连接数 | postgres.active_connections | >100 | 警告 |
| 空闲连接数 | postgres.idle_connections | >400 | 信息 |
数据库指标
| 指标名称 | 监控项键值 | 告警阈值 | 严重性 |
|---|---|---|---|
| 数据库大小 | postgres.database_size | >100GB | 警告 |
| 事务提交数 | postgres.xact_commit | 趋势下降50% | 警告 |
| 事务回滚数 | postgres.xact_rollback | 占比>10% | 警告 |
复制指标
| 指标名称 | 监控项键值 | 告警阈值 | 严重性 |
|---|---|---|---|
| 复制延迟 | postgres.replication_lag | >60s | 警告 |
| 复制状态 | postgres.sync_state | !=sync | 严重 |
| 复制槽数量 | postgres.replication_slots | <1 | 警告 |
慢查询指标
| 指标名称 | 监控项键值 | 告警阈值 | 严重性 |
|---|---|---|---|
| 慢查询数量 | postgres.slow_queries | >10 | 警告 |
WAL指标
| 指标名称 | 监控项键值 | 告警阈值 | 严重性 |
|---|---|---|---|
| WAL文件数量 | postgres.wal_files | >1000 | 警告 |
| WAL总大小 | postgres.wal_size | >10GB | 警告 |
告警配置
告警媒介配置
配置邮件告警
- 导航到:管理 > 报警媒介类型 > 创建媒体类型
- 名称:Email
- 类型:Email
- SMTP服务器:smtp.example.com
- SMTP服务器端口:587
- SMTP HELO:example.com
- SMTP电邮:zabbix@example.com
- 认证:用户名和密码
- 用户名:zabbix@example.com
- 密码:email_password
- 点击:添加
配置微信告警(可选)
- 使用企业微信或微信公众号配置告警
- 参考Zabbix文档配置微信告警媒介
告警动作配置
- 创建告警动作
- 导航到:配置 > 动作 > 触发器动作 > 创建动作
- 名称:PostgreSQL告警通知
- 条件:触发器名称包含PostgreSQL
- 操作:
- 发送到用户组:DBAs
- 发送媒介:Email
- 主题:PostgreSQL告警:
- 消息内容:
告警主机:{HOST.NAME} 告警时间:{EVENT.DATE} {EVENT.TIME} 告警级别:{TRIGGER.SEVERITY} 告警名称:{TRIGGER.NAME} 告警状态:{TRIGGER.STATUS} 问题详情:{ITEM.NAME}: {ITEM.VALUE} 事件ID:{EVENT.ID}
- 恢复操作:
- 发送到用户组:DBAs
- 发送媒介:Email
- 主题:PostgreSQL恢复:
- 消息内容:
恢复主机:{HOST.NAME} 恢复时间:{EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME} 告警级别:{TRIGGER.SEVERITY} 告警名称:{TRIGGER.NAME} 告警状态:{TRIGGER.STATUS} 恢复详情:{ITEM.NAME}: {ITEM.VALUE} 事件ID:{EVENT.ID} 持续时间:{EVENT.DURATION}
告警升级配置
配置告警升级
- 在告警动作中,点击:升级
- 添加升级步骤:
- 步骤1:延迟0分钟,发送给DBAs组
- 步骤2:延迟10分钟,发送给DBAs组和系统管理员组
- 步骤3:延迟30分钟,发送给所有管理员
配置告警抑制
- 导航到:配置 > 动作 > 告警抑制
- 为相关触发器配置告警抑制规则,避免告警风暴
监控仪表盘配置
创建PostgreSQL监控仪表盘
创建仪表盘
- 导航到:监控 > 仪表板 > 创建仪表板
- 名称:PostgreSQL监控
- 点击:添加
添加仪表盘部件
- 连接数趋势图
- 活跃连接数实时图
- 复制延迟趋势图
- 慢查询数量趋势图
- 数据库大小变化图
- WAL使用趋势图
- 最近告警列表
- 复制状态概览
配置仪表盘权限
- 导航到:监控 > 仪表板 > 配置
- 分配给DBAs用户组
- 设置读写或只读权限
常见问题与故障处理
监控数据采集失败
问题现象
- Zabbix Web界面显示监控项不支持或采集失败
- Zabbix Agent日志中有错误信息
排查步骤
- 检查Zabbix Agent服务状态
- 测试监控脚本是否能正常执行
- 检查PostgreSQL监控用户权限
- 验证pg_hba.conf配置
- 查看Zabbix Agent和PostgreSQL日志
解决方案
- 重启Zabbix Agent服务
- 修复监控脚本权限问题
- 重新配置PostgreSQL监控用户权限
- 调整pg_hba.conf允许Zabbix Agent连接
复制延迟告警
问题现象
- Zabbix发送复制延迟超过阈值的告警
- 从库同步状态异常
排查步骤
- 检查主从库网络连接
- 查看主库WAL生成速率
- 检查从库WAL应用速率
- 查看从库负载情况
解决方案
- 修复网络连接问题
- 调整主库WAL相关参数
- 优化从库硬件资源
- 考虑使用并行复制
连接数过高告警
问题现象
- Zabbix发送连接数超过阈值的告警
- 应用无法连接到数据库
排查步骤
- 检查应用连接池配置
- 查看pg_stat_activity中的连接状态
- 检查是否存在连接泄漏
- 查看慢查询导致的连接阻塞
解决方案
- 调整应用连接池参数
- 增加max_connections配置
- 优化慢查询,减少连接持有时间
- 配置连接超时参数
慢查询数量异常告警
问题现象
- Zabbix发送慢查询数量超过阈值的告警
- 数据库响应变慢
排查步骤
- 查看pg_stat_statements中的慢查询
- 分析慢查询执行计划
- 检查索引使用情况
- 查看系统资源使用情况
解决方案
- 优化慢查询语句
- 添加缺失索引
- 调整work_mem等配置参数
- 考虑使用查询缓存
监控维护
定期检查
每日检查
- 查看告警历史,处理未解决告警
- 检查监控数据完整性
- 验证关键指标正常
每周检查
- 分析监控趋势数据
- 调整告警阈值和监控项
- 备份Zabbix配置
每月检查
- 评估监控覆盖范围
- 更新监控模板和脚本
- 进行监控系统性能调优
监控系统优化
Zabbix Server优化
- 调整数据库缓存和连接池
- 优化Zabbix Server配置参数
- 考虑使用分布式Zabbix架构
监控项优化
- 调整监控项更新间隔,减少不必要的采集
- 优化自定义脚本性能
- 移除无效或冗余监控项
存储优化
- 调整历史数据和趋势数据保留时间
- 考虑使用压缩存储
- 定期清理旧数据
常见问题(FAQ)
Q1: Zabbix Agent无法连接到PostgreSQL数据库怎么办?
A1: 首先检查PostgreSQL监控用户的权限和密码是否正确,然后检查pg_hba.conf配置是否允许Zabbix Agent连接,最后检查PostgreSQL服务是否正常运行。
Q2: 如何处理Zabbix监控数据延迟?
A2: 可以调整Zabbix Server的StartPollers和StartPollersUnreachable参数,增加并行采集进程数;也可以调整监控项的更新间隔,减少采集频率;还可以优化监控脚本,提高脚本执行效率。
Q3: 如何监控多个PostgreSQL数据库实例?
A3: 可以在每个数据库实例上部署Zabbix Agent和自定义脚本,然后在Zabbix Server上为每个实例创建主机,并关联PostgreSQL监控模板。也可以使用Zabbix Proxy分布式架构,减少Zabbix Server的负载。
Q4: 如何监控PostgreSQL表空间?
A4: 可以使用自定义脚本查询pg_tablespace_size函数,获取每个表空间的大小;也可以使用Zabbix的LLD(Low-Level Discovery)功能,自动发现和监控所有表空间。
Q5: 如何监控PostgreSQL扩展?
A5: 可以为每个扩展编写专门的监控脚本,例如监控PostGIS的空间数据使用情况,监控pg_stat_statements的查询统计信息等。然后在Zabbix中创建对应的监控项和触发器。
Q6: 如何处理Zabbix告警风暴?
A6: 可以配置告警抑制规则,避免同一问题产生多个告警;可以调整告警阈值,减少误告警;可以配置告警升级策略,避免短时间内发送大量告警;还可以优化监控项,减少不必要的告警。
Q7: 如何备份Zabbix监控配置?
A7: 可以使用Zabbix的配置导出功能,导出模板、主机、动作等配置;也可以备份Zabbix Server的数据库,保存所有配置和历史数据;还可以使用配置管理工具(如Ansible)管理Zabbix配置。
Q8: 如何升级Zabbix监控系统?
A8: 首先备份Zabbix Server数据库和配置文件,然后按照Zabbix官方文档的升级步骤进行升级,升级完成后验证监控数据采集和告警功能是否正常,最后调整监控模板和脚本,确保与新版本兼容。
