Skip to content

Zabbix基础

Zabbix 常用于服务器、虚拟机、网络设备、中间件、数据库和基础服务监控。它不是单独的指标采集器,而是一套把采集、存储、触发器、事件、通知、权限和 Web 控制台放在一起的监控平台。

在传统主机和基础设施较多的环境里,Zabbix 的特点比较明显:对象模型完整,平台操作集中,模板积累多,SNMP、Agent、HTTP、JMX、IPMI 等采集方式都能统一管理。Prometheus 更偏向指标采集、时序查询和云原生生态,Zabbix 更偏向"平台化监控系统"。两者不是简单替代关系,很多环境里会同时存在。

一、整体架构

Zabbix 的基础链路是:被监控对象产生数据,Agent 或其他采集方式把数据交给 Zabbix Server,Server 写入数据库,Web 前端从数据库读取配置、历史数据、事件和报表。

核心组件的分工如下:

组件作用运维时常看的位置
Zabbix Server调度采集、接收数据、计算触发器、生成事件、执行动作zabbix-server 服务、10051 端口、队列、Server 日志
Zabbix WebWeb 控制台,负责配置主机、模板、触发器、查看数据和事件Apache/PHP、/zabbix/ 入口、前端配置文件
数据库保存配置、历史值、趋势数据、事件、用户和审计记录容量、备份、连接数、慢查询、字符集
Zabbix Agent / Agent2部署在 Linux/Windows 主机上,提供系统指标和自定义 key10050 端口、Server=ServerActive=Hostname=
Zabbix Proxy分布式采集代理,适合跨机房、专线、内外网隔离环境Proxy 模式、缓存、和 Server 的同步状态

Agent2 是新一代 Agent,使用 Go 编写,插件化能力更强。新的 Linux 主机通常直接使用 Agent2,存量环境里仍然能看到传统 Agent。

二、核心对象关系

Zabbix 不是把"采集到一个值"直接叫做监控完成。平台里有一组固定对象,数据从主机进入监控项,再由触发器计算出事件。

几个核心名词:

对象含义例子
Host被监控对象,不一定是物理主机,也可以是一个数据库实例或网络设备zbx-node13
InterfaceZabbix Server 访问这个对象的入口192.168.10.13:10050
Item一个具体采集点,决定采什么、多久采一次、保存多久agent.ping
Trigger基于 Item 值计算异常状态nodata(...,1m)=1
Event触发器状态变化留下的记录Problem、Recovery
Action事件匹配条件后的处理动作发邮件、Webhook、执行脚本
Template一组可复用的 Item、Trigger、Graph、LLD 和宏Linux by Zabbix agent

Host 和 Interface 需要分开看。Host 是平台里的对象名,Interface 是采集地址。一个 Host 可以有 Agent、SNMP、JMX、IPMI 等不同接口。Linux Agent 接入时最常用的是 Agent interface,也就是 IP:10050

三、监控项和数据保存

Item 是 Zabbix 采集数据的最小单位。一个 Item 至少要说明 key、类型、更新间隔、数据类型、历史保留时间等信息。

常见 Agent key:

key含义排查价值
agent.pingAgent 是否能响应,正常返回 1判断 Agent 通信是否可用
agent.hostnameAgent 返回的主机名检查主动模式 Hostname 是否匹配
agent.versionAgent 版本排查版本差异、插件兼容
system.cpu.load系统负载判断 CPU 队列压力
vm.memory.size[available]可用内存判断内存是否接近耗尽
vfs.fs.size[/,pused]根分区使用率判断磁盘容量风险

Zabbix 保存数据时有两类常见记录:

类型说明
History原始历史值,粒度细,占用空间更大
Trends趋势数据,把一段时间内的最大、最小、平均值压缩保存

主机多、采集项多时,数据库压力通常先从 History 表和 Trends 表体现出来。磁盘增长、慢查询、Housekeeping 执行时间变长,都可能和历史数据保留周期有关。

Latest data 页面看到的是 Item 最近一次采集值。它适合判断"这台机器有没有采到数据",不适合直接替代趋势分析。比如 agent.ping=1 只能说明当前 Agent 有响应,不能说明过去半小时没有短暂抖动。

四、触发器和事件

Trigger 是把指标值转换成异常状态的规则。Zabbix 的告警不是 Item 自己产生的,而是触发器表达式计算出来的。

Agent 不可用的实验触发器可以写成:

text
nodata(/zbx-node13/agent.ping,1m)=1

这个表达式表示:zbx-node13agent.ping 在 1 分钟内没有新数据时,触发器进入 Problem 状态。

常见触发器函数:

函数含义场景
last()最近一次值服务端口状态、布尔开关
avg()一段时间平均值CPU、内存、连接数
min()一段时间最小值磁盘可用空间、可用副本数
max()一段时间最大值峰值流量、峰值连接数
nodata()一段时间没有新数据Agent 掉线、采集断流
change()当前值和上次值的变化版本变化、配置变化

触发器进入异常状态会生成 Problem 事件,恢复后会生成 Recovery 记录。排查告警时,Problems 页面里至少要看这些字段:发生时间、恢复时间、严重级别、主机、问题名、持续时间、标签和处理记录。

标签在 Zabbix 7 里很重要。告警动作、事件筛选和通知路由都可以基于标签匹配。比如实验触发器使用:

标签
scopelab
nodezbx-node13

这样在 Problems 页面里能把实验告警和模板自带告警区分开。

五、模板和自动发现

模板是一组可复用的监控配置。Linux 主机绑定 Linux by Zabbix agent 模板后,会自动得到系统监控项、触发器、图形和发现规则。

模板包含的内容:

内容作用
Items定义采集哪些指标
Triggers定义哪些值算异常
Graphs提供基础图形
Discovery rules自动发现网卡、文件系统、磁盘等对象
Macros提供阈值、路径、匹配规则等参数

LLD 是 Low-level discovery,低级自动发现。它解决的是动态对象问题。Linux 主机上的网卡、文件系统、块设备数量不固定,逐个手工创建 Item 很难维护。LLD 会先发现对象,再按原型生成监控项和触发器。

典型例子:

发现规则会发现什么生成什么
Network interface discovery网卡入流量、出流量、错误包等 Item
Mounted filesystem discovery挂载点磁盘总量、已用百分比、inode 使用率
Block devices discovery块设备读写速率、I/O 等待

模板默认阈值并不总是适合当前环境。实验机重启、测试机磁盘较小、临时节点资源紧张时,模板可能产生不少噪声。正式接入时通常通过模板宏或主机宏调整阈值,而不是直接改模板里的每个触发器。

六、主动模式和被动模式

Zabbix Agent 有两种常见采集方式:被动模式和主动模式。

模式数据方向关键配置适用场景
被动模式Server 连接 Agent 的 10050 端口拉取数据Server=Server 能直接访问 Agent
主动模式Agent 主动连接 Server 的 10051 端口上报数据ServerActive=Hostname=NAT 内侧、跨网络、Server 不方便直连 Agent

被动模式链路:

主动模式链路:

主动模式里 Hostname 很关键。Agent 上报时带的是 Hostname,它需要和平台里的 Host name 对齐。服务 active、端口正常,但 Latest data 没有主动采集数据时,Hostname 不匹配是很常见的原因。

七、实验环境

当前实验使用 Rocky Linux 9.7 和 Zabbix 7.0 LTS。

主机角色说明
192.168.10.11Zabbix Server、Zabbix Web、MariaDB、Agent2平台入口和服务端自监控
192.168.10.12Zabbix Agent2被监控 Linux 主机
192.168.10.13Zabbix Agent2被监控 Linux 主机

当前版本和端口:

对象当前值
Zabbix7.0.26
Web 入口http://192.168.10.11/zabbix/
默认账号Admin / zabbix
Server 端口10051/tcp
Agent 端口10050/tcp
数据库MariaDB

八、服务端部署

Rocky Linux 9 可以使用 Zabbix 官方仓库安装 7.0 LTS。服务端需要 Server、Web、数据库初始化脚本、SELinux 策略和本机 Agent2。

bash
# 安装 Zabbix 7.0 LTS 官方仓库,Rocky 9 对应 el9 包
rpm -Uvh https://repo.zabbix.com/zabbix/7.0/rocky/9/x86_64/zabbix-release-latest-7.0.el9.noarch.rpm

# 清理仓库缓存,避免继续使用旧元数据
dnf clean all

# 安装 Server、Web、数据库脚本、SELinux 策略和本机 Agent2
dnf install -y \
  mariadb-server \
  zabbix-server-mysql \
  zabbix-web-mysql \
  zabbix-apache-conf \
  zabbix-sql-scripts \
  zabbix-selinux-policy \
  zabbix-agent2

初始化数据库:

bash
# MariaDB 先启动,后续要导入 Zabbix 表结构
systemctl enable --now mariadb

# 实验环境使用简单密码;正式环境应换成强密码并限制账号来源
mysql -uroot <<'SQL'
CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
CREATE USER 'zabbix'@'localhost' IDENTIFIED BY 'zabbix123';
GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'localhost';
FLUSH PRIVILEGES;
SQL

# 首次导入表结构和初始数据,导入时间和机器性能、磁盘速度有关
zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz \
  | mysql --default-character-set=utf8mb4 -uzabbix -p'zabbix123' zabbix

配置 Server 连接数据库:

bash
# DBPassword 要和前面创建的 zabbix 数据库用户密码一致
sed -i 's/^# DBPassword=.*/DBPassword=zabbix123/' /etc/zabbix/zabbix_server.conf

Web 前端配置文件路径是 /etc/zabbix/web/zabbix.conf.php。这个文件不存在时,浏览器会停在安装向导;写好后刷新即可进入登录页。

php
<?php
// Zabbix Web 连接数据库和 Zabbix Server 的配置
global $DB, $HISTORY;

$DB['TYPE']     = 'MYSQL';
$DB['SERVER']   = 'localhost';
$DB['PORT']     = '0';
$DB['DATABASE'] = 'zabbix';
$DB['USER']     = 'zabbix';
$DB['PASSWORD'] = 'zabbix123';
$DB['SCHEMA']   = '';

$ZBX_SERVER      = 'localhost';
$ZBX_SERVER_PORT = '10051';
$ZBX_SERVER_NAME = 'zbx-server';

$IMAGE_FORMAT_DEFAULT = IMAGE_FORMAT_PNG;

启动服务并开放端口:

bash
# HTTP 是 Web 控制台入口,10051 是 Server,10050 是本机 Agent2
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-port=10051/tcp
firewall-cmd --permanent --add-port=10050/tcp
firewall-cmd --reload

# 允许 Apache/PHP 前端连接本机 Zabbix Server
setsebool -P httpd_can_network_connect 1

# Server、Web、PHP、数据库和本机 Agent2 一起启动
systemctl enable --now zabbix-server zabbix-agent2 httpd php-fpm mariadb

检查端口:

bash
# 80 是 Web,10051 是 Server,10050 是 Agent,3306 是数据库
ss -lntp | grep -E ':(80|10050|10051|3306)\b'

九、Agent2 接入

被监控节点安装 Agent2 即可,不需要一开始就安装所有数据库、Docker、Kubernetes 插件。

bash
# Agent 节点也使用 Zabbix 官方仓库,保证 Agent 和 Server 大版本一致
rpm -Uvh https://repo.zabbix.com/zabbix/7.0/rocky/9/x86_64/zabbix-release-latest-7.0.el9.noarch.rpm
dnf clean all

# 基础系统监控只需要 zabbix-agent2
dnf install -y zabbix-agent2

/etc/zabbix/zabbix_agent2.conf 的关键配置如下:

ini
# 允许 192.168.10.11 这台 Zabbix Server 以被动模式访问本机 Agent
Server=192.168.10.11

# 主动模式上报目标;后续使用 active checks 时会用到
ServerActive=192.168.10.11

# 主动模式下需要和 Zabbix Web 里的 Host name 对齐
Hostname=zbx-node13

# Agent2 插件配置目录,数据库、Docker 等插件会放到这里
Include=/etc/zabbix/zabbix_agent2.d/*.conf
Include=/etc/zabbix/zabbix_agent2.d/plugins.d/*.conf

启动 Agent2:

bash
# 被动模式需要 Server 能访问本机 10050
firewall-cmd --permanent --add-port=10050/tcp
firewall-cmd --reload

# 设置开机启动并立即启动 Agent2
systemctl enable --now zabbix-agent2

在 Zabbix Server 上验证 Agent:

bash
# 返回 1 表示 Server 能通过 10050 访问 Agent
zabbix_get -s 192.168.10.13 -k agent.ping

# 返回 Agent 侧主机名,用来对照平台里的 Host name
zabbix_get -s 192.168.10.13 -k system.hostname

当前实验输出:

text
1
zbx-node13

十、常见故障处理

Zabbix 接入失败时,单看服务 active 不够。Agent 进程活着,不代表 Server 能取到值;平台里有主机,不代表模板已经采集到数据。

现象常见原因处理方式
Web 还在安装向导/etc/zabbix/web/zabbix.conf.php 不存在或内容不对写入前端配置文件,确认数据库名、用户、密码和 Server 地址
Server 启动失败数据库密码错误、库未初始化、表结构缺失查看 journalctl -u zabbix-server,再用 mysql -uzabbix -p zabbix 验证连接
主机 ZBX 灰色监控项还没调度,或者新主机刚创建等一个采集周期,检查 Item 是否 enabled
主机 ZBX 红色10050 不通、Agent 配置不允许 Server、Agent 没监听在 Server 上执行 zabbix_get -s IP -k agent.ping
Latest data 没有值模板未绑定、Item disabled、Item not supported、页面过滤条件不对看主机模板、Item 状态、Latest data 的 Host 和 Name 过滤
主动模式无数据Agent Hostname= 和平台 Host name 不一致对比 /etc/zabbix/zabbix_agent2.conf 和 Zabbix Host name
触发器没产生事件表达式不成立、采集间隔没到、处于维护窗口查看 Item 最近值、Trigger 表达式、Problems 过滤范围
告警事件有了但通知没发Action 条件不匹配、用户媒介未配置、媒介类型禁用查看 Action 条件、User media、Action log

Agent 不可用时,可以按这个顺序查:

bash
# 1. Agent 服务是否运行
systemctl is-active zabbix-agent2

# 2. 本机是否监听 10050
ss -lntp | grep ':10050\b'

# 3. Agent 配置里是否允许 Server 访问
grep -E '^(Server|ServerActive|Hostname)=' /etc/zabbix/zabbix_agent2.conf

# 4. 从 Zabbix Server 侧主动取值,排除平台页面过滤问题
zabbix_get -s 192.168.10.13 -k agent.ping

这次实验里遇到过一种很容易误判的情况:Agent 服务显示 active,但配置文件异常后 10050 没有正常监听。处理时同时看服务状态、端口、配置和 zabbix_get,比只盯着 systemctl 更可靠。