CentOS 6.8 源码编译部署 Zabbix-agent 5.0 与 MySQL 监控实战
1. 项目背景与整体设计思路1.1 为什么老系统还要装新版监控CentOS 6.8 这个版本放在今天来看确实算是“古董级”的存在了。内核 2.6.32GCC 4.4.7Python 2.6.6很多新软件早就官宣不再支持。但现实情况是不少企业的核心业务系统仍然跑在这个平台上——可能是历史遗留的 ERP可能是某套定制化的生产管理系统迁移成本太高业务部门不敢动运维部门只能继续维护。我接触过的环境里甚至有把 CentOS 6.8 跑在物理机上七八年没重启过的稳定性确实没得说但监控一旦缺失出了问题就是两眼一抹黑。Zabbix 5.0 是 Zabbix 官方在 2020 年发布的 LTS 版本支持周期到 2025 年。它相比 3.x/4.x 在性能、UI、告警机制上都有明显提升尤其是对 MySQL 数据库的监控模板更加完善。但官方对 Zabbix 5.0 Agent 的支持列表里CentOS 6 已经属于“尽力而为”的状态——官方仓库不再提供 CentOS 6 的 RPM 包需要手动编译或者找第三方兼容包。这就是这个项目的核心矛盾老系统 新监控既要享受新版本的特性又要解决兼容性问题。这个实战项目的目标很明确在一台 CentOS 6.8 主机上部署 Zabbix-agent 5.0实现对主机性能CPU、内存、磁盘、网络和 MySQL 数据库连接数、QPS、慢查询、主从状态的全面监控。适合谁参考适合手里还有 CentOS 6.x 资产、正在用或打算用 Zabbix 做统一监控的运维人员。如果你完全是新手建议先补一下 Zabbix 的基本概念Server、Agent、Host、Item、Trigger否则后面配置起来会有点懵。1.2 方案选型编译安装 vs 第三方 RPM在 CentOS 6.8 上装 Zabbix-agent 5.0摆在面前的路无非三条官方 RPM 仓库Zabbix 官方 repo 只提供到 CentOS 7 的包CentOS 6 直接 404这条路堵死。第三方兼容 RPM比如 EPEL 里有一些老版本但 5.0 的 agent 基本找不到而且第三方包来源不明生产环境不敢用。源码编译下载 Zabbix 5.0 源码在 CentOS 6.8 上手动编译。麻烦是麻烦但可控性最强依赖自己解决路径自己定出问题也好排查。我最终选的是源码编译。理由有三点第一生产环境安全第一不用来路不明的包第二编译过程虽然折腾但一次搞定后可以打成内部 RPM 或者直接 tar 包分发到其他同版本机器第三编译时可以根据需要裁剪功能比如不需要 IPMI、不需要 Java gateway编译出来更轻量。MySQL 监控这块Zabbix 5.0 自带的Template DB MySQL模板已经很好用了但前提是 agent 端要能执行mysqladmin或者通过脚本获取数据。CentOS 6.8 自带的 MySQL 可能是 5.1 或者 5.5和 Zabbix 5.0 的模板兼容性需要验证。我的做法是用 agent 的 UserParameter 自定义 key通过本地 mysql 客户端查询 performance_schema 和 show status 来采集数据这样不依赖 Zabbix 官方模板的版本假设灵活度更高。注意CentOS 6.8 的 OpenSSL 版本是 1.0.1eZabbix 5.0 编译时如果启用加密通信需要确认 OpenSSL 版本是否满足。实测 1.0.1e 可以编译通过但部分新加密套件不支持如果 Server 端强制要求 PSK 加密需要额外测试。2. 环境准备与依赖处理2.1 系统基础信息确认动手之前先把目标机器的底细摸清楚。我习惯用一套组合命令快速采集cat /etc/redhat-release uname -r cat /proc/cpuinfo | grep model name | head -1 free -m df -h输出确认是 CentOS 6.8 Final内核 2.6.32-642.el6.x86_64CPU 是 Intel Xeon E5-2620 v2内存 16GB根分区 100GB 用了 40%。这些信息后面配置监控项的时候会用到比如磁盘监控要针对/和/data分别设置触发器。另外要确认 SELinux 和 iptables 的状态。CentOS 6.8 默认 SELinux 是 enforcingiptables 规则也可能挡掉 10050 端口。我的建议是SELinux 可以保持 enforcing但需要为 zabbix_agentd 配置正确的上下文iptables 必须放行 10050 端口。如果图省事直接setenforce 0重启后就失效了不推荐。getenforce iptables -L -n | grep 10050如果 iptables 没有放行规则执行iptables -I INPUT -p tcp --dport 10050 -j ACCEPT service iptables save2.2 编译依赖安装CentOS 6.8 的 yum 源现在很多都失效了需要先切换到 vault 归档源。这一步很关键否则yum install会各种报错。具体操作cd /etc/yum.repos.d/ mv CentOS-Base.repo CentOS-Base.repo.bak cat CentOS-Base.repo EOF [base] nameCentOS-6.8 - Base baseurlhttp://vault.centos.org/6.8/os/x86_64/ gpgcheck0 enabled1 EOF yum clean all yum makecache然后安装编译工具和依赖库yum install -y gcc gcc-c make pcre-devel zlib-devel openssl-devel yum install -y mysql-devel libcurl-devel net-snmp-devel这里有几个点要说明pcre-develZabbix agent 的正则表达式支持依赖它不装的话编译会报错。openssl-devel如果 Server 端要求加密通信必须装。CentOS 6.8 自带 1.0.1e够用。mysql-devel虽然 agent 本身不直接连数据库但后面自定义 MySQL 监控脚本可能需要编译一些辅助工具装上备用。net-snmp-devel如果这台机器还要被 SNMP 监控agent 可以集成 SNMP 采集不装也不影响核心功能。实操心得CentOS 6.8 的 yum 源问题是个大坑很多新手卡在这一步。如果 vault 源也慢可以临时用阿里云的 CentOS 6 归档源但要注意阿里云已经停止维护 6.x部分包可能缺失。最稳妥的办法是提前把需要的 RPM 包下载到本地用yum localinstall安装。2.3 创建 zabbix 用户和目录Zabbix agent 不建议用 root 跑虽然它需要读取一些系统信息但大部分数据通过/proc和mysqladmin就能拿到普通用户加 sudo 权限足够。创建用户和目录groupadd zabbix useradd -g zabbix -s /sbin/nologin zabbix mkdir -p /usr/local/zabbix mkdir -p /var/log/zabbix chown -R zabbix:zabbix /usr/local/zabbix chown -R zabbix:zabbix /var/log/zabbix这里有个细节/usr/local/zabbix是编译安装的默认前缀我习惯保持这个路径方便后续升级和迁移。日志目录单独放在/var/log/zabbix和系统日志分开排查问题的时候更清晰。3. 源码编译与安装实操3.1 下载与解压源码Zabbix 5.0 的源码包可以从官方源下载但 CentOS 6.8 的 wget 可能不支持 SNI导致 HTTPS 下载失败。我的做法是用curl -O或者提前在别的机器下载好再 scp 过来。cd /usr/local/src curl -O https://cdn.zabbix.com/zabbix/sources/stable/5.0/zabbix-5.0.0.tar.gz tar -zxvf zabbix-5.0.0.tar.gz cd zabbix-5.0.0如果下载速度慢可以换成 5.0 的任意小版本比如 5.0.12编译方式完全一样。我实测 5.0.0 在 CentOS 6.8 上编译通过率最高因为后续小版本可能引入了新的 C 标准要求CentOS 6.8 的 GCC 4.4.7 不一定支持。3.2 编译参数详解编译 Zabbix agent 不需要编译整个项目只需要 agent 部分。进入源码目录后执行./configure --prefix/usr/local/zabbix \ --enable-agent \ --with-openssl \ --with-libcurl \ --with-net-snmp逐个解释这些参数--prefix/usr/local/zabbix安装路径和前面创建的目录对应。--enable-agent只编译 agent不编译 server 和 proxy节省时间和资源。--with-openssl启用加密通信支持如果 Server 端配了 PSK这个必须开。--with-libcurl启用 curl 支持后面自定义监控项如果需要调用 HTTP 接口会用到。--with-net-snmp启用 SNMP 支持如果这台机器有 SNMP 设备需要监控agent 可以代理采集。注意如果编译时报错checking for mysql_config... no说明 mysql-devel 没装好或者路径不对。CentOS 6.8 的 mysql-devel 默认装在/usr/lib64/mysql/可以用--with-mysql/usr显式指定。但 agent 本身不需要 MySQL 库这个报错可以忽略只要不影响 agent 编译就行。配置完成后执行编译make make install编译过程大概 3-5 分钟取决于机器性能。如果出现make: *** [zabbix_agentd] Error 1大概率是依赖缺失仔细看报错信息缺什么补什么。3.3 安装后目录结构确认安装完成后检查目录结构ls -la /usr/local/zabbix/ ls -la /usr/local/zabbix/sbin/ ls -la /usr/local/zabbix/etc/ ls -la /usr/local/zabbix/bin/正常应该看到sbin/zabbix_agentdagent 主程序etc/zabbix_agentd.conf主配置文件etc/zabbix_agentd.conf.d/自定义配置目录bin/zabbix_get测试工具用来从 Server 端测试 agent 是否正常bin/zabbix_sender主动发送数据工具如果bin/zabbix_get不存在说明编译时没启用--enable-agent的完整功能需要重新编译。这个工具在排查问题时非常有用后面会详细讲。4. 配置文件调优与 MySQL 监控脚本4.1 zabbix_agentd.conf 核心参数Zabbix agent 的配置文件在/usr/local/zabbix/etc/zabbix_agentd.conf需要修改的关键参数如下LogFile/var/log/zabbix/zabbix_agentd.log LogFileSize10 DebugLevel3 EnableRemoteCommands0 Server192.168.1.100 ServerActive192.168.1.100 Hostnameweb-server-01 Include/usr/local/zabbix/etc/zabbix_agentd.conf.d/*.conf UnsafeUserParameters1 Timeout30逐条说明LogFile日志路径和前面创建的目录对应。LogFileSize10日志轮转大小10MB 够了太大浪费磁盘。DebugLevel3默认级别排查问题时可以临时调到 4 或 5但会大量写日志。EnableRemoteCommands0生产环境必须关掉否则 Server 端可以远程执行命令安全风险极高。Server被动模式下允许连接的 Server IP多个 IP 用逗号分隔。ServerActive主动模式下 Server 的 IP如果 agent 主动推送数据这个必须配。Hostname必须和 Zabbix Web 里配置的主机名完全一致否则数据对不上。Include自定义配置目录后面 MySQL 监控脚本的 UserParameter 放在这里。UnsafeUserParameters1允许自定义 key 带特殊字符MySQL 监控脚本需要这个。Timeout30超时时间默认 3 秒对于 MySQL 查询可能不够调到 30 秒。实操心得Hostname大小写敏感我踩过坑——Web 端写的是Web-Server-01配置文件写的是web-server-01结果 agent 启动正常但 Server 端一直显示主机不可达。排查了半天才发现是大小写问题。建议统一用小写避免混淆。4.2 MySQL 监控脚本编写Zabbix 5.0 自带的 MySQL 模板需要 agent 端能执行mysqladmin但 CentOS 6.8 的 MySQL 客户端路径可能不在默认 PATH 里。我的做法是写一个 shell 脚本封装所有 MySQL 查询然后通过 UserParameter 暴露给 agent。脚本放在/usr/local/zabbix/scripts/mysql_monitor.sh#!/bin/bash MYSQL_USERzabbix_monitor MYSQL_PASSYourPassword MYSQL_HOST127.0.0.1 MYSQL_PORT3306 case $1 in ping) mysqladmin -u$MYSQL_USER -p$MYSQL_PASS -h$MYSQL_HOST -P$MYSQL_PORT ping 2/dev/null | grep -c alive ;; connections) mysql -u$MYSQL_USER -p$MYSQL_PASS -h$MYSQL_HOST -P$MYSQL_PORT -e SHOW STATUS LIKE Threads_connected; 2/dev/null | awk NR2{print $2} ;; qps) mysql -u$MYSQL_USER -p$MYSQL_PASS -h$MYSQL_HOST -P$MYSQL_PORT -e SHOW STATUS LIKE Queries; 2/dev/null | awk NR2{print $2} ;; slow_queries) mysql -u$MYSQL_USER -p$MYSQL_PASS -h$MYSQL_HOST -P$MYSQL_PORT -e SHOW STATUS LIKE Slow_queries; 2/dev/null | awk NR2{print $2} ;; uptime) mysql -u$MYSQL_USER -p$MYSQL_PASS -h$MYSQL_HOST -P$MYSQL_PORT -e SHOW STATUS LIKE Uptime; 2/dev/null | awk NR2{print $2} ;; *) echo Unknown parameter exit 1 ;; esac然后创建 MySQL 监控专用用户CREATE USER zabbix_monitorlocalhost IDENTIFIED BY YourPassword; GRANT PROCESS, REPLICATION CLIENT ON *.* TO zabbix_monitorlocalhost; FLUSH PRIVILEGES;这里只给PROCESS和REPLICATION CLIENT权限足够读取SHOW STATUS和主从状态不需要SELECT任何业务表安全可控。4.3 UserParameter 配置在/usr/local/zabbix/etc/zabbix_agentd.conf.d/mysql.conf中添加UserParametermysql.ping,/usr/local/zabbix/scripts/mysql_monitor.sh ping UserParametermysql.connections,/usr/local/zabbix/scripts/mysql_monitor.sh connections UserParametermysql.qps,/usr/local/zabbix/scripts/mysql_monitor.sh qps UserParametermysql.slow_queries,/usr/local/zabbix/scripts/mysql_monitor.sh slow_queries UserParametermysql.uptime,/usr/local/zabbix/scripts/mysql_monitor.sh uptime给脚本加执行权限chmod x /usr/local/zabbix/scripts/mysql_monitor.sh chown -R zabbix:zabbix /usr/local/zabbix/scripts/注意脚本里的密码是明文生产环境建议用/etc/my.cnf里的[client]段配置默认用户和密码或者用 MySQL 的mysql_config_editor生成加密登录路径。明文密码只适合内网测试环境。5. 服务启动与 Web 端配置5.1 启动 agent 并验证配置完成后启动 agent/usr/local/zabbix/sbin/zabbix_agentd -c /usr/local/zabbix/etc/zabbix_agentd.conf检查进程和端口ps -ef | grep zabbix_agentd netstat -tlnp | grep 10050 tail -f /var/log/zabbix/zabbix_agentd.log如果日志里出现zabbix_agentd started [listener #1]说明启动成功。如果报错cannot bind to port 10050检查是否有其他 agent 在跑或者 iptables 没放行。在 Server 端用zabbix_get测试/usr/local/zabbix/bin/zabbix_get -s 192.168.1.101 -p 10050 -k system.cpu.load[all,avg1] /usr/local/zabbix/bin/zabbix_get -s 192.168.1.101 -p 10050 -k mysql.ping如果返回数值说明 agent 和自定义 key 都正常。如果返回ZBX_NOTSUPPORTED检查 UserParameter 路径和权限。5.2 Web 端添加主机与模板登录 Zabbix Web进入Configuration - Hosts - Create hostHost nameweb-server-01必须和 agent 配置文件里的Hostname一致。Groups选一个已有的组比如Linux servers。InterfacesAgent 接口IP 填192.168.1.101端口10050。Templates链接Template OS Linux by Zabbix agent和Template DB MySQL by Zabbix agent。如果 Zabbix 5.0 自带模板里没有 MySQL 的可以手动导入官方模板或者自己创建监控项。我习惯自己创建因为自带的模板监控项太多有些用不上反而增加 agent 负担。自定义监控项示例名称Key类型单位更新间隔MySQL Connectionsmysql.connectionsZabbix agent个30sMySQL QPSmysql.qpsZabbix agent次/秒30sMySQL Slow Queriesmysql.slow_queriesZabbix agent个60sMySQL Uptimemysql.uptimeZabbix agent秒300s触发器示例MySQL Connections 500警告连接数过高。MySQL Slow Queries 变化率 10/分钟警告慢查询增多。mysql.ping 0严重MySQL 不可达。5.3 主机性能监控项补充除了 MySQL主机性能监控也不能少。Zabbix 5.0 的Template OS Linux by Zabbix agent已经覆盖了 CPU、内存、磁盘、网络但有几个关键项需要手动调整CPU 负载system.cpu.load[all,avg1]触发器阈值建议设为 CPU 核数 × 0.8。内存使用率vm.memory.utilization触发器阈值 90%。磁盘空间vfs.fs.size[/,pfree]触发器阈值 20%。网络流量net.if.in[eth0]和net.if.out[eth0]根据带宽设置阈值。实操心得CentOS 6.8 的网卡命名可能是eth0而不是ens33配置监控项的时候要注意。可以用ip addr确认网卡名称然后在 Zabbix 里对应修改。6. 常见问题与排查技巧实录6.1 agent 启动失败排查问题现象执行zabbix_agentd后进程立刻退出日志无输出。排查思路检查配置文件路径是否正确-c参数指定的文件是否存在。检查日志目录权限/var/log/zabbix是否属于 zabbix 用户。检查端口占用netstat -tlnp | grep 10050。前台运行看报错zabbix_agentd -f -c /usr/local/zabbix/etc/zabbix_agentd.conf。常见原因配置文件里LogFile路径写错或者Server参数为空导致 agent 拒绝启动。6.2 自定义 key 返回 ZBX_NOTSUPPORTED问题现象zabbix_get测试自定义 key 时返回ZBX_NOTSUPPORTED。排查思路确认UnsafeUserParameters1已配置。确认脚本有执行权限ls -la /usr/local/zabbix/scripts/mysql_monitor.sh。手动执行脚本su - zabbix -s /bin/bash -c /usr/local/zabbix/scripts/mysql_monitor.sh ping。检查脚本里的 mysql 命令路径CentOS 6.8 的 mysql 可能在/usr/bin/mysql如果不在 PATH 里脚本里要用绝对路径。常见原因zabbix 用户没有权限执行 mysql 命令或者 MySQL 用户密码错误。6.3 MySQL 监控数据不更新问题现象Web 端能看到监控项但数据一直是旧值或者 no data。排查思路检查 agent 日志tail -f /var/log/zabbix/zabbix_agentd.log看是否有 MySQL 相关报错。检查 MySQL 连接数mysql -uzabbix_monitor -p -e SHOW PROCESSLIST;看是否有连接被拒绝。检查 Zabbix Server 的Timeout设置如果 MySQL 查询慢Server 端超时时间也要调大。常见原因MySQL 的max_connections太小zabbix_monitor 用户连不上或者wait_timeout太短连接被断开。6.4 常见问题速查表问题现象可能原因解决方法agent 启动失败配置文件路径错误用-c指定绝对路径端口 10050 不通iptables 未放行iptables -I INPUT -p tcp --dport 10050 -j ACCEPT自定义 key 不支持UnsafeUserParameters 未开配置文件中设为 1 并重启MySQL 数据不更新监控用户权限不足授予 PROCESS 和 REPLICATION CLIENT主机显示不可达Hostname 不一致确保 Web 端和配置文件完全一致编译报错缺依赖pcre-devel 未装yum install pcre-devel日志文件不生成目录权限不对chown zabbix:zabbix /var/log/zabbix避坑技巧CentOS 6.8 的service命令不支持systemctl如果写启动脚本要用/etc/init.d/下的传统方式。另外Zabbix agent 5.0 的二进制文件依赖libpcre.so.0如果系统里只有libpcre.so.1需要做个软链接或者重新编译 pcre。7. 性能优化与长期维护建议7.1 agent 资源占用控制Zabbix agent 本身很轻量但在 CentOS 6.8 这种老系统上还是要控制一下资源占用。我的经验是被动模式agent 等待 Server 来拉数据资源占用最低适合大多数场景。主动模式agent 主动推数据适合 Server 和 agent 之间有防火墙、只能单向通信的场景但 agent 会多消耗一点 CPU。监控项更新间隔CPU、内存 30 秒一次够了磁盘、MySQL 慢查询 60 秒一次没必要太频繁。日志级别生产环境保持DebugLevel3排查问题时临时调到 4用完调回来。7.2 MySQL 监控的长期维护MySQL 监控不是配完就完事了随着业务增长监控项和阈值都要调整。我建议每季度做一次复盘检查慢查询阈值是否合理业务高峰期是否误报。检查连接数阈值如果经常触发警告可能是连接池配置有问题。检查主从延迟监控如果有主从Zabbix 5.0 的 MySQL 模板支持mysql.replication.seconds_behind_master但需要额外配置。7.3 升级与迁移考虑CentOS 6.8 终究是要淘汰的Zabbix agent 5.0 在 CentOS 7/8 上安装更简单直接用官方 RPM 包就行。如果未来迁移配置文件可以复用只需要改一下Server和Hostname。我的做法是把 agent 配置文件、自定义脚本、UserParameter 配置都放在版本控制里迁移的时候直接拉下来改几个参数就能用。最后分享一个小技巧Zabbix agent 支持Include目录可以把不同业务的监控配置分开放在/usr/local/zabbix/etc/zabbix_agentd.conf.d/下比如mysql.conf、nginx.conf、redis.conf这样管理起来清晰排查问题也方便。我见过把所有配置堆在一个文件里的几百行下来改一个参数要找半天非常痛苦。