☰
SUSE 15 SP4上部署Zabbix 6.0:大规模监控底座搭建与核心调优
2026/10/21 9:00:44 网站建设 项目流程

1. 为什么这套组合适合做大规模监控底座

1.1 先别急着装,把选型逻辑想透

接手几千台服务器、网络设备、虚拟机的统一监控时,我第一反应不是去找安装包,而是先想清楚这次要解决什么问题。是因为之前 Nagios 配置太散?是告警风暴炸了?还是业务扩容后链路质量完全不可见?只有把这些痛点列出来,才谈得上选型。

Zabbix 能解决大规模 IT 基础设施实时监控的核心优势,不是某一项功能多惊艳,而是它把整条链路都做全了:采集、存储、告警、可视化、权限分级,全部在一个系统里闭环。相比 Prometheus 那套“采集器加 TSDB 再加 Grafana 拼装”的组合,Zabbix 更适合团队规模不大、想用一套系统快速覆盖“服务器、网络设备、数据库、中间件”的场景。它的 Agent 极轻量,普通服务器上跑一个 agent2 进程占用可以忽略;模板生态也完整,Linux、Windows、SNMP、JMX、IPMI 都有现成模板,落地速度很快。

还有一个现实因素:现网里大量基础设施还是传统企业级 Linux,不是云原生那一套。Zabbix 对这种环境的适应性最成熟,尤其是网络设备通过 SNMP 采集、跨机房通过 Proxy 缓冲数据这些场景,几乎是按需设计的。

1.2 SUSE Linux 15 SP4 作为底座的价值

很多人问,监控服务器用什么系统不行,为什么我从众多选择中在 SUSE Linux 15 SP4 上搭?因为监控 Server 本身也可能是被监控对象,它有企业级补丁周期、统一内核、稳定的 glibc 和 PHP 运行环境,这在生产环境里很重要。社区发行版可能包版本很新,但升级跨度大,跑 Zabbix Server 这种“长期常驻 + 数据库读写密集”的业务,稳定性比新特性更重要。

SUSE 15 SP4 对 Zabbix 的官方支持也很完整。Zabbix 官方仓库直接提供 SLES 15 的 rpm 包,依赖关系由 zypper 自动处理,不需要自己编译。它的默认防火墙和 AppArmor 机制在安装后需要顺手确认,但这不算坑,熟悉之后反而比裸奔更安心。这套组合的另一个好处是:如果你以后要纳管大量 SUSE 服务器,统一装同一个系列的 Agent 和工具链,运维成本会低很多。

2. SUSE 15 SP4 上安装 Zabbix 6.0 的完整步骤

2.1 安装前准备与仓库配置

我这边以 Zabbix 6.0 LTS 为例,它是当前生产环境最稳妥的版本。7.0 的参数逻辑差别不大,但如果你要求铁打的稳定性,6.0 的官方支持和资料积累更充分。

先把系统环境做一次检查:

cat /etc/os-release zypper lr date systemctl status sshd

确认系统版本、软件源、时间同步都正常后,添加 Zabbix 官方软件源。这一步注意架构选 x86_64,如果你的服务器是 ARM 或别的架构,需要换对应仓库地址。

rpm -Uvh https://repo.zabbix.com/zabbix/6.0/sles/15/x86_64/zabbix-release-6.0-4.sles15.noarch.rpm zypper clean -a zypper refresh

官方源的 rpm 会把 gpg key 一起装上,refresh 时如果提示 key 不匹配,千万别用--no-gpg-checks跳过,那等于给自己埋雷。校验 key 指纹是安装环节最容易忽略却最影响安全的动作。

2.2 安装 Server、Web 和 Agent 组件

仓库就绪后,执行安装:

zypper install zabbix-server-mysql zabbix-web-mysql zabbix-agent2 zabbix-sql-scripts

这套组合包含 Zabbix Server、Web 前端、Agent2 和导入数据库的 SQL 脚本。需要注意的是 SUSE 官方仓库的包依赖会把 PHP-FPM、Apache 等前端组件一起拉进来,装完不要急着重启一堆服务,先把数据库准备好。

数据库我直接用系统自带的 MariaDB,SUSE 15 SP4 默认带的版本足够 Zabbix 6.0 使用。如果环境里已经有 MySQL 或者想用 PostgreSQL,原理一样,但我个人更推荐 MariaDB,它和 Zabbix 的兼容测试最完善,运维资料也最多。

zypper install mariadb mariadb-client systemctl enable --now mariadb mysql_secure_installation

初始化数据库的建库、建用户、授权、导表四步,建议手工操作一遍,别图省事把所有权限都开给 zabbix 用户。

CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; CREATE USER 'zabbix'@'localhost' IDENTIFIED BY '你的强密码'; GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'localhost';

导入 Zabbix 6.0 自带的数据表结构:

zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql --default-character-set=utf8mb4 -uzabbix -p'你的强密码' zabbix

这里有个经验:导入过程如果报ERROR 1418或者函数相关错误,十有八九是 MySQL 版本和 SQL 脚本不匹配,先检查/etc/my.cnf里的log_bin_trust_function_creators。生产环境直接加log_bin_trust_function_creators = 1再重启数据库,导入完成后可以关掉。

2.3 配置 zabbix_server.conf 与 Web 前端

Zabbix Server 的主配置文件是/etc/zabbix/zabbix_server.conf,我只改三处,其余先用默认值:

DBHost=127.0.0.1 DBName=zabbix DBUser=zabbix DBPassword=你的强密码

注意DBHost这里我建议写127.0.0.1而不是localhost。在大多数发行版上,localhost会让客户端尝试走 unix socket,而 Zabbix Server 默认可能连的是 TCP,两边不一致会出现“数据库连接成功但 Web 前端一切正常、Server 却不停重试”的怪问题。直接用 TCP 地址最省心。

启动服务前,还要处理 PHP-FPM 的时区配置。SUSE 包装完 Zabbix Web 后,PHP-FPM 池配置文件通常在/etc/zabbix/php-fpm.conf,打开后设置:

; 取消注释并改为你的时区 php_value[date.timezone] = Asia/Shanghai

然后启动并设置开机自启:

systemctl enable --now zabbix-server zabbix-agent2 systemctl restart php-fpm

浏览器访问http://你服务器的IP/zabbix,按向导填数据库地址、端口、用户密码,最后一步会写入/etc/zabbix/web/zabbix.conf.php。只要前面数据库步骤没出错,这步一定是一遍过。之后用默认账号Admin登录,强制要求改密码,建议第一件事改掉。

2.4 安装时的三个常见前置坑

第一个坑是防火墙。SUSE 15 SP4 默认启用 firewalld,Zabbix Server 至少需要放行 10051 端口(Agent 主动提交数据、Proxy 回传数据都用它),Web 前端需要放行 80 或 443,被动检查还需要从 Server 访问 Agent 的 10050 端口,但这取决于你监控哪些机器,落在被监控端放行。

firewall-cmd --permanent --add-port=10051/tcp firewall-cmd --permanent --add-service=http firewall-cmd --reload

第二个坑是 AppArmor。SUSE 默认对好多服务有 AppArmor profile,如果发现 Zabbix Server 或者 PHP-FPM 启动异常、进程起来又立刻退,先查:

journalctl -u zabbix-server -n 50 ausearch -m avc -ts recent

看到 apparmor 拦截字样,再决定是加规则还是禁用对应 profile,不要凭感觉把 AppArmor 整个关掉。

第三个坑是时间同步。Zabbix 对时间极其敏感,Server、Proxy、Agent 三层时间差太大会导致“数据已到但时间戳不对”“告警不触发”“历史数据查询空白”这类诡异问题。务必先在监控 Server 上确认 chrony 在跑:

systemctl enable --now chronyd chronyc sources

3. 大规模场景下 Zabbix 核心参数与数据库调优

3.1 zabbix_server.conf 关键参数如何定值

小规模安装用默认参数没问题,但目标如果是大规模 IT 基础设施,默认值完全不够。Zabbix Server 的进程模型是按类型拆分的,不像单线程服务那样一个参数管所有,调优的核心是“让每种工作都有足够的进程,但又不至于让上下文切换吃掉 CPU”。

我的调整思路供参考:

StartPollers=40 StartPollersUnreachable=8 StartPingers=8 StartTrappers=16 StartDBSyncers=8 HistoryCacheSize=128M TrendCacheSize=128M ValueCacheSize=64M CacheSize=512M Timeout=4 UnreachablePeriod=30

StartPollers是处理被动检查的进程数。被动检查每次都要建立一次 TCP 连接,所以在监控项数量大时,这个值要重点看。我这里 3000 多台主机、十几万监控项,40 个 poller 比较合理。但注意,不是越多越好,太多进程并发连数据库,数据库会先扛不住。

StartPingers是单独跑 ICMP 检查的进程,和 poller 不在同一个池子里。如果你监控的网络设备多,或者用 icmpping 做连通性探测,需要单独调它。我见过不少朋友只调 StartPollers,不调 StartPingers,结果 ping 类监控项排队严重。

StartDBSyncers负责把内存里攒下的历史数据批量写入数据库。它默认只有 4,写入压力大的时候会是隐藏瓶颈。我调到 8 之后,数据库的写吞吐明显改善。注意这个值调大的同时,MySQL 端的max_connections也要保留余量,因为每个 syncer 都会占用连接。

CacheSize是配置缓存,存的是主机、监控项、触发器之类元数据。监控项一旦超过十万,512M 是我推荐的下限。怎么看它够不够?启动 Zabbix Server 后,用zabbix_server -R diaginfo,然后去/var/log/zabbix/zabbix_server.log里看 cache usage 段落,如果 used 和 total 接近,就该加了。

3.2 数据库层的真正瓶颈

Zabbix 大规模性能的瓶颈往往不在 Server,而在数据库。很多部署前期很顺,跑了几百台后突然开始队列积压,一看数据库,缓冲区小得可怜。

MariaDB 的配置文件在/etc/my.cnf.d/下面,我习惯单独建一个zabbix.cnf:

[mysqld] innodb_buffer_pool_size = 8G innodb_log_file_size = 1G innodb_flush_log_at_trx_commit = 2 innodb_flush_method = O_DIRECT max_connections = 500

innodb_buffer_pool_size是 InnoDB 的缓冲池,这个值给到物理内存的 50% 到 70% 都没问题。如果总内存 16G,我给 8G;如果 32G,我给 16G。缓冲池太小,Zabbix 查历史数据、写趋势表全走磁盘,IO 延迟直接放大。

innodb_flush_log_at_trx_commit默认 1,安全性最高但写盘频繁。Zabbix 这类监控系统允许在极端宕机情况下丢失秒级数据,设置成 2 可以减少每次提交的磁盘同步,性能提升非常明显。对监控数据来说,损失一秒以内的数据完全可接受。

innodb_flush_method = O_DIRECT是让 InnoDB 直接读写,不走操作系统 page cache 双重缓存,能降低内存占用和 IO 延迟。这个对那种“数据库内存明明很大,但仍然慢”的情况很有效。

Zabbix 6.0 自带的时间序列存储优化是 TimescaleDB,但那是 PostgreSQL 方向。如果你坚持用 MariaDB,就要接受一个现实:历史数据量会持续增长,必须靠保留策略和分区来控制。我的建议是把 History 保留设到 30 天以内,Trend 保留 365 天。趋势表本身已经做了聚合,不需要保留远超一年的历史明细,否则数据库只会越来越重。

3.3 队列延迟和内部监控项

调优不是拍脑袋调完就完,必须有数据反馈。Zabbix 自带的Zabbix Server health模板一定要给 Zabbix Server 自己挂上,里面包含进程忙、队列、缓存使用等内部监控项。我最常盯的一个 key 是zabbix[queue],它表示有多少数据在等待被采集、延迟多少秒。

在 Web 前端“最新数据”里查看zabbix[queue],如果持续超过 60 秒,说明采集或入库跟不上。这时再去分辨是哪一层:看 poller 忙率,如果 poller 忙率高,加 StartPollers;如果 poller 忙率不高但队列还积压,多半是数据库写太慢,重点调数据库或 StartDBSyncers。

4. 用 Proxy、主动式 Agent 和自动注册支撑跨机房监控

4.1 什么时候必须引入 Zabbix Proxy

所有监控数据都回传总部 Server,跨机房专线带宽有限,一旦链路抖动,整个监控就瘫痪。这种场景必须用 Zabbix Proxy,它是部署在边缘机房的采集代理,负责本机房的 Agent 数据,缓冲后定期回传总部。

Proxy 带来的好处不是省一台 Server 硬件,而是把故障域切开了。总部 Server 挂了,边缘机房的 Proxy 还在继续采集;链路断开,数据先落在 Proxy 本地缓存,链路恢复后再回传。对监控系统来说,这比“总部 Server 集中采集”可靠得多。

Proxy 配置很简单,安装zabbix-proxy-mysql或zabbix-proxy-sqlite3后改/etc/zabbix/zabbix_proxy.conf:

Server=zabbix.example.com Hostname=proxy-beijing-01 DBName=/var/lib/zabbix/zabbix_proxy.sqlite

Server写总部 Zabbix Server 的地址和端口,Hostname是 Proxy 在 Server 端注册的名字,必须和 Web 前端“添加代理”填的名字完全一致。否则 Server 端看不到这条 Proxy,就算数据过去也会被丢弃。

单 Proxy 覆盖的主机数不用贪多,我自己的经验是 1000 到 2000 台主机以内都稳定。超过 2000 台或者监控项特别密集,就考虑再拆 Proxy,或者给 Proxy 也用 MySQL 存储并单独调优。

4.2 Agent 主动模式是被动模式的补充

默认的被动模式是 Server 主动连 Agent,这种方式在大规模跨网段环境里很麻烦:Server 要能路由到所有 Agent,防火墙要放行一大堆入方向端口,而且每个监控项采集时都要建立连接。如果被监控主机数量上千,光 accept 连接就能把 Server 拖垮。

主动模式反过来,Agent 按照配置的周期主动去 Server 拉取检查列表,然后带着结果回来。配置方式:

ServerActive=zabbix.example.com:10051 Hostname=db-server-01

注意这里的Hostname必须和 Web 前端里主机的名称完全一致,否则主动检查不会生效。我在前端里会看到这个经典错误:主机显示“无法获取主动检查”,日志里是no active checks on server。这几乎都是名称不匹配。

主动模式对跨公网、NAT、防火墙策略严格的环境非常友好。它只需要 Agent 能访问 Server 的 10051 端口,不需要 Server 反向访问 Agent。对于大规模集群,我倾向于主动模式作为默认,再保留被动模式给少数安全策略允许的环境。

4.3 自动注册和 LLD 让规模化接入不失控

几百台机器手工添加,一天能搞定;几千台再手工添加就是灾难。Zabbix 的自动注册机制就是为了这个场景。

在 Agent 配置里加:

ServerActive=zabbix.example.com:10051 HostMetadataItem=system.uname

然后在 Web 前端“配置 -> 动作 -> 自动注册”里创建规则,根据 Host metadata 给不同业务匹配不同模板。metadata 这一步非常关键,别全省略。如果自动注册不过滤 metadata,任何能连到你 Server 的机器都会注册进来,轻则模板乱套,重则一个人误填配置把你的监控冲垮。

LLD 低级别自动发现则是省心的另一个利器。Linux by Zabbix agent 模板默认会做文件系统和网络接口的自动发现,新加的磁盘、新绑的网卡不用人工干预,自动挂上监控项。这在大规模服务器批量扩容时,价值是实打实的。

5. 调优效果验证与高频故障排查实录

5.1 怎么判断调优真有效果

调完参数,不能看一眼前端觉得“好像快了”就算结束。我验证的顺序是先看采集延迟,再看数据库压力,最后看告警响应。

第一步,用zabbix_get直接对 Agent 发一次实时采集:

zabbix_get -s 192.0.2.10 -k agent.ping zabbix_get -s 192.0.2.10 -k system.cpu.load[all,avg1]

如果手动采集秒回,但 Web 前端数据还是有延迟,问题出在 Server 处理环节而不是 Agent。

第二步,看zabbix[queue]和缓存使用。zabbix_server -R diaginfo的信息很关键,重点看 Configuration cache usage、History cache usage。如果历史缓存长期高于 80%,说明 HistoryCacheSize 偏小;如果配置缓存长期高于 80%,说明 CacheSize 要加。

第三步,看数据库。用mysqladmin status或者SHOW GLOBAL STATUS LIKE 'Threads_running'。Threads_running 持续超过几十,就要回头调max_connections和 Server 的并发进程数。

5.2 高频问题:数据库连接耗尽

大规模接入后最频繁的故障,是某天数据库连接突然被打满。现象是 Zabbix Server 日志出现cannot connect to database,但数据库其实还活着。

原因通常不是 max_connections 设小了,是某个阶段有大量历史数据要写,Zabbix Server 的 DB 进程全在等锁或等待 IO。我在生产环境遇到过一次,调整步骤是:

先看SHOW PROCESSLIST,确认是不是一堆Waiting for table level lock。如果是,说明有慢查询占着表,优先找慢查询,而不是盲目加连接数。Zabbix 的 history 表没有合理分区、保留期过长是最常见的慢查询根源。

然后调大innodb_buffer_pool_size,给缓存腾空间。同时把 Zabbix 的HousekeepingFrequency调低一点,避免清理历史数据和业务采集高峰期重合。我见过有人把HousekeeperFrequency设成 1 小时,数据库在整点的时候疯狂删数据,直接导致告警延迟,这个要避开。

5.3 高频问题:监控项变 unsupported

机器明明在线,但监控项变成“不支持”,这也是大规模环境里最常见的一类。通常不是数据没采到,是 Agent 端 key 执行失败。

排查方法就一句话:到 Agent 机器上手动执行一次 key,看返回什么。

zabbix_agent2 -t system.cpu.load[all,avg1] zabbix_agent2 -t custom.script.diskspace

如果返回Unsupported item key,说明 key 写错、参数不对,或者模板和 Agent 版本不匹配。如果手动执行能返回数据,但前端还是 unsupported,重点看 Agent 的日志,尤其是自定义脚本类的 key,十有八九是权限、路径、AppArmor 三者之一的问题。

SUSE 上还容易遇到一个特殊问题:自定义脚本放在 /usr/local/bin,AppArmor 对某些目录的执行权限管得严。先把脚本放到 /opt 或 /usr/local/lib/zabbix 下面测试,再决定是不是要调整 AppArmor 规则。

5.4 高频问题:Proxy 离线或数据缺失

Proxy 在 Web 前端显示灰色,第一件事是看 Proxy 自身日志/var/log/zabbix/zabbix_proxy.log。最常见的错误是cannot connect to server,说明 Proxy 到 Server 的 10051 端口不通,检查两件事:Server 端防火墙有没有放行 10051;Proxy 的Server配置有没有写对端口。

如果 Proxy 日志正常,但前端部分主机数据缺失,先确认这些主机是不是确实挂在 Proxy 下面。前端“配置 -> 主机”里要看主机属的代理字段,不是 Agent 配置里写了ServerActive=proxy就自动生效,必须在 Server 前端把主机分配给对应 Proxy。

还有一个隐藏坑:Proxy 和 Server 之间的时钟偏差。即使只差十几秒,数据采集成功,但时间戳和 Server 判断延迟的基准不一致,会出现“有数据但监控项仍报无数据”。跨机房部署前,把每台机器的时间同步都做好,尤其是 Proxy。

5.5 高频问题:Web 前端报数据库错误

浏览器打开 Zabbix 页面报Database error,先别怀疑数据库挂了。我遇到过的原因有两个。

第一是 PHP-FPM 连数据库的 socket 不对。Zabbix Web 的数据库配置在/etc/zabbix/web/zabbix.conf.php,里面$DB['SERVER']如果写localhost,而 PHP-FPM 环境的 socket 路径和 MariaDB 实际 socket 路径不一致,前端就是连不上。统一改成127.0.0.1最简单。

第二是权限问题。有时能登录数据库命令行,但 PHP-FPM 的进程用户没有访问 MariaDB socket 的权限。这种情况下,日志里会有一句权限拒绝,顺着/var/log/php-fpm.log和/var/log/mariadb/mariadb.log能找到线索。处理方式是在 MySQL 里给对应用户授权时确认 host 匹配,以及确认 socket 目录权限不是 700。

6. 一些个人体会和最后提醒

6.1 我踩过最不值当的几个坑

这套环境我前后搭过三次,印象最深的坑都和“想当然”有关。

第一次是装完 Web 向导,管理员密码改完,发现所有被动检查都超时。排查半天,是 SUSE 防火墙只放行了 10051,忘了在总部 Server 到 Agent 这条路径上放行 10050。被动模式下,是 Server 主动连 Agent,方向反了。

第二次是数据量上来后,history 表膨胀极快,磁盘报警。我原本想着 30 天历史明细已经够用,结果某业务要求保留 90 天明细,我又没有提前做分区,数据库在凌晨的清理任务直接把 IO 打满。后来我把保留策略改回分表,按天分区,定期删除旧分区,数据库才稳定下来。提前设计分区是必须的,不是可选项。

第三次是 Proxy 配置时,Hostname 大小写不一致。前端填了Proxy-Beijing-01,配置文件里写proxy-beijing-01,Server 端不停报 Proxy 名称相同但无法匹配。这个错误不报红,就是默默丢数据,非常难发现。

6.2 给新手的节奏建议

如果你之前没搭过大规模 Zabbix,我强烈建议不要一上来就照着大厂参数堆。先搭一台 Server,接几十台测试主机,用默认参数跑两天,把前端操作和模板摸透。然后逐步加压,每调整一个参数就用zabbix[queue]和内部监控项观察一小时,再决定下一步。

Zabbix 的调优没有万能配方,真正的能力是能判断瓶颈在哪一层。CPU 满了加进程没用,数据库满了加 poller 只会更糟。先观察,再做最小变更,再验证,这套流程比任何数组参数都重要。

还有一个建议是在大规模接入前,把监控项的命名、模板命名、告警等级统一。不要在业务访问量上来后才去整理,到时候几千个监控项散在各处,告警风暴会让你连真正的问题都看不见。规范是监控体系里最不值钱但又最救命的部分。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询