外观
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 Server | 5.0+ |
| PostgreSQL | 9.6+ |
| Zabbix Agent | 5.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 install2. 配置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-agent5. 测试监控项
在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模板,也可以使用社区贡献的模板。以下是导入模板的步骤:
- 登录Zabbix Frontend
- 点击"Configuration" -> "Templates"
- 点击"Import"按钮
- 选择模板文件(可以从Zabbix官网下载或使用社区模板)
- 点击"Import"完成导入
2. 创建主机
- 点击"Configuration" -> "Hosts"
- 点击"Create host"
- 填写基本信息:
- Host name: 与Agent配置中的Hostname一致
- Visible name: 显示名称
- Groups: 选择或创建主机组(如"PostgreSQL Servers")
- 在"Interfaces"标签页添加Agent接口:
- Type: Agent
- IP address: Agent所在主机的IP
- Port: 10050
- 在"Templates"标签页链接PostgreSQL模板
- 点击"Add"完成创建
3. 配置监控项(自定义)
如果需要添加模板中没有的监控项,可以按照以下步骤配置:
- 点击"Configuration" -> "Hosts"
- 找到目标主机,点击"Items"
- 点击"Create item"
- 填写监控项信息:
- Name: 监控项名称
- Key: 与Agent配置中的UserParameter一致
- Type: Zabbix agent 或 Zabbix agent (active)
- Type of information: 根据实际情况选择
- Update interval: 更新间隔(建议1-5分钟)
- History storage period: 历史数据保存时间
- Trend storage period: 趋势数据保存时间
- 点击"Add"完成创建
4. 配置触发器
触发器用于在监控指标超过阈值时触发告警:
- 点击"Configuration" -> "Hosts"
- 找到目标主机,点击"Triggers"
- 点击"Create trigger"
- 填写触发器信息:
- Name: 触发器名称
- Expression: 触发条件(如
{pg-server-01:pg.connections.active.last()}>100) - Severity: 告警级别(Information, Warning, Average, High, Disaster)
- Description: 告警描述
- Recovery expression: 恢复条件(可选)
- 点击"Add"完成创建
5. 配置图形
图形用于可视化监控数据:
- 点击"Configuration" -> "Hosts"
- 找到目标主机,点击"Graphs"
- 点击"Create graph"
- 填写图形信息:
- Name: 图形名称
- Width/Height: 图形尺寸
- Graph type: 图形类型(Line, Stacked, Bar)
- Items: 添加需要显示的监控项
- 点击"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-agent22. 监控慢查询
配置Zabbix监控PostgreSQL慢查询:
在PostgreSQL配置文件中启用慢查询日志:
inilog_min_duration_statement = 1000 # 记录执行时间超过1秒的语句 log_statement = 'mod' log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h '在Zabbix中配置日志监控:
- 添加监控项:`log[/var/log/postgresql/postgresql-14-main
