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,如 pinghttp 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 模板自动发现容器。