Skip to content

PostgreSQL Zabbix监控方案

Zabbix监控架构

监控架构组成

  1. Zabbix Server

    • 负责接收和存储监控数据
    • 处理告警规则和发送告警通知
    • 管理监控模板和主机配置
  2. Zabbix Agent

    • 部署在PostgreSQL数据库服务器上
    • 收集系统和应用级监控数据
    • 执行自定义监控脚本
  3. PostgreSQL监控扩展

    • pg_stat_statements:收集SQL执行统计信息
    • pg_stat_monitor:提供更详细的查询监控
    • pg_stat_kcache:监控PostgreSQL的内核缓存使用
  4. 自定义监控脚本

    • 收集PostgreSQL特定指标
    • 执行周期性检查和分析

监控数据流

  1. Zabbix Agent通过自定义脚本连接PostgreSQL数据库
  2. 脚本执行SQL查询获取监控指标
  3. Zabbix Agent将数据发送到Zabbix Server
  4. Zabbix Server存储数据并应用告警规则
  5. 触发告警时,Zabbix Server发送通知

Zabbix Agent配置

安装Zabbix Agent

  1. 在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
  2. 配置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
  3. 启动Zabbix Agent服务

    bash
    # CentOS/RHEL系统
    systemctl enable zabbix-agent
    systemctl start zabbix-agent
    
    # Ubuntu/Debian系统
    systemctl enable zabbix-agent
    systemctl start zabbix-agent

PostgreSQL监控用户配置

创建监控专用用户

  1. 连接PostgreSQL数据库

    bash
    psql -U postgres
  2. 创建监控用户

    sql
    CREATE USER zabbix_monitor WITH PASSWORD 'zabbix_password' NOSUPERUSER NOCREATEDB NOCREATEROLE;
  3. 授予必要权限

    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;
  4. 配置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
  5. 重新加载配置

    bash
    pg_ctl reload -D /var/lib/pgsql/14/data

自定义监控脚本

创建监控脚本目录

bash
mkdir -p /etc/zabbix/scripts/postgresql
chown -R zabbix:zabbix /etc/zabbix/scripts

编写基本监控脚本

  1. 创建数据库连接配置文件

    txt
    # /etc/zabbix/scripts/postgresql/pg.conf
    PG_HOST=localhost
    PG_PORT=5432
    PG_USER=zabbix_monitor
    PG_PASSWORD=zabbix_password
    PG_DATABASE=postgres
  2. 编写基本状态监控脚本

    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
  3. 编写慢查询监控脚本

    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;"
  4. 编写复制状态监控脚本

    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
  5. 设置脚本执行权限

    bash
    chmod +x /etc/zabbix/scripts/postgresql/*.sh
    chown zabbix:zabbix /etc/zabbix/scripts/postgresql/*.sh

Zabbix监控项配置

创建Zabbix监控项配置文件

  1. 创建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');"
  2. 重启Zabbix Agent

    bash
    systemctl restart zabbix-agent
  3. 测试监控项

    bash
    # 在Zabbix Server上测试
    zabbix_get -s postgres-server-01 -k postgres.connections
    zabbix_get -s postgres-server-01 -k postgres.active_connections

Zabbix模板配置

创建PostgreSQL监控模板

  1. 登录Zabbix Web界面

    • 导航到:配置 > 模板 > 创建模板
    • 模板名称:Template PostgreSQL
    • 模板组:数据库
    • 点击:添加
  2. 创建应用集

    • 导航到:Template PostgreSQL > 应用集 > 创建应用集
    • 创建以下应用集:
      • PostgreSQL Connections
      • PostgreSQL Database
      • PostgreSQL Replication
      • PostgreSQL Slow Queries
      • PostgreSQL WAL
  3. 创建监控项

    • 导航到:Template PostgreSQL > 监控项 > 创建监控项
    • 为每个UserParameter创建监控项,例如:
      • 名称:PostgreSQL Connections
      • 类型:Zabbix Agent(主动式)
      • 键值:postgres.connections
      • 应用集:PostgreSQL Connections
      • 更新间隔:30s
      • 历史数据保留:7d
      • 趋势数据保留:30d
  4. 创建触发器

    • 导航到:Template PostgreSQL > 触发器 > 创建触发器
    • 为关键指标创建告警触发器,例如:
      • 名称:PostgreSQL连接数过高
      • 表达式:{Template PostgreSQL:postgres.connections.last()}>500
      • 严重性:警告
      • 描述:PostgreSQL数据库连接数超过500,当前值:
  5. 创建图形

    • 导航到:Template PostgreSQL > 图形 > 创建图形
    • 创建连接数、复制延迟等关键指标的图形

导入社区模板(可选)

  1. 下载社区模板

  2. 导入模板

    • 导航到:配置 > 模板 > 导入
    • 选择下载的模板文件
    • 点击:导入
  3. 调整模板

    • 根据实际环境调整监控项和触发器
    • 确保模板与自定义脚本兼容

关键监控指标

连接指标

指标名称监控项键值告警阈值严重性
总连接数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警告

告警配置

告警媒介配置

  1. 配置邮件告警

    • 导航到:管理 > 报警媒介类型 > 创建媒体类型
    • 名称:Email
    • 类型:Email
    • SMTP服务器:smtp.example.com
    • SMTP服务器端口:587
    • SMTP HELO:example.com
    • SMTP电邮:zabbix@example.com
    • 认证:用户名和密码
    • 用户名:zabbix@example.com
    • 密码:email_password
    • 点击:添加
  2. 配置微信告警(可选)

    • 使用企业微信或微信公众号配置告警
    • 参考Zabbix文档配置微信告警媒介

告警动作配置

  1. 创建告警动作
    • 导航到:配置 > 动作 > 触发器动作 > 创建动作
    • 名称: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. 配置告警升级

    • 在告警动作中,点击:升级
    • 添加升级步骤:
      • 步骤1:延迟0分钟,发送给DBAs组
      • 步骤2:延迟10分钟,发送给DBAs组和系统管理员组
      • 步骤3:延迟30分钟,发送给所有管理员
  2. 配置告警抑制

    • 导航到:配置 > 动作 > 告警抑制
    • 为相关触发器配置告警抑制规则,避免告警风暴

监控仪表盘配置

创建PostgreSQL监控仪表盘

  1. 创建仪表盘

    • 导航到:监控 > 仪表板 > 创建仪表板
    • 名称:PostgreSQL监控
    • 点击:添加
  2. 添加仪表盘部件

    • 连接数趋势图
    • 活跃连接数实时图
    • 复制延迟趋势图
    • 慢查询数量趋势图
    • 数据库大小变化图
    • WAL使用趋势图
    • 最近告警列表
    • 复制状态概览
  3. 配置仪表盘权限

    • 导航到:监控 > 仪表板 > 配置
    • 分配给DBAs用户组
    • 设置读写或只读权限

常见问题与故障处理

监控数据采集失败

  1. 问题现象

    • Zabbix Web界面显示监控项不支持或采集失败
    • Zabbix Agent日志中有错误信息
  2. 排查步骤

    • 检查Zabbix Agent服务状态
    • 测试监控脚本是否能正常执行
    • 检查PostgreSQL监控用户权限
    • 验证pg_hba.conf配置
    • 查看Zabbix Agent和PostgreSQL日志
  3. 解决方案

    • 重启Zabbix Agent服务
    • 修复监控脚本权限问题
    • 重新配置PostgreSQL监控用户权限
    • 调整pg_hba.conf允许Zabbix Agent连接

复制延迟告警

  1. 问题现象

    • Zabbix发送复制延迟超过阈值的告警
    • 从库同步状态异常
  2. 排查步骤

    • 检查主从库网络连接
    • 查看主库WAL生成速率
    • 检查从库WAL应用速率
    • 查看从库负载情况
  3. 解决方案

    • 修复网络连接问题
    • 调整主库WAL相关参数
    • 优化从库硬件资源
    • 考虑使用并行复制

连接数过高告警

  1. 问题现象

    • Zabbix发送连接数超过阈值的告警
    • 应用无法连接到数据库
  2. 排查步骤

    • 检查应用连接池配置
    • 查看pg_stat_activity中的连接状态
    • 检查是否存在连接泄漏
    • 查看慢查询导致的连接阻塞
  3. 解决方案

    • 调整应用连接池参数
    • 增加max_connections配置
    • 优化慢查询,减少连接持有时间
    • 配置连接超时参数

慢查询数量异常告警

  1. 问题现象

    • Zabbix发送慢查询数量超过阈值的告警
    • 数据库响应变慢
  2. 排查步骤

    • 查看pg_stat_statements中的慢查询
    • 分析慢查询执行计划
    • 检查索引使用情况
    • 查看系统资源使用情况
  3. 解决方案

    • 优化慢查询语句
    • 添加缺失索引
    • 调整work_mem等配置参数
    • 考虑使用查询缓存

监控维护

定期检查

  1. 每日检查

    • 查看告警历史,处理未解决告警
    • 检查监控数据完整性
    • 验证关键指标正常
  2. 每周检查

    • 分析监控趋势数据
    • 调整告警阈值和监控项
    • 备份Zabbix配置
  3. 每月检查

    • 评估监控覆盖范围
    • 更新监控模板和脚本
    • 进行监控系统性能调优

监控系统优化

  1. Zabbix Server优化

    • 调整数据库缓存和连接池
    • 优化Zabbix Server配置参数
    • 考虑使用分布式Zabbix架构
  2. 监控项优化

    • 调整监控项更新间隔,减少不必要的采集
    • 优化自定义脚本性能
    • 移除无效或冗余监控项
  3. 存储优化

    • 调整历史数据和趋势数据保留时间
    • 考虑使用压缩存储
    • 定期清理旧数据

常见问题(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官方文档的升级步骤进行升级,升级完成后验证监控数据采集和告警功能是否正常,最后调整监控模板和脚本,确保与新版本兼容。