1. 报警功能:从“监控上了”到“睡得着觉”
监控系统这东西,不上报警功能就是个摆设。很多团队最初部署Zabbix,图省事直接套模板、加主机、看几个CPU内存的图,就觉得“监控上了”。直到某天凌晨业务挂了,第二天早上才知道,才意识到报警才是监控的灵魂。
1.1 报警体系的设计思路
报警功能的核心不是“发出告警”,而是“在合适的时间、以合适的通道、通知到合适的人”。我见过不少初学者的配置方式:所有触发器全部默认,所有告警都发到同一个群里,结果每天几百条消息,全员麻木,真出事了反而没人看。这个现象叫“告警风暴”,一旦陷入,报警系统就形同虚设。
所以在配置报警前,一定要先想清楚三件事:
- 哪些指标值得报警?我的习惯是遵循“SRE黄金信号”:延迟、流量、错误、饱和度。业务层面再加一个“可用性”判断。
- 报警阈值怎么定?不能随便拍脑袋。CPU使用率可以设置85%持续5分钟触发Warning,95%持续3分钟触发High。这个“持续时长”参数非常关键,能过滤掉大量瞬时抖动。
- 通知给谁?分级别通知。Warning发给运维值班群,High发给运维负责人和研发接口人。级别越高,通知范围越小但越精准。
1.2 核心要素配置实操
Zabbix报警功能由四个要素组成:触发器(Trigger)、报警媒介(Media)、动作(Action)、通知模板。它们的关系可以类比成:触发器是“传感器”,媒介是“通讯录”,动作是“规定谁在什么条件下联系谁”,模板是“话术”。
第一步:创建触发器。在“配置 → 主机 → 触发器 → 创建触发器”中,表达式是核心。拿一个最常见的场景举例:
t值:last(/主机名/system.cpu.util[,idle])<15 持续:5m 功能:恢复表达式表达式里system.cpu.util[,idle]是Zabbix内置的CPU空闲率键值,last()函数取最新值,<15表示空闲率低于15%——也就是CPU使用率超过85%。这里有个细节很多人会漏:持续时长设置成5m,配合avg()函数使用会更稳定。更科学的写法是:
avg(/主机名/system.cpu.util[,idle],5m)<15这样是“最近5分钟的平均空闲率低于15%”,而不是“某一瞬间低于15%”,能有效规避CPU瞬时抖动造成的误报。
第二步:配置报警媒介。在“用户 → 报警媒介”里添加,类型我一般推荐邮件加钉钉/企业微信机器人双通道。邮件作为官方的、可追溯的渠道,IM作为即时触达的渠道。如果团队用的办公软件支持Webhook机器人,也可以直接走Webhook脚本。
第三步:创建动作。在“配置 → 动作 → 触发器动作”中创建。这里的关键点在于“条件”和“操作”两个维度:
- 条件:主机群组等于“生产环境”,且触发器级别大于等于Warning。
- 操作:发送消息给用户组“运维值班”,内容使用默认模板;在触发后的0、10、30、60分钟各发送一次升级通知,这是“告警升级”机制。
第四步:验证。这是最容易被跳过的环节。配置完成后,我建议做一次“拔线测试”:手动停掉一台测试机的agent,确认能收到主机不可用的告警;再用脚本压高CPU,确认性能阈值触发。只有验证过,才敢说报警可用。
1.3 报警功能踩坑实录
我在实际部署中遇到过三个高频问题,分别说一下。
第一个是时区问题。Zabbix服务器的系统时区如果不是Asia/Shanghai,触发器的时间阈值判断和告警时间显示就会混乱。别小看这个问题,告警时间是凌晨3点还是下午3点,直接影响值班人员判断。
第二个是恢复通知配置。很多人配置了“问题发生”的操作,但漏了“问题恢复”的操作。结果是半夜告警了,第二天早上处理完了,群里却没人知道已经恢复了,大家还在紧张地排查。正确做法是在动作里同时添加“恢复操作”,发送“问题已恢复”的消息。
第三个是触发器表达式里用了错误的函数。last()和avg()的语义差别巨大。判断磁盘即将写满,应该用last()看当前值;判断CPU是否持续过载,应该用avg()看趋势。搞混了就会产生大量误报或漏报。
提示:生产环境的报警阈值,建议从宽松往严格调。先保证不误报,再逐步收紧到能发现真实问题。一步到位设置很严格的阈值,大概率会被告警风暴淹没。
2. 自动发现:几十台机器,别再一台台手动加了
如果你维护的机器数量超过20台,手动添加主机和链接模板就开始变得痛苦了。超过50台,手动操作一定会出错——不是漏了链接模板,就是IP写错。Zabbix的自动发现功能就是解决这个问题的。
2.1 自动发现与自动注册的区别
先说清楚两个容易混淆的概念。Zabbix提供两种“自动”加主机的机制:
- 自动发现(Discovery):Zabbix Server主动扫描某个网段,发现存活的设备并加入监控。
- 自动注册(Auto Registration):Zabbix Agent主动向Server上报自己的存在。
自动发现适合网络设备、虚拟机、云主机等“你不知道它什么时候出现”的场景。自动注册则更适用于Agent批量部署的场景——只要agent装好了并配置了Server地址,它自己就能“报到”。
我自己的经验是:云环境优先用自动注册,因为云主机生命周期短、IP经常变动;物理机和网络设备用自动发现,因为网段固定、IP规划清晰。
2.2 自动发现实操步骤
Zabbix自动发现的核心概念是“发现规则+动作”。发现规则决定“扫什么”,动作决定“发现之后干什么”。
创建发现规则:
在“配置 → 发现 → 创建发现规则”中填写:
- 名称:例如“内网服务器网段发现”。
- IP范围:
192.168.10.1-254,支持单个IP、IP范围、掩码格式。 - 延迟(以秒为单位):我一般填
3600,即每1小时扫描一次,太频繁反而增加网络负担。 - 检查项:选择“Zabbix Agent”并填写端口
10050。对于网络设备,可以添加SNMP检查项,团体字符串填只读的public。
创建发现动作:
发现规则只负责“找到”,真正自动加主机要在“配置 → 动作 → 发现动作”里配置。两个关键点:
- 条件:比如“服务类型等于Zabbix客户端”且“发现IP属于10.0.0.0/8网段”。
- 操作:自动添加主机、链接模板(比如链接“Linux by Zabbix agent”模板)、添加到“生产环境”主机群组。
验证效果:
等一个扫描周期(或手动“立即检查”),打开“监测 → 发现”页面,可以看到发现记录。然后检查主机列表,应该已经有自动添加的主机了。
2.3 自动发现踩坑实录
自动发现的坑主要在三个地方。
第一个是不小心把网段写成了0.0.0.0/0这种大范围。曾见过有人把整个公司内网都填进去了,结果扫描了半小时,把网络设备都扫挂了。正确做法是:明确缩小到业务子网段,千万别图省事写大网段。
第二个是SNMP团体字符串写错。默认的public在大多数设备上还能用,但如果设备改了只读团体字符串,发现规则就会静默失败——不报错、不告警,就是发现不了。排查方法是先手动用snmpwalk命令测试能不能拿到数据。
第三个是动作条件没配好,导致“发现了主机但没加进监控”。常见原因是条件里写了“主机名称”约束,但新设备还没有主机名,或者主机名和预期不一致。建议动作条件尽量基于IP网段和服务类型判断,而不是主机名。
提示:自动发现适合“同质化”的主机。如果每台机器的监控需求差异很大,建议还是半自动——自动加主机,但手动选择模板。
3. 主动监控:把数据“推”给Zabbix,解放Server压力
Zabbix默认的监控模式是“被动模式”:Server主动连Agent去拉数据。这个模式在小规模下没问题,但一旦主机数量多起来、监控项密集,Server就会成为性能瓶颈。
3.1 被动模式与主动模式的本质区别
被动模式是“Server问Agent要数据”,主动模式是“Agent自己到Server取任务并上报数据”。打个比方:被动模式像食堂阿姨一个个问你要不要加饭,主动模式是大家自己拿着碗去窗口打饭。
主动模式的核心流程:Agent每间隔一段时间(默认120秒)向Server请求“我的监控项列表”,然后Agent自己采集数据,再主动推送到Server。Server只负责接收数据,不需要维护太多TCP连接,压力大幅下降。
还有一个关键优势:被动模式下Server和Agent的连接超时处理比较麻烦,一旦网络抖动就容易丢数据。主动模式把连接管理交给了Agent侧,容错性更好。
3.2 主动模式配置与批量切换
配置主动模式,只需改Agent端的zabbix_agentd.conf:
# 被动模式注释掉,避免两种模式同时使用 # Server=192.168.10.20 # 主动模式填写Server地址 ServerActive=192.168.10.20 # 主动模式的刷新间隔,推荐保持默认120秒 RefreshActiveChecks=120改完重启agent:
systemctl restart zabbix-agent在Zabbix Server前端,模板里的监控项需要把“类型”改为“Zabbix代理(主动式)”。如果是批量模板,可以在模板层面统一修改。
备份一下,最稳妥的切换方式是:在模板里复制出一份“主动模式”的模板,修改监控项类型,然后把主机链接到新模板。这样随时可以切回被动模式排查问题,不用动生产配置。
3.3 验证与常见问题
验证主动模式是否生效,看两个地方:
- Server“监测 → 最新数据”里能看到数据更新,说明数据流正常。
- “管理 → 队列”里,如果看到大量“已提交”状态的数据,说明Agent在主动推送。
常见问题有两个。
第一个是ServerActive和Server都填写了,结果两种模式混用了。这是最混乱的状态:部分监控项用被动、部分用主动,排查问题时很难定位。建议明确只用一种,或者至少保证同一台主机的监控项类型统一。
第二个是Agent端日志报错:no active checks on server. 这种一般是时间不同步问题。Zabbix对时间同步非常敏感,Agent和Server之间时间偏差超过一定范围,主动模式的鉴权和数据上报都会失败。用ntpdate或chronyc同步好时间就好。
4. 拓扑图与聚合图形:监控数据可视化,不只是为了好看
监控数据有了、报警有了,但领导或业务同事问你“现在系统状态怎么样”的时候,光看一堆数字和曲线是不够的。这时拓扑图和聚合图形就派上用场了。
4.1 拓扑图:把网络架构“画”出来
Zabbix的拓扑图功能(新版叫Network Topology)可以自动发现主机之间的连接关系并生成拓扑图。这在网络设备监控中特别好用,比如核心交换机、汇聚交换机、接入交换机之间的关系。
我自己常用的做法是“手绘+自动结合”:自动生成基础拓扑,然后手动调整布局、分组,把业务链路、依赖关系标注清楚。
拓扑图配置要点:
- “配置 → 主机 → 拓扑图”可以自动生成,位置在“监测 → 拓扑”页面。
- 拓扑图可以关联到主机、触发器状态,主机异常时拓扑图上会显示红色告警标记。
- 展示时可以按“业务系统”或“网络区域”分层,避免一张图上几百个节点乱成一团。
踩过的坑:拓扑图自动发现基于链路层的邻居协议(如LLDP/CDP),很多交换机默认没开启,或者Zabbix的SNMP权限不够,导致拓扑图只有孤零零的节点没有连线。排查时先确认交换机能通过SNMP读到lldpRemTable或cdpCacheTable。
4.2 聚合图形:在一个屏幕上掌握全局
聚合图形(Screens和Dashboards)是把多个图、多个主机的数据拼接到一个页面上。新版Zabbix里已经统一到“仪表板(Dashboard)”中。
创建聚合图形时,我的思路是“从业务视角出发”。比如一个典型的“业务服务仪表板”包含:
- 首页:业务关键QPS、成功率、平均响应时间。
- 资源视图:Web服务器群的CPU、内存、磁盘分区使用率。
- 数据库视图:连接数、慢查询数、主从延迟。
- 网络视图:入口/出口流量、丢包率、错误包。
每个视图用“图形”组件,选择“选择资源”可以跨主机、跨模板选择监控项。比如“所有Web服务器的CPU使用率对比”,在“主机”参数里选多个主机即可。
聚合图形的另一个实用功能是“问题摘要”组件,直接展示当前所有未恢复的告警。我会把告警摘要放在仪表板最顶部,方便值班人员一打开屏幕就定位问题,而不是去翻几十台主机的告警列表。
提示:聚合图形不是越多越好。我见过有人建了上百个仪表板,最后自己都找不到哪个是哪个。我的建议是:一台主机一个“基础健康”仪表板,每个业务系统一个“业务视图”仪表板,再加一个全局“作战室”仪表板,三层就够。
5. 自定义监控:标准模板覆盖不了的,自己动手做
Zabbix内置的模板能覆盖CPU、内存、磁盘、网络这些基础指标,但真实运维场景总有一些“标准模板没有”的监控需求。比如监控某个进程是否存活、某个业务接口的响应时间、某个日志文件是否出现ERROR关键字。这时候就需要自定义监控。
5.1 UserParameter:最快上手的自定义方式
Zabbix Agent的UserParameter配置允许自定义监控项,简单地说就是“Agent执行你指定的命令,把输出结果作为监控项数值”。
以监控“Nginx进程数”为例:
# 编辑 /etc/zabbix/zabbix_agentd.conf.d/nginx_process.conf UserParameter=nginx.process.num,pgrep -c nginx修改后重启agent,然后在Server端“配置 → 主机 → 监控项 → 创建监控项”里:
- 名称:Nginx进程数。
- 类型:Zabbix代理(被动式)。
- 键值:
nginx.process.num,要和配置文件里的键名完全一致。 - 信息类型:数字(无符号)。
- 更新间隔:30秒。
这样每30秒Agent就会执行pgrep -c nginx,把进程数汇报给Server。
更复杂的场景:监控某个URL的HTTP状态码。可以用zabbix_get加一段Shell脚本:
curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1/healthz | grep -E "^200$" | wc -l输出为1表示接口正常,0表示非200。
关键点:UserParameter返回的值必须是数字或可转换为数字的字符串。如果是文本内容,需要配合
zabbix[text]类型,但文本类型无法直接设置阈值,只能做展示。绝大多数自定义监控还是应该输出数值。
5.2 主动发送模式与日志监控
UserParameter是“Agent主动按周期采集”,适合周期性获取的指标。但如果某个事件不是周期性发生——比如一条日志突然报错——更合适的是“日志文件监控”。
Zabbix有专门的日志监控功能。在监控项里,类型选择“Zabbix代理(主动式)”,键值填:
log[/var/log/nginx/error.log,"ERROR",,100]表示监控/var/log/nginx/error.log中出现ERROR字符的行,最大读取100行。这样只要日志出现ERROR就会触发告警,不需要定时扫描。
实测经验:日志监控对agent的配置要求比较高,尤其是文件路径权限。agent进程和Zabbix Server运行用户不同,很容易出现“日志文件读取不到”的问题。用setfacl给agent用户授权日志目录,比直接chmod 777更安全可控。
5.3 自定义监控脚本的最佳实践
写自定义监控脚本,有三个原则值得遵守。
原则一:脚本输出必须简单明确。避免输出OK、1、0.5混合出现的格式,Zabbix解析时会出问题。建议所有脚本最后统一输出一个数字,复杂的说明信息写到日志文件里。
原则二:脚本要健壮。采集失败时要返回特殊值而不是抛异常。我通常约定-1表示数据获取失败,再配合一个触发器,当值等于-1时告警。
原则三:脚本要控制好执行时间。Agent执行脚本有超时限制(被动模式默认3秒,主动模式更短)。脚本设计为超过2秒就要优化了。复杂的数据获取,建议先在脚本侧做好缓存,再返回缓存结果。
#!/bin/bash # 获取业务API响应时间(单位:毫秒) value=$(curl -s -o /dev/null -w "%{time_total}" -m 2 http://127.0.0.1/api/health) if [ $? -ne 0 ]; then echo "-1" exit 1 fi # 保留两位小数 echo "$value * 1000" | bc | awk '{printf "%.0f", $1}'6. 常见问题与排查技巧实录
做一个Zabbix的“问题速查表”,是我这些年实际运维中的体会。从报警不触发到数据不显示,很多问题不是配置复杂,而是细节没注意。
| 现象 | 可能原因 | 排查命令/方法 |
|---|---|---|
| 监控项显示不支持 | Agent端键值不存在或拼写错误 | 在Agent端执行zabbix_get测试 |
| 报警一直不触发 | 触发器表达式持续时长设置过长,或阈值设置不合理 | 查看“监测 → 最新数据”确认数值 |
| 报警触发后通知没收到 | 用户媒介未配置或动作操作未正确指定用户组 | 检查“用户 → 报警媒介”和“动作”里的用户组 |
| 主动模式数据为空 | ServerActive地址错误或时间不同步 | 查看zabbix_agentd.conf和时间同步状态 |
| 自动发现结果为空 | IP范围、SNMP团体字符串或检查项类型错误 | 用snmpwalk测试SNMP连通性 |
| 聚合图形不显示数据 | 监控项选择错误或图形时间范围问题 | 确认监控项有数据,调整刷新时间范围 |
| 自定义监控值一直为0 | 脚本未执行成功或返回值格式不对 | 手动执行脚本看输出,检查/var/log/zabbix/zabbix_agentd.log |
| 邮件通知进垃圾箱 | 企业邮件网关对Zabbix邮件默认不信任 | 配置SPF/DKIM或使用企业自有邮件网关发送 |
接下来说几个我自己踩过、不写进文档很难发现的坑。
坑一:Zabbix Server的时间设置。Zabbix的告警时间、数据时间、触发器的“持续时长”判断,全部依赖系统时间。Server时间错了,所有数据都是乱的。建议Server和Agent统一走NTP,别省这一步。
坑二:模板里的监控项“应用”属性。新版Zabbix里叫“标签”或“标签组”。如果标签和主机群组配置不匹配,动作可能永远不生效。排查这类问题有个技巧:“配置 → 动作”里点击“测试”,能看到该主机命中动作的条件和结果。
坑三:数据采集的高水位问题。Zabbix的“历史数据保留时间”和“趋势数据保留时间”默认值可能不满足长时间对比需求。磁盘空间充足的话,建议历史数据保留30天、趋势保留365天,这样可以回溯很久之前的问题。
新手提示:真正排障的时候,优先看“监测 → 问题”和“监测 → 最新数据”,不要一头扎进配置页面。95%的问题都能通过“数据有没有”、“数据对吗”两步定位。
最后分享一个我特别推崇的工作习惯:每新增一个自定义监控项,都把当时的“业务背景、采集命令、阈值逻辑、排查入口”写到Zabbix监控项的“描述”字段里。这样几个月后团队其他人接手,看到描述就能理解这个监控到底在解决什么问题,不需要翻聊天记录或者猜。这个习惯看起来不起眼,但在人员交接、紧急排障时,比任何文档都管用。