Zabbix 监控集成
概述
Zabbix 是企业级分布式监控系统,支持主动/被动抓取、SNMP 监控、自动发现等功能。与 Prometheus 相比,Zabbix 更适合传统 IDC 环境和网络设备监控。
核心组件:
- Zabbix Server — 核心服务,处理告警、存储数据
- Zabbix Agent — 部署在目标主机,采集本地指标
- Zabbix Proxy — 分布式部署,减轻 Server 压力
- Zabbix Web — 前端界面,配置与展示
Docker Compose 一键部署
version: '3.8'
services:
zabbix-server:
image: zabbix/zabbix-server-mysql:alpine-6.4
container_name: zabbix-server
restart: unless-stopped
environment:
DB_SERVER_HOST: mysql-zabbix
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix_password
ZBX_CACHESIZE: 512M
ZBX HistoryCacheSize: 128M
ZBX_trendCacheSize: 128M
depends_on:
- mysql-zabbix
ports:
- "10051:10051"
mysql-zabbix:
image: mysql:8.0
container_name: mysql-zabbix
restart: unless-stopped
environment:
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix_password
volumes:
- mysql_data:/var/lib/mysql
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_bin
zabbix-web:
image: zabbix/zabbix-web-nginx-mysql:alpine-6.4
container_name: zabbix-web
restart: unless-stopped
environment:
DB_SERVER_HOST: mysql-zabbix
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix_password
ZBX_SERVER_HOST: zabbix-server
PHP_TZ: Asia/Shanghai
depends_on:
- mysql-zabbix
- zabbix-server
ports:
- "8080:8080"
zabbix-agent:
image: zabbix/zabbix-agent:alpine-6.4
container_name: zabbix-agent
restart: unless-stopped
environment:
ZBX_HOSTNAME: "docker-host"
ZBX_SERVER_HOST: zabbix-server
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /etc/zabbix/zabbix_agentd.d:/etc/zabbix/zabbix_agentd.d:ro
volumes:
mysql_data:
Zabbix Agent 部署(Linux)
# RHEL/CentOS
rpm -ivh https://repo.zabbix.com/zabbix/6.4/rhel/8/x86_64/zabbix-agent-6.4.0-release1.el8.x86_64.rpm
yum install -y zabbix-agent
编辑配置
sed -i 's/Server=127.0.0.1/Server=zabbix-server/' /etc/zabbix/zabbix_agentd.conf
sed -i 's/ServerActive=127.0.0.1/ServerActive=zabbix-server/' /etc/zabbix/zabbix_agentd.conf
sed -i 's/Hostname=Zabbix server/Hostname=$(hostname)/' /etc/zabbix/zabbix_agentd.conf
systemctl enable zabbix-agent --now
Zabbix Agent 部署(Windows)
# 下载 Agent
Invoke-WebRequest -Uri "https://cdn.zabbix.com/zabbix/binaries/stable/6.4.0/zabbix_agent2-6.4.0-windows-amd64.zip" -OutFile zabbix_agent2.zip
Expand-Archive zabbix_agent2.zip -DestinationPath "C:\Program Files\Zabbix Agent"
安装服务
cd "C:\Program Files\Zabbix Agent"
.& .\bin\zabbix_agent2.exe --config zabbix_agent2.conf --install
启动服务
.& .\bin\zabbix_agent2.exe --config zabbix_agent2.conf --start
主动式 vs 被动式监控
| 模式 | 说明 | 适用场景 |
|---|---|---|
| 被动式(Passive) | Server 主动向 Agent 发起请求拉取数据 | 小规模、配置简单 |
| 主动式(Active) | Agent 主动从 Server 获取监控项列表并上报 | 大规模、高并发 |
| SNMP | 通过 SNMP 协议监控网络设备 | 路由器、交换机、打印机 |
自定义监控项(UserParameter)
# /etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf
UserParameter=mysql.ping[*],mysqladmin -h"$1" -P"$2" ping | grep -c alive
UserParameter=mysql.threads[*],mysqladmin -h"$1" -P"$2" status | grep "Threads:" | awk '{print $4}'
UserParameter=mysql.questions[*],mysqladmin -h"$1" -P"$2" status | grep "Questions" | awk '{print $4}'
UserParameter=mysql.qps[*],mysqladmin -h"$1" -P"$2" extended-status | grep "Questions" | awk '{print $4}'
灵活参数(Flexible Parameter):
UserParameter=memory.free[*],awk '/^Mem:/{print $$3}'
UserParameter=disk.status[*],python3 /opt/scripts/disk_check.py $1 $2
Zabbix 监控项类型
| 类型 | 说明 | 示例 |
|---|---|---|
Zabbix agent |
被动式,Server 拉取 | vfs.fs.size[/,free] |
Zabbix agent (active) |
主动式,Agent 推送 | 自定义 Key |
SNMP agent |
SNMP v1/v2/v3 | snmp.get[ifHCInOctets.1] |
Simple check |
无 Agent,如 ping、http |
icmpping[,4] |
External check |
外部脚本执行 | external[/opt/check.sh] |
HTTP agent |
HTTP API 监控 | JSON/REST API |
告警脚本配置
# /usr/lib/zabbix/alertscripts/send_dingtalk.py
#!/usr/bin/env python3
import sys
import requests
import json
def send_message(token, content):
url = "https://oapi.dingtalk.com/robot/send"
payload = {
"msgtype": "text",
"text": {"content": f"[Zabbix Alert] {content}"},
"at": {"isAtAll": False}
}
headers = {"Content-Type": "application/json"}
params = {"access_token": token}
requests.post(url, json=payload, headers=headers, params=params)
if __name__ == "__main__":
token = sys.argv[1]
content = sys.argv[3] # {ALERT.MESSAGE}
send_message(token, content)
媒体类型配置(Web 界面):
1. 管理 → 媒介类型 → 创建媒体类型
2. 类型:脚本
3. 脚本名称:send_dingtalk.py
4. 脚本参数:{ALERT.SENDTO}, {ALERT.SUBJECT}, {ALERT.MESSAGE}
自动发现(LLD)规则
{
"data": [
{"{#FSNAME}": "/", "{#FSTYPE}": "ext4"},
{"{#FSNAME}": "/data", "{#FSTYPE}": "xfs"},
{"{#FSNAME}": "/home", "{#FSTYPE}": "ext4"}
]
}
LLD 规则配置(userparameter_linux.conf):
UserParameter=vfs.fs.discovery[*],df -hT | awk 'NR>1 {print "{\"{#FSNAME}\":\""$7"\",\"{#FSTYPE}\":\""$2"\"}"}' | paste -sd "," | sed 's/^/[/' | sed 's/$/]/'
UserParameter=vfs.fs.size[*],df -k | grep "$1" | awk '{print $3}' | tail -1
Prometheus 集成 Zabbix
通过 zabbix-sender 将 Prometheus 告警转发至 Zabbix:
# 安装 zabbix-sender
yum install -y zabbix-sender
Prometheus Alertmanager 配置
global:
resolve_timeout: 5m
route:
group_by: ['alertname']
group_wait: 10s
receiver: 'zabbix'
receivers:
- name: 'zabbix'
webhook_configs:
- url: 'http://zabbix-server:10051/traper'
send_resolved: true
zabbix-sender 推送指标:
# 推送自定义指标
zabbix_sender -z zabbix-server -s "docker-host" -k mysql.threads -o 42
从文件批量推送
zabbix_sender -z zabbix-server -i metrics.txt
性能优化
| 参数 | 默认值 | 优化建议 |
|---|---|---|
StartPollers |
5 | CPU 核心数 * 2 |
StartPollersUnreachable |
1 | 5~10 |
StartPingers |
1 | 5~10(ICMP) |
StartDiscoverers |
1 | 5(LLD) |
CacheSize |
8M | 512M~1G |
TrendCacheSize |
4M | 128M |
数据库优化:
-- 历史数据 housekeeper(保留 7 天)
UPDATE config SET histsync='7d', graphsync='7d';
DELETE FROM history WHERE clock < UNIX_TIMESTAMP(NOW() - INTERVAL 7 DAY);
OPTIMIZE TABLE history;
-- 分区表(MySQL)
ALTER TABLE history PARTITION BY RANGE (clock) (
PARTITION p2024_01 VALUES LESS THAN (UNIX_TIMESTAMP('2024-02-01')),
PARTITION p2024_02 VALUES LESS THAN (UNIX_TIMESTAMP('2024-03-01')),
...
);
常见问题
Q: Agent 无法连接 Server?
A: 检查防火墙(10050/10051 端口)、Agent 日志 tail -f /var/log/zabbix/zabbix_agentd.log,确认 Server 配置正确。
Q: 监控项显示 NOT SUPPORTED?
A: 手动执行 Key 验证:zabb_agentd -t "key[params]" 排查返回内容。
Q: 如何监控 Docker 容器?
A: 使用 zabbix-agent2 内置的 Docker 插件,或通过 zabbix-module-docker 模板自动发现容器。