Skip to content

Zabbix监控

Zabbix是一款功能强大的开源监控系统,支持多种监控方式和告警机制。通过Zabbix可以实现PostgreSQL数据库的全面监控,包括性能指标、资源使用、 replication状态等。本文将详细介绍如何配置Zabbix监控PostgreSQL数据库。

Zabbix架构与组件

在配置PostgreSQL监控之前,需要了解Zabbix的基本架构和组件:

  • Zabbix Server:核心组件,负责接收、处理和存储监控数据
  • Zabbix Agent:部署在被监控主机上,收集本地数据并发送给Server
  • Zabbix Proxy:用于分布式监控,减轻Server负载
  • Zabbix Frontend:Web界面,用于配置和查看监控数据
  • Zabbix Database:存储监控配置和历史数据

准备工作

1. 环境要求

组件版本要求
Zabbix Server5.0+
PostgreSQL9.6+
Zabbix Agent5.0+

2. 创建监控用户

在PostgreSQL中创建一个用于监控的只读用户:

sql
-- 创建监控用户
CREATE USER zabbix_monitor WITH PASSWORD 'secure_password' NOSUPERUSER NOCREATEDB NOCREATEROLE NOINHERIT LOGIN;

-- 授予监控所需的权限
GRANT CONNECT ON DATABASE postgres TO zabbix_monitor;
GRANT USAGE ON SCHEMA public TO zabbix_monitor;

-- 授予对pg_stat_*视图的访问权限
GRANT SELECT ON ALL TABLES IN SCHEMA pg_catalog TO zabbix_monitor;
GRANT SELECT ON ALL TABLES IN SCHEMA information_schema TO zabbix_monitor;

-- PostgreSQL 10+ 还需要授予对pg_stat_statements的访问权限
GRANT USAGE ON SCHEMA pg_stat_statements TO zabbix_monitor;
GRANT SELECT ON pg_stat_statements TO zabbix_monitor;

Zabbix Agent配置

1. 安装Zabbix Agent

安装方法

bash
# Debian/Ubuntu系统
apt-get update
apt-get install zabbix-agent

# RedHat/CentOS系统
yum install zabbix-agent

# 使用源码编译安装(可选)
wget https://cdn.zabbix.com/zabbix/sources/stable/6.0/zabbix-6.0.18.tar.gz
tar -xzf zabbix-6.0.18.tar.gz
cd zabbix-6.0.18
./configure --enable-agent
make install

2. 配置Zabbix Agent

编辑Zabbix Agent配置文件 /etc/zabbix/zabbix_agentd.conf

ini
# 基本配置
Server=zabbix-server.example.com  # Zabbix Server地址
ServerActive=zabbix-server.example.com  # 主动模式下的Server地址
Hostname=pg-server-01  # 主机名,需与Zabbix Server中配置的一致

# 启用远程命令执行(可选,用于某些高级监控)
# EnableRemoteCommands=1

# 自定义监控脚本路径
Include=/etc/zabbix/zabbix_agentd.d/*.conf  # 包含所有.conf文件

3. 创建PostgreSQL监控配置

创建自定义监控配置文件 /etc/zabbix/zabbix_agentd.d/postgresql.conf

ini
# PostgreSQL连接参数
UserParameter=pg.version,psql -h localhost -U zabbix_monitor -d postgres -t -c "SELECT version()"
UserParameter=pg.status,psql -h localhost -U zabbix_monitor -d postgres -t -c "SELECT pg_is_in_recovery()"

# 连接数监控
UserParameter=pg.connections.total,psql -h localhost -U zabbix_monitor -d postgres -t -c "SELECT count(*) FROM pg_stat_activity"
UserParameter=pg.connections.active,psql -h localhost -U zabbix_monitor -d postgres -t -c "SELECT count(*) FROM pg_stat_activity WHERE state = 'active'"
UserParameter=pg.connections.idle,psql -h localhost -U zabbix_monitor -d postgres -t -c "SELECT count(*) FROM pg_stat_activity WHERE state = 'idle'"
UserParameter=pg.connections.waiting,psql -h localhost -U zabbix_monitor -d postgres -t -c "SELECT count(*) FROM pg_stat_activity WHERE waiting = true"

# 数据库大小监控
UserParameter=pg.db.size[*],psql -h localhost -U zabbix_monitor -d postgres -t -c "SELECT pg_database_size('$1')"

# 表大小监控
UserParameter=pg.table.size[*],psql -h localhost -U zabbix_monitor -d postgres -t -c "SELECT pg_total_relation_size('$1.$2')"

# 复制状态监控(主库)
UserParameter=pg.replication.slaves,psql -h localhost -U zabbix_monitor -d postgres -t -c "SELECT count(*) FROM pg_stat_replication"
UserParameter=pg.replication.lag[*],psql -h localhost -U zabbix_monitor -d postgres -t -c "SELECT EXTRACT(EPOCH FROM (now() - pg_last_xact_replay_timestamp()))::int WHERE pg_is_in_recovery() = true"

# 性能指标监控
UserParameter=pg.stat.tup_returned,psql -h localhost -U zabbix_monitor -d postgres -t -c "SELECT sum(tup_returned) FROM pg_stat_database"
UserParameter=pg.stat.tup_fetched,psql -h localhost -U zabbix_monitor -d postgres -t -c "SELECT sum(tup_fetched) FROM pg_stat_database"
UserParameter=pg.stat.tup_inserted,psql -h localhost -U zabbix_monitor -d postgres -t -c "SELECT sum(tup_inserted) FROM pg_stat_database"
UserParameter=pg.stat.tup_updated,psql -h localhost -U zabbix_monitor -d postgres -t -c "SELECT sum(tup_updated) FROM pg_stat_database"
UserParameter=pg.stat.tup_deleted,psql -h localhost -U zabbix_monitor -d postgres -t -c "SELECT sum(tup_deleted) FROM pg_stat_database"

# 缓冲区命中率
UserParameter=pg.buffer.hitrate,psql -h localhost -U zabbix_monitor -d postgres -t -c "SELECT round((sum(blks_hit) / (sum(blks_hit) + sum(blks_read))) * 100, 2) FROM pg_stat_database"

# 慢查询数量
UserParameter=pg.slow.queries,psql -h localhost -U zabbix_monitor -d postgres -t -c "SELECT count(*) FROM pg_stat_statements WHERE mean_time > 1000"

4. 配置PGPASSWORD环境变量

为了避免在监控脚本中明文存储密码,创建一个环境变量文件:

bash
# 创建环境变量文件
cat > /etc/zabbix/zabbix_agentd.d/.pgpass << EOF
localhost:5432:postgres:zabbix_monitor:secure_password
EOF

# 设置权限
chown zabbix:zabbix /etc/zabbix/zabbix_agentd.d/.pgpass
chmod 600 /etc/zabbix/zabbix_agentd.d/.pgpass

# 修改zabbix-agent服务文件,加载环境变量
echo 'Environment="PGPASSWORD=secure_password"' >> /etc/systemd/system/zabbix-agent.service.d/environment.conf

# 重启服务
systemctl daemon-reload
systemctl restart zabbix-agent

5. 测试监控项

在Zabbix Agent主机上测试监控项是否正常工作:

bash
# 测试连接
sudo -u zabbix zabbix_get -s 127.0.0.1 -k pg.version

# 测试连接数监控
sudo -u zabbix zabbix_get -s 127.0.0.1 -k pg.connections.total

# 测试数据库大小
sudo -u zabbix zabbix_get -s 127.0.0.1 -k pg.db.size[postgres]

Zabbix Server配置

1. 导入PostgreSQL模板

Zabbix提供了官方的PostgreSQL模板,也可以使用社区贡献的模板。以下是导入模板的步骤:

  1. 登录Zabbix Frontend
  2. 点击"Configuration" -> "Templates"
  3. 点击"Import"按钮
  4. 选择模板文件(可以从Zabbix官网下载或使用社区模板)
  5. 点击"Import"完成导入

2. 创建主机

  1. 点击"Configuration" -> "Hosts"
  2. 点击"Create host"
  3. 填写基本信息:
    • Host name: 与Agent配置中的Hostname一致
    • Visible name: 显示名称
    • Groups: 选择或创建主机组(如"PostgreSQL Servers")
  4. 在"Interfaces"标签页添加Agent接口:
    • Type: Agent
    • IP address: Agent所在主机的IP
    • Port: 10050
  5. 在"Templates"标签页链接PostgreSQL模板
  6. 点击"Add"完成创建

3. 配置监控项(自定义)

如果需要添加模板中没有的监控项,可以按照以下步骤配置:

  1. 点击"Configuration" -> "Hosts"
  2. 找到目标主机,点击"Items"
  3. 点击"Create item"
  4. 填写监控项信息:
    • Name: 监控项名称
    • Key: 与Agent配置中的UserParameter一致
    • Type: Zabbix agent 或 Zabbix agent (active)
    • Type of information: 根据实际情况选择
    • Update interval: 更新间隔(建议1-5分钟)
    • History storage period: 历史数据保存时间
    • Trend storage period: 趋势数据保存时间
  5. 点击"Add"完成创建

4. 配置触发器

触发器用于在监控指标超过阈值时触发告警:

  1. 点击"Configuration" -> "Hosts"
  2. 找到目标主机,点击"Triggers"
  3. 点击"Create trigger"
  4. 填写触发器信息:
    • Name: 触发器名称
    • Expression: 触发条件(如 {pg-server-01:pg.connections.active.last()}>100
    • Severity: 告警级别(Information, Warning, Average, High, Disaster)
    • Description: 告警描述
    • Recovery expression: 恢复条件(可选)
  5. 点击"Add"完成创建

5. 配置图形

图形用于可视化监控数据:

  1. 点击"Configuration" -> "Hosts"
  2. 找到目标主机,点击"Graphs"
  3. 点击"Create graph"
  4. 填写图形信息:
    • Name: 图形名称
    • Width/Height: 图形尺寸
    • Graph type: 图形类型(Line, Stacked, Bar)
    • Items: 添加需要显示的监控项
  5. 点击"Add"完成创建

高级监控配置

1. 使用Zabbix Agent2

Zabbix Agent2是新一代的Agent,提供了更高效的监控能力和内置的PostgreSQL监控支持:

bash
# 安装Agent2
yum install zabbix-agent2 zabbix-agent2-plugin-postgresql

# 配置Agent2
cat > /etc/zabbix/zabbix_agent2.d/postgresql.conf << EOF
Plugins.PostgreSQL.ListenIP=0.0.0.0
Plugins.PostgreSQL.ListenPort=5432
Plugins.PostgreSQL.Host=localhost
Plugins.PostgreSQL.Port=5432
Plugins.PostgreSQL.User=zabbix_monitor
Plugins.PostgreSQL.Password=secure_password
Plugins.PostgreSQL.DBName=postgres
EOF

# 重启Agent2
systemctl restart zabbix-agent2

2. 监控慢查询

配置Zabbix监控PostgreSQL慢查询:

  1. 在PostgreSQL配置文件中启用慢查询日志:

    ini
    log_min_duration_statement = 1000  # 记录执行时间超过1秒的语句
    log_statement = 'mod'
    log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h '
  2. 在Zabbix中配置日志监控:

    • 添加监控项:`log[/var/log/postgresql/postgresql-14-main