在数字化转型的浪潮中,企业的 IT 架构愈发复杂,Zabbix 作为主流的监控解决方案,承担着保障 IT 系统稳定运行的重任。随着被监控设备和数据量的指数级增长,如何让 Zabbix 稳定、高效、安全地运行,成为了运维人员亟待解决的问题。本篇文章将从性能优化、安全加固、故障排查三个维度,深入剖析 Zabbix 的高级运维与优化策略。
一、性能优化
1. 数据库性能优化
Zabbix 依赖数据库存储海量的监控数据,数据库性能的优劣,直接决定了 Zabbix 的整体表现。MySQL 作为 Zabbix 常用的数据库,通过合理调整配置参数和优化查询语句,能显著提升其性能。
编辑 MySQL 配置文件/etc/my.cnf:
sudo vi /etc/my.cnf
添加或修改以下参数:
[mysqld]
innodb_buffer_pool_size = 2G
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 2
query_cache_type = 1
query_cache_size = 64M
代码注释:
- innodb_buffer_pool_size:设置 InnoDB 存储引擎的缓冲池大小,增大该值可提升数据读取和写入性能,这里设置为 2GB。
- innodb_log_file_size:设置 InnoDB 事务日志文件大小,合理调整可减少日志切换频率,提高性能,设置为 256MB。
- innodb_flush_log_at_trx_commit:控制事务提交时日志写入磁盘的策略,设置为 2 可在一定程度上提高写入性能,但可能会在系统崩溃时丢失部分未写入磁盘的事务数据。
- query_cache_type:开启查询缓存,1 表示开启,查询结果会被缓存,下次相同查询可直接从缓存获取,减少数据库负载。
- query_cache_size:设置查询缓存的大小,这里设置为 64MB。
修改完成后,重启 MySQL 服务使配置生效:
sudo systemctl restart mysqld
使用EXPLAIN关键字分析查询语句的执行计划,找出性能瓶颈。例如,对于查询 Zabbix 监控数据的 SQL 语句:
EXPLAIN SELECT itemid, value FROM history WHERE clock > UNIX_TIMESTAMP() - 3600;
通过分析EXPLAIN的输出结果,为相关字段添加索引,提升查询效率。如上述查询中,可对clock字段添加索引:
CREATE INDEX idx_clock ON history (clock);
2. Zabbix Server 参数优化
编辑 Zabbix Server 配置文件/etc/zabbix/zabbix_server.conf:
sudo vi /etc/zabbix/zabbix_server.conf
优化以下参数:
StartPollers=50
StartTrappers=50
CacheSize=128M
HistoryCacheSize=128M
TrendCacheSize=64M
Timeout=3
代码注释:
- StartPollers:设置轮询进程数,增加该值可提高数据采集速度,这里设置为 50。
- StartTrappers:设置接收 traps 数据的进程数,同样可提升数据接收效率,设置为 50。
- CacheSize:设置缓存大小,用于存储经常访问的数据,提高数据读取速度,设置为 128MB。
- HistoryCacheSize:设置历史数据缓存大小,合理调整可减少数据库查询压力,设置为 128MB。
- TrendCacheSize:设置趋势数据缓存大小,设置为 64MB。
- Timeout:设置数据采集和处理的超时时间,单位为秒,这里设置为 3 秒,避免长时间等待造成的性能问题。
修改完成后,重启 Zabbix Server 服务:
sudo systemctl restart zabbix-server
3. 缓存机制优化
在 Zabbix 前端引入 Redis 缓存,缓存频繁访问的监控数据,减轻 Zabbix Server 和数据库的压力。以 PHP 为例,使用predis扩展连接 Redis:
require_once 'Predis/Autoloader.php';
Predis\Autoloader::register();
$redis = new Predis\Client();
$cacheKey = 'zabbix_monitoring_data';
if (!$redis->exists($cacheKey)) {
// 从Zabbix API获取监控数据
$data = getZabbixData();
$redis->set($cacheKey, json_encode($data));
} else {
$data = json_decode($redis->get($cacheKey), true);
}
代码注释:
- 引入predis扩展的自动加载器,确保可以使用 Redis 客户端。
- 创建 Redis 客户端实例。
- 设置缓存键名zabbix_monitoring_data。
- 检查缓存中是否存在监控数据,如果不存在,从 Zabbix API 获取数据并存储到缓存中;如果存在,直接从缓存中获取数据。
通过对数据库、Zabbix Server 的参数优化,以及引入缓存机制,构建了一个高效的数据采集、存储和读取体系,大幅提升了 Zabbix 的整体性能。
二、安全加固
1. 用户认证与授权
创建强密码策略:
在 Zabbix Web 界面,进入 “管理” -> “用户”,为每个用户设置强密码,包含大小写字母、数字和特殊字符,长度不少于 8 位。同时,启用密码过期策略,定期提醒用户更换密码,增强账号安全性。
合理分配用户权限:
根据用户的工作职责,在 “管理” -> “用户组” 中,为不同用户组分配相应的权限,如只读权限、监控配置权限、管理权限等,避免权限滥用。例如,为运维人员分配监控配置和报警管理权限,为业务人员分配只读权限,仅能查看监控数据。
2. 网络访问控制
在服务器的防火墙规则中,限制 Zabbix Server 和 Agent 的对外访问和对内接收连接的 IP 范围。以iptables为例,允许特定 IP 段访问 Zabbix Server 的 Web 端口(默认 80 或 443)和 Zabbix Server 与 Agent 之间的通信端口(默认 10050 和 10051):
sudo iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 10050 -j ACCEPT
sudo iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 10051 -j ACCEPT
代码注释:
- -A INPUT:向 INPUT 链中添加规则。
- -p tcp:指定协议为 TCP。
- -s 192.168.1.0/24:指定源 IP 段为 192.168.1.0/24。
- --dport 80:指定目标端口为 80,即 Zabbix Server 的 Web 端口。
- --dport 10050:指定目标端口为 10050,即 Zabbix Agent 向 Server 发送数据的端口。
- --dport 10051:指定目标端口为 10051,即 Zabbix Server 主动获取 Agent 数据的端口。
- -j ACCEPT:匹配规则时执行接受操作。
3. 数据加密传输
配置 Zabbix Server 和 Agent 使用 TLS 加密
在 Zabbix Server 配置文件/etc/zabbix/zabbix_server.conf中,添加如下配置:
TLSConnect=psk
TLSAccept=psk
TLSPSKIdentity=zabbix
TLSPSKFile=/etc/zabbix/zabbix.psk
在 Zabbix Agent 配置文件/etc/zabbix/zabbix_agent2.conf中,添加如下配置:
TLSConnect=psk
TLSAccept=psk
TLSPSKIdentity=zabbix
TLSPSKFile=/etc/zabbix/zabbix.psk
代码注释:
- TLSConnect和TLSAccept:指定使用预共享密钥(PSK)方式进行 TLS 加密连接。
- TLSPSKIdentity:设置 PSK 身份标识。
- TLSPSKFile:指定 PSK 文件路径。
三、故障排查
1. 监控数据异常排查
检查 Zabbix Server 和 Agent 日志
查看 Zabbix Server 日志文件/var/log/zabbix/zabbix_server.log和 Zabbix Agent 日志文件/var/log/zabbix/zabbix_agent2.log,查找是否有报错信息。例如,若出现 “connection refused” 错误,可能是 Zabbix Server 和 Agent 之间的网络连接问题;若出现 “item not found” 错误,可能是监控项配置错误。
在 Zabbix Web 界面,检查监控项的配置,确保键值正确、采集频率合理。同时,使用zabbix_get命令,手动测试 Agent 能否正确采集数据。例如,测试获取 CPU 使用率:
zabbix_get -s 192.168.1.101 -k system.cpu.util[,avg1]
代码注释:
- -s 192.168.1.101:指定 Zabbix Agent 的 IP 地址。
- -k system.cpu.util[,avg1]:指定要采集的监控项键值。
2. 报警故障排查
在 Zabbix Web 界面,进入 “管理” -> “报警媒介类型”,检查邮件、短信等报警媒介的配置是否正确,如 SMTP 服务器地址、端口、用户名和密码等。同时,使用测试功能,发送测试报警,验证报警媒介是否正常工作。
检查报警规则和动作的配置,确保触发条件合理、操作正确。例如,检查触发器的表达式是否准确,动作中指定的报警媒介和接收人是否正确。