Appearance
Zabbix基础
Zabbix 常用于服务器、虚拟机、网络设备、中间件、数据库和基础服务监控。它不是单独的指标采集器,而是一套把采集、存储、触发器、事件、通知、权限和 Web 控制台放在一起的监控平台。
在传统主机和基础设施较多的环境里,Zabbix 的特点比较明显:对象模型完整,平台操作集中,模板积累多,SNMP、Agent、HTTP、JMX、IPMI 等采集方式都能统一管理。Prometheus 更偏向指标采集、时序查询和云原生生态,Zabbix 更偏向"平台化监控系统"。两者不是简单替代关系,很多环境里会同时存在。
一、整体架构
Zabbix 的基础链路是:被监控对象产生数据,Agent 或其他采集方式把数据交给 Zabbix Server,Server 写入数据库,Web 前端从数据库读取配置、历史数据、事件和报表。
核心组件的分工如下:
| 组件 | 作用 | 运维时常看的位置 |
|---|---|---|
| Zabbix Server | 调度采集、接收数据、计算触发器、生成事件、执行动作 | zabbix-server 服务、10051 端口、队列、Server 日志 |
| Zabbix Web | Web 控制台,负责配置主机、模板、触发器、查看数据和事件 | Apache/PHP、/zabbix/ 入口、前端配置文件 |
| 数据库 | 保存配置、历史值、趋势数据、事件、用户和审计记录 | 容量、备份、连接数、慢查询、字符集 |
| Zabbix Agent / Agent2 | 部署在 Linux/Windows 主机上,提供系统指标和自定义 key | 10050 端口、Server=、ServerActive=、Hostname= |
| Zabbix Proxy | 分布式采集代理,适合跨机房、专线、内外网隔离环境 | Proxy 模式、缓存、和 Server 的同步状态 |
Agent2 是新一代 Agent,使用 Go 编写,插件化能力更强。新的 Linux 主机通常直接使用 Agent2,存量环境里仍然能看到传统 Agent。
二、核心对象关系
Zabbix 不是把"采集到一个值"直接叫做监控完成。平台里有一组固定对象,数据从主机进入监控项,再由触发器计算出事件。
几个核心名词:
| 对象 | 含义 | 例子 |
|---|---|---|
| Host | 被监控对象,不一定是物理主机,也可以是一个数据库实例或网络设备 | zbx-node13 |
| Interface | Zabbix 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.ping | Agent 是否能响应,正常返回 1 | 判断 Agent 通信是否可用 |
agent.hostname | Agent 返回的主机名 | 检查主动模式 Hostname 是否匹配 |
agent.version | Agent 版本 | 排查版本差异、插件兼容 |
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-node13 的 agent.ping 在 1 分钟内没有新数据时,触发器进入 Problem 状态。
常见触发器函数:
| 函数 | 含义 | 场景 |
|---|---|---|
last() | 最近一次值 | 服务端口状态、布尔开关 |
avg() | 一段时间平均值 | CPU、内存、连接数 |
min() | 一段时间最小值 | 磁盘可用空间、可用副本数 |
max() | 一段时间最大值 | 峰值流量、峰值连接数 |
nodata() | 一段时间没有新数据 | Agent 掉线、采集断流 |
change() | 当前值和上次值的变化 | 版本变化、配置变化 |
触发器进入异常状态会生成 Problem 事件,恢复后会生成 Recovery 记录。排查告警时,Problems 页面里至少要看这些字段:发生时间、恢复时间、严重级别、主机、问题名、持续时间、标签和处理记录。
标签在 Zabbix 7 里很重要。告警动作、事件筛选和通知路由都可以基于标签匹配。比如实验触发器使用:
| 标签 | 值 |
|---|---|
scope | lab |
node | zbx-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.11 | Zabbix Server、Zabbix Web、MariaDB、Agent2 | 平台入口和服务端自监控 |
192.168.10.12 | Zabbix Agent2 | 被监控 Linux 主机 |
192.168.10.13 | Zabbix Agent2 | 被监控 Linux 主机 |
当前版本和端口:
| 对象 | 当前值 |
|---|---|
| Zabbix | 7.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.confWeb 前端配置文件路径是 /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 更可靠。