资讯动态

Zabbix + Grafana 自建监控系统实战:从部署到告警调优

发布时间:2026/10/14 13:45:39 来源:尧图企业网站定制
1. 为什么我要自己搭一套监控系统事情得从去年说起。当时手上有三台云主机跑着几个内部服务平时靠 SSH 上去top、df -h看状态。结果有天凌晨一台机器磁盘写满服务直接挂了第二天早上才发现。那次之后我就下定决心必须上一套正经的监控。市面上的方案不少云厂商自带的基础监控、各种 SaaS 化的可观测平台用起来确实省事。但我有几个很实际的考虑一是数据要留在自己手里二是想怎么改面板就怎么改三是成本可控——一台 2 核 4G 的云主机就能扛住中小规模的监控负载。所以最终选了Zabbix Grafana这个经典组合。Zabbix 负责采集和告警Grafana 负责把数据画成好看的图。这套组合的好处是Zabbix 的采集能力极其扎实支持 Agent、SNMP、IPMI、JMX 等一大堆协议告警逻辑成熟Grafana 的展示能力则是天花板级别面板灵活、插件丰富。两者通过 Zabbix 的 API 数据源对接各司其职。这篇文章我会把整套搭建过程完整写下来包括环境准备、Zabbix Server 和 Agent 的部署、数据库选型、Grafana 对接、告警配置以及我踩过的那些坑。适合有一定 Linux 基础、想自己动手搭监控的运维同学或后端开发。全程命令可直接复制参数我会解释清楚为什么这么设。2. 整体架构设计与选型思路2.1 这套系统到底由哪些组件构成先把架构讲清楚不然后面装到一半容易懵。整套系统跑起来涉及这几个角色Zabbix Server核心大脑负责接收 Agent 上报的数据、执行触发器判断、发送告警。Zabbix Web前端界面用 PHP 写的跑在 Web 服务器上用来配置主机、查看数据。数据库存所有配置和采集到的历史数据Zabbix 对数据库依赖很重。Zabbix Agent装在被监控主机上负责采集本机指标并推送给 Server。Grafana独立的可视化平台通过 Zabbix 数据源插件读取数据并绘图。它们之间的关系可以这样理解Agent 是传感器Server 是大脑数据库是记忆Web 是操作台Grafana 是仪表盘。传感器把数据给大脑大脑存进记忆操作台用来调教大脑仪表盘把记忆里的数据画出来。2.2 为什么数据库我最终选了 MySQL 而不是 PostgreSQLZabbix 官方对 MySQL 和 PostgreSQL 都支持得很好早期版本甚至 MySQL 是默认推荐。我选 MySQL 的原因很朴素生态熟悉、备份恢复工具链成熟、网上排错资料多。对于中小规模几十台主机以内MySQL 完全够用。但这里有个关键点必须说Zabbix 的数据库表会随着监控项数量爆炸式增长。历史数据表history、history_uint、trends这些如果不管几个月就能撑到几十 GB。所以我在建库阶段就规划好了分区和清理策略后面会详细讲。PostgreSQL 的优势在于复杂查询和并发写入场景下表现更稳如果你的监控规模上千台可以考虑。但对我这种规模MySQL 8.0 的 InnoDB 完全扛得住。2.3 版本选择为什么不用最新版写这篇文章时 Zabbix 已经出到 7.x但我用的是Zabbix 6.0 LTS。原因很简单LTS长期支持版本有 5 年支持周期bug 少、文档全、社区踩坑记录多。生产环境追新是给自己找麻烦除非新版本有你必须要的特性。Grafana 我用的是 10.x 系列同样避开刚发布的大版本。操作系统选Ubuntu 22.04 LTS软件源里的包版本比较新装 PHP 8.1、MySQL 8.0 都很顺。2.4 服务器规格与网络规划我用的是一台 2 核 4G、40G 系统盘的云主机作为监控服务器单独挂了一块 100G 的数据盘给数据库用。这个配置能撑住大约 50 台主机、每台 30 个监控项的规模。网络方面安全组只放行必要端口端口用途是否对公网开放22SSH 管理仅限自己的 IP80/443Zabbix Web / Grafana建议仅内网或加认证10051Zabbix Server 接收 Agent 数据仅内网10050Zabbix Agent 监听仅内网3306MySQL仅本机注意10051 和 10050 千万别对公网开放否则等于把监控数据通道暴露出去。Web 端口如果必须公网访问务必上 HTTPS 加访问控制。3. 基础环境准备与依赖安装3.1 系统初始化与时间同步监控系统对时间极其敏感时间不同步会导致数据错乱、触发器误判。第一步先把时间同步搞定sudo apt update sudo apt upgrade -y sudo apt install -y chrony sudo systemctl enable --now chrony chronyc sources -vchronyc sources输出里如果看到^*标记的源说明同步正常。这一步别跳过我见过因为时间漂移导致告警疯狂误报的案例。接着设置主机名和 hosts方便后续识别sudo hostnamectl set-hostname monitor-server echo 127.0.0.1 monitor-server | sudo tee -a /etc/hosts3.2 安装 MySQL 8.0 并做基础调优sudo apt install -y mysql-server sudo systemctl enable --now mysql sudo mysql_secure_installationmysql_secure_installation会引导你设置 root 密码、移除匿名用户、禁止 root 远程登录一路选 Y 即可。装完后要改几个关键参数编辑/etc/mysql/mysql.conf.d/mysqld.cnf[mysqld] character-set-serverutf8mb4 collation-serverutf8mb4_bin default-storage-engineInnoDB innodb_buffer_pool_size1G innodb_log_file_size256M innodb_flush_log_at_trx_commit2 max_connections300这里解释几个关键参数innodb_buffer_pool_sizeInnoDB 的缓存池一般设为物理内存的 50%~70%。我 4G 内存设 1G给系统和 Zabbix 留足空间。innodb_log_file_size日志文件大小设大一点能减少 checkpoint 频率提升写入性能。innodb_flush_log_at_trx_commit2这个值让日志每秒刷一次盘而不是每次事务都刷牺牲一点极端情况下的持久性换取写入性能。监控数据量大这个取舍很值。collation-serverutf8mb4_binZabbix 官方要求用utf8mb4_bin别用默认的utf8mb4_general_ci否则建表可能报错。改完重启 MySQLsudo systemctl restart mysql3.3 创建 Zabbix 专用数据库和用户sudo mysql -uroot -p进入 MySQL 后执行CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; CREATE USER zabbixlocalhost IDENTIFIED BY 你的强密码; GRANT ALL PRIVILEGES ON zabbix.* TO zabbixlocalhost; SET GLOBAL log_bin_trust_function_creators 1; FLUSH PRIVILEGES; QUIT;log_bin_trust_function_creators 1这行很关键。Zabbix 的建表脚本里包含存储过程和函数如果开了 binlog 又没这个设置会报权限错误。这个坑我踩过卡了半小时才反应过来。3.4 安装 PHP 及必要扩展Zabbix Web 是 PHP 应用需要一堆扩展sudo apt install -y php8.1-fpm php8.1-mysql php8.1-ldap php8.1-xml \ php8.1-mbstring php8.1-gd php8.1-bcmath php8.1-curl php8.1-zip装完检查 PHP-FPM 状态sudo systemctl enable --now php8.1-fpm然后调整 PHP 配置编辑/etc/php/8.1/fpm/php.ini改这几个值max_execution_time 300 max_input_time 300 memory_limit 256M post_max_size 32M upload_max_filesize 32M date.timezone Asia/Shanghaimax_execution_time设 300 秒是因为 Zabbix Web 有些操作比如导入大模板很耗时默认 30 秒会超时。date.timezone不设的话 PHP 会警告而且时间显示会乱。4. Zabbix Server 与 Web 前端部署4.1 添加官方源并安装 Zabbix 组件wget https://repo.zabbix.com/zabbix/6.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.0-4ubuntu22.04_all.deb sudo dpkg -i zabbix-release_6.0-4ubuntu22.04_all.deb sudo apt update sudo apt install -y zabbix-server-mysql zabbix-frontend-php zabbix-apache-conf zabbix-sql-scripts zabbix-agent这里一次装齐了 Server、Web 前端、Apache 配置、SQL 脚本和 Agent。Agent 装在 Server 本机是为了让 Server 也能监控自己。4.2 导入初始数据库结构zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql --default-character-setutf8mb4 -uzabbix -p zabbix这条命令会把 Zabbix 的建表脚本解压后直接灌进数据库。数据量不小执行时耐心等中途别中断。导入完成后可以验证一下mysql -uzabbix -p -e USE zabbix; SHOW TABLES; | head -20看到一堆表名就说明成功了。4.3 配置 Zabbix Server 连接数据库编辑/etc/zabbix/zabbix_server.conf改这几行DBHostlocalhost DBNamezabbix DBUserzabbix DBPassword你的强密码其他参数保持默认即可。启动服务sudo systemctl restart zabbix-server zabbix-agent apache2 sudo systemctl enable zabbix-server zabbix-agent apache2检查状态sudo systemctl status zabbix-server如果看到active (running)就对了。如果起不来八成是数据库连接问题看/var/log/zabbix/zabbix_server.log里的报错。4.4 完成 Web 前端初始化浏览器访问http://你的服务器IP/zabbix会进入安装向导。一路 Next到数据库配置页填入之前的信息最后设置一个管理员账号默认是 Admin / zabbix登录后立刻改密码。登录进去后第一件事是检查Reports → System information确认 Server 运行状态正常没有红色告警。4.5 在 Server 本机添加第一个被监控主机进入Configuration → Hosts → Create hostHost name 填Zabbix server在 Templates 里关联Linux by Zabbix agent在 Interfaces 里添加 Agent 接口IP 填127.0.0.1端口 10050保存后等一两分钟去Monitoring → Latest data就能看到 CPU、内存、磁盘等数据了。这一步成功意味着整条采集链路打通了。5. 被监控主机的 Agent 部署5.1 批量安装 Agent 的通用流程每台被监控主机都要装 Agent。以 Ubuntu 为例wget https://repo.zabbix.com/zabbix/6.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.0-4ubuntu22.04_all.deb sudo dpkg -i zabbix-release_6.0-4ubuntu22.04_all.deb sudo apt update sudo apt install -y zabbix-agent编辑/etc/zabbix/zabbix_agentd.confServer监控服务器内网IP ServerActive监控服务器内网IP Hostname本机主机名Server是允许谁来拉取数据ServerActive是主动上报的目标。两个都填监控服务器 IP。Hostname必须和 Zabbix Web 里配置的 Host name 完全一致否则会报host not found。启动并开机自启sudo systemctl restart zabbix-agent sudo systemctl enable zabbix-agent5.2 自定义监控项用 UserParameter 采集业务指标内置模板只能采系统指标业务指标得自己加。比如我想监控某个服务的进程数在 Agent 配置里加UserParametermyapp.process.count,pgrep -c myapp || echo 0重启 Agent 后在 Zabbix Web 里新建监控项Key 填myapp.process.count类型选 Zabbix agent就能采到了。提示UserParameter 里的脚本一定要保证有输出且退出码为 0否则 Zabbix 会标记为 unsupported。|| echo 0就是防止 pgrep 找不到进程时返回非零退出码。5.3 主动模式与被动模式的取舍Zabbix Agent 有两种工作模式被动模式Server 主动来拉数据Agent 监听 10050 端口。主动模式Agent 主动把数据推给 Server 的 10051 端口。主机少的时候被动模式简单直接。但主机一多Server 的轮询压力会很大。我的做法是核心主机用被动模式保证实时性边缘主机用主动模式减轻 Server 负担。切换主动模式只需在监控项里把类型改成 Zabbix agent (active)并在 Agent 配置里确保ServerActive正确。6. Grafana 对接 Zabbix 数据源6.1 安装 Grafana 并装 Zabbix 插件sudo apt install -y software-properties-common sudo add-apt-repository deb https://packages.grafana.com/oss/deb stable main wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add - sudo apt update sudo apt install -y grafana sudo systemctl enable --now grafana-server装 Zabbix 数据源插件sudo grafana-cli plugins install alexanderzobnin-zabbix-app sudo systemctl restart grafana-server这个插件是社区里最成熟的 Zabbix 数据源实现支持直接读取 Zabbix 的监控项、触发器和历史数据。6.2 配置数据源连接浏览器访问http://你的服务器IP:3000默认账号密码都是admin首次登录会要求改密码。进入Configuration → Data Sources → Add data source搜索 Zabbix填URLhttp://127.0.0.1/zabbix/api_jsonrpc.phpAccessServer (default)Username / PasswordZabbix 的登录账号点 Save Test如果显示 Data source is working 就成功了。注意URL 一定要指向api_jsonrpc.php这个文件不是 Zabbix 首页。我第一次填了首页地址一直报 404排查半天。6.3 导入现成面板快速出图Grafana 官方面板库里有大量 Zabbix 面板。进入Dashboards → Import输入面板 ID比如 5363 是 Zabbix 主机概览面板选好数据源就能导入。导入后如果图是空的检查两点一是数据源选对了没二是面板里的主机名和 Zabbix 里的 Host name 是否匹配。这两个是最常见的空图原因。6.4 自己动手做一个业务监控面板现成面板看系统指标够用但业务指标得自己画。新建 DashboardAdd panelQuery 里选 Zabbix 数据源Mode 选 Metrics然后Group选主机组Host选具体主机Item选你要画的监控项比如myapp.process.count在 Options 里可以设置单位、阈值线、图例。我习惯给关键指标加一条红色阈值线一眼就能看出是否越界。7. 告警配置与数据清理策略7.1 配置邮件告警媒介进入Administration → Media types找到 Email配置 SMTP 服务器信息。国内用企业邮箱或自建邮件服务都行填好 SMTP 地址、端口、发件账号密码。然后在User settings → Media里给管理员账号绑定邮箱勾选要接收的告警级别。7.2 触发器与动作的配合逻辑告警的核心是触发器 动作触发器Trigger定义什么条件算异常比如CPU 使用率连续 5 分钟超过 90%。动作Action定义异常后干什么比如发邮件给运维组。新建触发器时表达式可以这样写avg(/host/system.cpu.util,5m)90意思是 5 分钟平均值超过 90% 就触发。这里用avg而不是瞬时值是为了避免毛刺误报。我建议所有告警都加时间窗口否则半夜被单次抖动吵醒是常事。7.3 数据库历史数据清理这是最容易被忽视、也最容易出事的地方。Zabbix 默认保留历史数据 90 天、趋势数据 365 天。如果不清理数据库会无限膨胀。进入Administration → Housekeeping可以调整保留天数。但光靠 Housekeeping 删除大表数据会很慢甚至锁表。更好的做法是给大表做分区。以history_uint表为例按月分区ALTER TABLE history_uint PARTITION BY RANGE (clock) ( PARTITION p202401 VALUES LESS THAN (UNIX_TIMESTAMP(2024-02-01)), PARTITION p202402 VALUES LESS THAN (UNIX_TIMESTAMP(2024-03-01)), PARTITION p202403 VALUES LESS THAN (UNIX_TIMESTAMP(2024-04-01)) );分区后删除旧数据只需DROP PARTITION秒级完成不影响其他数据。这个优化我强烈建议在数据量上来之前就做好等表几十 G 了再改会很痛苦。7.4 监控系统自身的健康检查监控系统自己挂了却没人知道是最尴尬的事。我加了几条自监控Zabbix Server 进程是否存在数据库连接数是否接近上限磁盘剩余空间是否低于 20%Zabbix 队列积压是否过多zabbix[queue]监控项队列积压是 Server 性能不足的早期信号一旦持续增长就要考虑加资源或优化监控项了。8. 常见问题与排查实录8.1 高频问题速查表现象可能原因排查方向Web 报数据库连接失败密码错/权限不足检查 zabbix_server.conf 和 MySQL 授权Agent 显示 unsupportedKey 写错/脚本无输出用zabbix_agentd -t key手动测试数据不更新时间不同步/网络不通检查 chrony 和 10050/10051 端口Grafana 图空白数据源或主机名不匹配核对 Host name 和 API 地址告警不发送媒介未绑定/动作未启用检查用户 Media 和 Action 状态数据库暴涨未做清理/分区检查 Housekeeping 和表分区8.2 几个我踩过的坑坑一字符集不匹配导致建表失败。一开始数据库用了默认的utf8mb4_general_ci导入 SQL 时报 collation 冲突。必须用utf8mb4_bin这是 Zabbix 的硬性要求。坑二Agent 主机名大小写敏感。Zabbix 里 Host name 是区分大小写的。我在 Web 里写WebServerAgent 配置里写webserver结果一直连不上。统一成小写最省心。坑三主动模式忘了改监控项类型。只改了 Agent 配置没改 Web 里监控项的类型数据一直采不到。主动模式必须在监控项层面也切换。坑四告警风暴。一台机器网络抖动几十个触发器同时报警邮箱瞬间被刷爆。解决办法是配置告警依赖和抑制规则比如网络不可达时抑制其上层的服务告警。8.3 性能调优的几个实操心得Zabbix Server 的StartPollers、StartTrappers这些进程数参数默认值偏保守。主机多了之后如果队列积压可以适当调大。我的经验是先看队列再调参数别盲目加进程加多了反而抢 CPU。数据库层面定期ANALYZE TABLE和OPTIMIZE TABLE能保持查询性能。但OPTIMIZE TABLE会锁表要在低峰期做或者干脆用分区方案替代。Grafana 查询大时间范围的数据时容易超时可以在数据源配置里调大 timeout或者用 Zabbix 的 trend 数据趋势数据是小时级聚合查询快得多而不是原始 history 数据。9. 我个人的几点体会整套系统从零搭到稳定运行我大概花了两个周末。真正装软件的时间不多大部分精力花在调参、排错和设计告警规则上。这里分享几个我觉得最有价值的经验。第一监控项不在多而在精。一开始我恨不得把所有能采的指标都加上结果数据量爆炸、面板眼花缭乱、告警噪音不断。后来砍掉一大半只留真正影响服务的核心指标反而更实用。第二告警规则要反复打磨。好的告警应该是该响的时候一定响不该响的时候绝不响。我现在的做法是新规则先只记录不发送观察一周确认阈值合理后再开启通知。第三文档和备份比什么都重要。监控系统的配置模板、触发器、面板一定要定期导出备份。我有次误删了一个主机组连带几十个监控项没了幸好有备份十分钟就恢复了。这套 Zabbix Grafana 的组合规模不大时一台机器就能跑规模上来了也能横向扩展。它不是什么时髦的方案但胜在稳定、可控、生态成熟。如果你也在纠结要不要自己搭监控我的建议是只要你有超过三台服务器就值得动手搞一套。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑