1. 为什么这套监控组合值得花时间搭
监控这件事,很多团队都是等到出事了才想起来补。我见过太多这样的情况:服务器磁盘满了没人知道,某个服务进程半夜挂了第二天才发现,集群扩容之后新节点压根没纳入监控。这些问题归根结底不是技术难,而是监控体系没有搭好。
这套方案的核心思路是用Zabbix作为监控底座,配合基础模板快速覆盖常见指标,通过自动发现机制解决集群节点动态变化的问题,最后用自定义监控脚本补齐业务层面的个性化指标。四个环节环环相扣,缺一个都会让监控体系出现盲区。
具体来说,这套方案解决的是这样几个问题:第一,基础资源监控(CPU、内存、磁盘、网络)用现成模板一键覆盖,不用重复造轮子;第二,集群环境下节点IP经常变动,手动添加主机不现实,自动发现注册能让新节点上线后自动纳入监控;第三,业务层面的指标(比如某个队列积压数、某个接口的响应时间)没有现成模板,需要自己写脚本采集。
适合谁来参考?如果你手里管着几台到几十台服务器,正在用或者打算用 Zabbix 做监控,尤其是集群环境下的监控,这套流程可以直接抄作业。如果你是完全没接触过 Zabbix 的新手,建议先把基础概念过一遍再来看,不然有些操作会卡住。
下面我按实际部署的顺序来拆,从服务端安装到最终的自定义脚本上线,每一步都附上我踩过的坑和实测有效的配置。
2. 部署前的规划与选型决策
2.1 版本选择与组件拆分逻辑
Zabbix 的版本迭代比较快,选版本这件事我的建议是:生产环境用偶数版本的最新稳定版。比如 6.0、6.4 这种,奇数版本(6.1、6.3)是开发版,不适合上生产。截至目前,6.0 LTS 和 6.4 是比较稳妥的选择,6.0 的支持周期更长,6.4 的功能更新一些。
组件拆分上,小规模环境(50台以内)可以把 Server、Web、Database 装在一台机器上,省事。但一旦超过这个量级,或者对可用性有要求,就必须拆开:
| 组件 | 作用 | 拆分建议 |
|---|---|---|
| Zabbix Server | 核心引擎,处理数据采集和告警 | 独立部署,配置要高 |
| Zabbix Web | 前端界面 | 可以和 Server 同机 |
| Database | 存储配置和历史数据 | 独立部署,IO 要快 |
| Zabbix Proxy | 分布式采集代理 | 跨机房场景必用 |
我自己的环境是 Server 和 Web 放一起,数据库单独一台,因为数据库的 IO 压力最大,混在一起容易互相影响。
2.2 数据库选型的实际考量
Zabbix 支持 MySQL 和 PostgreSQL,官方推荐 PostgreSQL。但说实话,如果你团队更熟悉 MySQL,用 MySQL 也完全没问题,性能差距在实际场景中没那么明显。关键点在于数据库的参数调优,这个比选哪个数据库更重要。
以 MySQL 为例,几个必须调的参数:
innodb_buffer_pool_size = 物理内存的 60%-70% innodb_log_file_size = 256M innodb_flush_log_at_trx_commit = 2 innodb_file_per_table = 1innodb_buffer_pool_size是最关键的,它决定了多少数据能缓存在内存里。Zabbix 的历史数据写入非常频繁,这个值太小会导致大量磁盘 IO。我见过一个案例,buffer pool 只给了 128M,结果数据库 CPU 常年 80% 以上,调到 8G 之后直接降到 10%。
注意:
innodb_flush_log_at_trx_commit设为 2 会牺牲一点持久性(断电可能丢最近1秒的数据),但监控数据丢几秒无所谓,换来的是写入性能大幅提升。
2.3 网络与端口规划
部署前把端口理清楚,能省掉后面很多排查时间:
- 10051:Zabbix Server 监听端口,Agent 主动上报和 Proxy 通信都走这个
- 10050:Zabbix Agent 监听端口,Server 主动拉取数据时用
- 80/443:Web 界面
- 3306/5432:数据库端口
防火墙规则要提前放行。我踩过的坑是:Server 能连 Agent 的 10050,但 Agent 主动上报到 Server 的 10051 没放行,导致主动模式的主机一直显示不可用,排查了半天才发现是防火墙问题。
3. Zabbix 服务端的完整部署过程
3.1 系统环境准备与依赖安装
我以主流的 Linux 发行版为例,用包管理方式安装最省事。先装仓库配置包:
# 下载并安装 Zabbix 官方仓库 rpm -Uvh https://repo.zabbix.com/zabbix/6.4/rhel/8/x86_64/zabbix-release-6.4-1.el8.noarch.rpm dnf clean all然后安装 Server、Web、Agent 和数据库:
dnf install -y zabbix-server-mysql zabbix-web-mysql zabbix-nginx-conf zabbix-sql-scripts zabbix-selinux-policy zabbix-agent mysql-server这里有个细节:zabbix-sql-scripts 包含了建表的 SQL 文件,后面初始化数据库要用到,别漏装。
3.2 数据库初始化与导入
启动数据库并创建 Zabbix 专用库和用户:
CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; CREATE USER 'zabbix'@'localhost' IDENTIFIED BY '你的强密码'; GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'localhost'; SET GLOBAL log_bin_trust_function_creators = 1; FLUSH PRIVILEGES;log_bin_trust_function_creators = 1这个必须开,否则导入 SQL 时会因为创建函数报错。导入数据:
zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql -uzabbix -p zabbix导入完成后记得把log_bin_trust_function_creators关掉,这是个安全实践。
实操心得:导入过程视机器性能可能要几分钟到十几分钟,别以为卡死了就中断。我见过有人等了两分钟以为挂了,Ctrl+C 之后重新导入,结果表结构冲突,只能删库重来。
3.3 Server 配置与 Web 前端调优
编辑/etc/zabbix/zabbix_server.conf,核心是数据库连接信息:
DBHost=localhost DBName=zabbix DBUser=zabbix DBPassword=你的强密码Web 前端的 PHP 配置在/etc/php-fpm.d/zabbix.conf,重点是时区:
php_value[date.timezone] = Asia/Shanghai时区不设对,Web 界面上的时间全是 UTC,看告警时间会很别扭。
启动所有服务并设置开机自启:
systemctl restart zabbix-server zabbix-agent nginx php-fpm systemctl enable zabbix-server zabbix-agent nginx php-fpm浏览器访问 Web 界面,按向导走完初始化,默认账号是 Admin,密码 zabbix。第一件事就是改密码,这个不用多说。
4. 基础模板的配置与优化
4.1 内置模板的选用策略
Zabbix 自带了一堆模板,但不要无脑全用。我的原则是:只启用真正需要的监控项,监控项太多会导致数据量爆炸,数据库压力大,而且告警噪音多。
常用的几个模板:
- Linux by Zabbix agent:Linux 主机的基础监控,CPU、内存、磁盘、网络、进程都有
- Windows by Zabbix agent:Windows 主机对应模板
- MySQL by Zabbix agent 2:MySQL 数据库监控
- Nginx by Zabbix agent:Nginx 状态监控
以 Linux 模板为例,它默认采集的指标有几十个,但有些你可能根本不关心。比如Number of logged in users(登录用户数),这个指标对大多数场景没意义,可以在模板里禁用掉对应的监控项。
4.2 模板的克隆与定制
直接改内置模板不是好习惯,因为升级时会覆盖。正确做法是克隆一份再改:
- 在「配置」→「模板」里找到目标模板
- 点击「克隆」
- 改个名字,比如
Linux by Zabbix agent - 定制版 - 在克隆版上做增删改
这样升级 Zabbix 时,内置模板更新了,你的定制版不受影响,需要的话再手动合并新特性。
4.3 监控项与触发器的调优
默认的触发器阈值不一定适合你的环境。比如磁盘空间告警,默认是剩余 20% 和 10% 两档,但如果你有台机器专门存日志,磁盘用到 90% 是常态,这个阈值就会天天告警。
调整方法:在模板的「触发器」里找到对应项,修改表达式。比如把磁盘告警改成剩余 5% 才告警:
last(/Linux by Zabbix agent - 定制版/vfs.fs.size[/,pfree])<5注意:改触发器阈值前,先观察一段时间默认阈值的告警情况,看看哪些是噪音,再针对性调整。一上来就大改,容易把真正该告警的也改没了。
另外,监控项的历史数据保留时间也要调。默认是 90 天,但像 CPU 这种高频采集的指标,90 天数据量很大。我的做法是:核心指标保留 90 天,次要指标保留 30 天,趋势数据统一保留 365 天。趋势数据是每小时聚合的,占用空间小,适合做长期分析。
5. 自动发现与集群 IP 注册的实现
5.1 自动发现的两种模式对比
Zabbix 的自动发现分两种:网络发现和主动式自动注册。这两个概念容易混,我一开始也搞错过。
| 模式 | 工作原理 | 适用场景 |
|---|---|---|
| 网络发现 | Server 扫描指定 IP 段,发现存活主机 | 首次批量纳管,IP 段固定 |
| 自动注册 | Agent 主动上报自己的信息,Server 按规则纳管 | 集群动态扩容,IP 不固定 |
集群环境下,节点 IP 经常变,用网络发现就得不停改扫描范围,不现实。自动注册才是正解:Agent 启动后主动告诉 Server「我来了,我的 IP 是 X,我的主机名是 Y」,Server 根据预设规则自动把它加到对应主机组并关联模板。
5.2 自动注册的配置步骤
第一步:Agent 端配置
编辑/etc/zabbix/zabbix_agentd.conf:
Server=你的ServerIP ServerActive=你的ServerIP Hostname=节点唯一标识 HostMetadata=linux-cluster-node关键是HostMetadata,这是 Agent 上报给 Server 的元数据,Server 靠它来匹配注册规则。可以写多个值,用逗号分隔。
第二步:Server 端创建动作
在 Web 界面「配置」→「动作」→「自动注册」里创建动作:
- 条件:
Host metadata包含linux-cluster-node - 操作:添加主机、添加到主机组「集群节点」、关联模板「Linux by Zabbix agent - 定制版」
这样新节点上线后,Agent 一启动,Server 就自动把它纳管了。
第三步:验证注册结果
在「监测」→「主机」里看新节点有没有出现。如果没有,检查几个点:
- Agent 的
ServerActive是否指向正确的 Server IP - Server 的 10051 端口是否对 Agent 开放
- 动作的条件是否匹配上了(可以在「报表」→「动作日志」里看)
实操心得:
HostMetadata的值不要用中文,也不要有空格,否则匹配容易出问题。我习惯用角色-环境的格式,比如web-prod、db-prod,这样一台 Server 可以按角色分发不同模板。
5.3 集群场景下的主机命名规范
自动注册有个坑:如果主机名重复,后注册的会覆盖先注册的。集群扩容时,如果新节点用了和旧节点一样的主机名,就会出问题。
我的做法是用「角色-序号-环境」的命名规范,比如web-01-prod、web-02-prod。Agent 的Hostname参数就设成这个值,保证全局唯一。
如果节点是容器化的,每次重建 IP 和主机名都变,那就得用容器的唯一 ID 作为主机名,或者在启动脚本里动态生成。这个场景比较复杂,后面自定义脚本那节会提到怎么配合。
6. 自定义监控脚本的编写与集成
6.1 什么场景需要自定义脚本
内置模板覆盖的是通用指标,但业务层面的指标它管不了。举几个我实际遇到过的需求:
- 某个消息队列的积压消息数
- 某个接口的 P99 响应时间
- 某个定时任务上次执行是否成功
- 某个目录下的文件数量
这些指标没有现成的采集方式,必须自己写脚本。
6.2 脚本编写规范与 UserParameter
Zabbix 采集自定义指标靠的是UserParameter。在 Agent 配置文件里加一行:
UserParameter=queue.backlog[*],/etc/zabbix/scripts/check_queue.sh $1这行的意思是:定义一个叫queue.backlog的监控项,后面跟参数,实际执行/etc/zabbix/scripts/check_queue.sh并把参数传进去。
脚本本身要遵守几个规范:
- 输出必须是单个数值,或者符合 Zabbix 格式的字符串
- 执行时间要短,超过 Agent 的
Timeout(默认3秒)会被杀掉 - 要有错误处理,采集失败时返回一个明确的错误值,而不是空
一个检查队列积压的脚本示例:
#!/bin/bash QUEUE_NAME=$1 BACKLOG=$(some_command_to_get_backlog "$QUEUE_NAME" 2>/dev/null) if [ -z "$BACKLOG" ]; then echo "ZBX_NOTSUPPORTED" exit 1 fi echo "$BACKLOG"ZBX_NOTSUPPORTED是 Zabbix 约定的错误标识,返回这个值,监控项会显示为「不支持」,而不是采集到一个错误的 0。
6.3 脚本的测试与调试方法
脚本写完别急着往模板里加,先在命令行测试:
# 直接跑脚本 /etc/zabbix/scripts/check_queue.sh myqueue # 用 zabbix_get 模拟 Server 拉取 zabbix_get -s 127.0.0.1 -k "queue.backlog[myqueue]"zabbix_get这个工具特别有用,它能模拟 Server 向 Agent 发请求,验证 UserParameter 配置是否正确。如果命令行跑脚本正常,但zabbix_get报错,那问题就在 Agent 配置上,通常是权限或者路径问题。
注意:Agent 是以
zabbix用户运行的,脚本和它依赖的命令必须对这个用户可执行。我踩过的坑是脚本用了某个只有 root 能跑的命令,命令行测试用 root 跑没问题,Agent 一采集就失败。解决办法是用 sudo 配置免密,或者把脚本改成不依赖特权命令。
6.4 自定义监控项的模板化
脚本调通之后,把它做成模板,方便批量应用:
- 在模板里新建监控项,类型选「Zabbix 客户端」
- Key 填
queue.backlog[{$QUEUE_NAME}] {$QUEUE_NAME}是宏,可以在主机级别覆盖
用宏的好处是:同一个模板应用到不同主机,每台主机可以设不同的队列名,不用改模板。
再配上触发器和图形,一个完整的自定义监控就成型了。触发器比如积压超过 1000 告警:
last(/Template Queue Monitor/queue.backlog[{$QUEUE_NAME}])>10007. 常见问题排查与避坑经验
7.1 主机显示不可用的排查思路
这是最常见的问题,排查顺序我总结成一张表:
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 主动模式不可用 | Server 10051 未放行 | telnet ServerIP 10051 |
| 被动模式不可用 | Agent 10050 未放行 | telnet AgentIP 10050 |
| 主机名不匹配 | Agent Hostname 与配置不一致 | 检查 agentd.conf |
| 采集超时 | 脚本执行太慢 | 看 Agent 日志 |
Agent 日志在/var/log/zabbix/zabbix_agentd.log,Server 日志在/var/log/zabbix/zabbix_server.log,出问题先看日志,90% 的问题日志里都有线索。
7.2 自动注册不生效的几种情况
自动注册配好了但新节点没进来,我遇到过这几种原因:
- HostMetadata 没设或设错:Agent 配置里漏了这一行,或者值和动作条件对不上
- 动作没启用:创建完动作忘了点启用,这个很低级但真的容易忘
- 主机已存在:同名主机已经手动加过了,自动注册不会重复添加
- Server 的自动注册进程没跑:
zabbix_server的 autoregistration 进程数设为 0 了
排查的时候,去「报表」→「动作日志」看,如果动作触发了但操作失败,日志里会写原因。
7.3 数据库性能瓶颈的识别与处理
Zabbix 跑一段时间后变慢,多半是数据库的问题。几个关键信号:
- Web 界面打开慢,尤其是历史数据页面
- Server 日志里出现
query is too slow警告 - 数据库 CPU 持续高位
处理手段按优先级:
- 调大 innodb_buffer_pool_size,这是收益最明显的
- 清理历史数据,把不重要的监控项保留时间调短
- 开启数据库分区,Zabbix 自带分区脚本,按时间分区后查询和清理都快很多
- 拆分数据库,把 history 和 trends 分到不同表空间
我自己的经验是,50 台主机、500 个监控项的环境,buffer pool 给 8G,历史数据保留 30 天,跑起来很轻松。超过这个规模,分区就得上。
7.4 自定义脚本的常见坑
最后集中说几个自定义脚本的坑:
- 脚本输出带换行或空格:Zabbix 对输出格式敏感,
echo出来的值前后有空格会导致解析失败,用echo -n或者printf - 脚本依赖的环境变量:Agent 运行时的环境变量和登录 shell 不一样,脚本里最好用绝对路径
- 脚本执行权限:别忘了
chmod +x,而且属主要对 - 超时设置:复杂脚本要调大 Agent 的
Timeout,但别调太大,会拖累整体采集
这套监控体系搭好之后,日常维护其实很省心。新节点上线自动纳管,业务指标有脚本兜底,告警阈值按环境调优。真正花时间的是一次性把基础打牢,后面就是享受自动化带来的便利了。