Zabbix在监控告警体系中的定位与架构选型
Zabbix是一款企业级开源监控解决方案,支持网络监控、服务器状态、应用指标和日志分析等多种监控场景。在网站运维和SRE稳定性工程实践中,Zabbix的分布式架构使其能够覆盖大规模集群监控需求。与Prometheus的拉取模式不同,Zabbix支持主动和被动两种采集模式,对于NAT网络环境和跨网段部署场景适应性更强。Zabbix Server作为核心组件负责数据采集、存储和告警触发,Zabbix Proxy作为中间层实现分布式数据汇聚,Zabbix Agent部署在被监控主机上执行指标采集。
Server端部署与数据库选型
Zabbix Server后端数据库有三种选择:MySQL/MariaDB、PostgreSQL和TimescaleDB。对于监控主机超过500台的规模,推荐使用PostgreSQL加TimescaleDB方案,其时序数据写入性能优于MySQL,且支持自动分区和数据降采样。
# Zabbix Server 7.0 LTS 环境准备(Rocky Linux 9)
dnf install -y epel-release
rpm -Uvh https://repo.zabbix.com/zabbix/7.0/rhel/9/x86_64/zabbix-release-7.0-1.el9.noarch.rpm
dnf clean all
dnf install -y zabbix-server-pgsql zabbix-web-pgsql zabbix-nginx postgresql-server postgresql-contrib
# 初始化PostgreSQL
postgresql-setup --initdb
systemctl enable --now postgresql
# 创建Zabbix数据库和用户
sudo -u postgres createuser --pwprompt zabbix
sudo -u postgres createdb -O zabbix -E Unicode zabbix
# 导入Zabbix初始Schema
zcat /usr/share/zabbix-sql-scripts/postgresql/server.sql.gz | sudo -u postgres psql zabbix
# 配置Zabbix Server连接参数
cat > /etc/zabbix/zabbix_server.conf << 'EOF'
ListenPort=10051
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=Zabbix@2026
DBPort=5432
StartPollers=30
StartPollersUnreachable=10
StartTrappers=20
StartDiscoverers=5
StartHTTPPollers=10
CacheSize=256M
HistoryCacheSize=128M
HistoryIndexCacheSize=64M
TrendCacheSize=64M
ValueCacheSize=128M
Timeout=10
LogSlowQueries=3000
EOF
systemctl enable --now zabbix-server
Zabbix Proxy部署与主动代理配置
分布式监控架构中,Zabbix Proxy作为区域数据汇聚节点,减轻Server端的采集压力。Proxy定期将收集的监控数据批量发送给Server,网络中断时本地缓存数据,连接恢复后自动补传。Proxy模式适用于跨可用区、跨数据中心或被监控主机数量超过500台的场景。
# Zabbix Proxy 部署(远程节点)
dnf install -y zabbix-proxy-pgsql zabbix-agent2
# Proxy使用本地SQLite存储
dnf install -y sqlite
# 配置Proxy
cat > /etc/zabbix/zabbix_proxy.conf << 'EOF'
ProxyMode=0
Server=192.168.10.100
ServerPort=10051
Hostname=proxy-beijing
ListenPort=10051
DBName=/var/lib/zabbix/zabbix_proxy.db
ConfigFrequency=300
DataSenderFrequency=10
StartPollers=20
StartDiscoverers=5
CacheSize=64M
Timeout=10
EOF
mkdir -p /var/lib/zabbix
chown zabbix:zabbix /var/lib/zabbix
systemctl enable --now zabbix-proxy
主动模式(ProxyMode=0)下Proxy主动连接Server获取监控配置并上报数据,不需要Server反向连接Proxy,适合Proxy位于NAT后方或防火墙后的部署。被动模式(ProxyMode=1)由Server主动连接Proxy拉取数据,适用于Server需要严格控制采集时机的场景。
Agent自动注册与批量纳管
大规模集群中逐台添加主机效率极低,Zabbix的自动注册功能允许Agent启动时自动向Server注册并关联模板。结合Zabbix Agent 2的插件机制,可以自动发现容器化环境中的服务。
# Zabbix Agent 2 配置(被监控主机)
cat > /etc/zabbix/zabbix_agent2.conf << 'EOF'
Server=192.168.10.100,192.168.20.100
ServerActive=192.168.20.100:10051
# 自动注册配置
HostnameItem=system.hostname
HostMetadata=linux;web;nginx
RefreshActiveChecks=60
BufferSize=1000
Timeout=10
# Agent 2 插件配置
Plugins.System.Run=allow
Plugins.Docker.Run=allow
EOF
# Server端配置自动注册动作
# Administration -> Actions -> Auto registration -> Create action
# 条件: Host metadata contains "nginx"
# 操作: Add host, Link template "nginx by Zabbix agent"
HostMetadata字段是自动注册的关键,多个标签用分号分隔。Server端的自动注册动作根据元数据匹配规则自动关联监控模板,例如元数据包含"nginx"的主机自动关联Nginx监控模板,包含"mysql"的关联MySQL监控模板。新主机上线后60秒内完成注册并开始采集数据。
自定义监控项与告警规则
Zabbix支持通过UserParameter自定义监控项,执行任意Shell命令采集指标。对于应用层监控,可以使用Zabbix Sender主动推送数据,适合批处理任务完成率和自定义业务指标。
# 自定义监控项示例
cat >> /etc/zabbix/zabbix_agent2.d/custom.conf << 'EOF'
# Nginx连接状态
UserParameter=nginx.active, curl -s http://127.0.0.1/nginx_status | grep Active | awk '{print $3}'
UserParameter=nginx.requests, curl -s http://127.0.0.1/nginx_status | grep requests | awk '{print $3}'
UserParameter=nginx.reading, curl -s http://127.0.0.1/nginx_status | grep Reading | awk '{print $2}'
UserParameter=nginx.writing, curl -s http://127.0.0.1/nginx_status | grep Writing | awk '{print $4}'
UserParameter=nginx.waiting, curl -s http://127.0.0.1/nginx_status | grep Waiting | awk '{print $6}'
# 磁盘I/O延迟
UserParameter=disk.io.read_ms, cat /proc/diskstats | awk '/vda/ {print $7}'
UserParameter=disk.io.write_ms, cat /proc/diskstats | awk '/vda/ {print $11}'
# TCP连接数分布
UserParameter=tcp.estab, ss -s | grep TCP | awk '{print $4}' | cut -d, -f1
UserParameter=tcp.timewait, ss -ant | grep TIME-WAIT | wc -l
EOF
# 使用Zabbix Sender推送自定义指标
import subprocess, json
def send_metric(host, key, value):
cmd = f'zabbix_sender -z 192.168.10.100 -s {host} -k {key} -o {value}'
result = subprocess.run(cmd, shell=True, capture_output=True)
return result.returncode == 0
send_metric('web-01', 'business.orders_per_min', 1520)
send_metric('web-01', 'business.error_rate', '0.02')
告警模板与多渠道通知
Zabbix 7.0支持通过Webhook集成飞书、钉钉和企业微信等IM工具。告警脚本可自定义消息格式,按告警级别分级通知。
# 自定义告警脚本 - 企业微信通知
cat > /usr/lib/zabbix/alertscripts/wechat_alert.py << 'PYEOF'
#!/usr/bin/env python3
import requests, sys, json
def send_alert():
webhook = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY"
subject = sys.argv[1]
message = sys.argv[2]
payload = {
"msgtype": "markdown",
"markdown": {
"content": f"## Zabbix告警
**{subject}**
> {message}
> 时间: {__import__('datetime').datetime.now()}"
}
}
requests.post(webhook, json=payload, timeout=10)
if __name__ == '__main__':
send_alert()
PYEOF
chmod +x /usr/lib/zabbix/alertscripts/wechat_alert.py
chown zabbix:zabbix /usr/lib/zabbix/alertscripts/wechat_alert.py
在Zabbix Web界面配置Media Type为Script类型,脚本名称填写wechat_alert.py。用户配置中关联Media Type并设置告警级别过滤,Critical级别立即通知,Warning级别在工作时间段通知。告警升级机制确保未处理的告警逐级上报至更高优先级处理人。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/zabbix-fen-bu-shi-jian-kong-bu-shu-shi-zhan-zhu-dong-dai-li/