Zabbix 企业级监控实战
1. 简介与核心作用
Zabbix是企业级开源分布式监控系统。
表格
| 组件 | 作用 | 端口 |
|---|---|---|
| Zabbix Server | 监控核心,处理数据采集、告警触发 | 10051 |
| Zabbix Agent | 主机代理,采集本地指标 | 10050 |
| Zabbix Proxy | 分布式代理,减轻Server压力 | 10051 |
| Database | 数据存储(MySQL/PostgreSQL) | 3306 |
| WebUI | Web管理界面 | 80/443 |
核心概念:Host(被监控对象)、Item(监控指标)、Trigger(触发器)、Template(模板)、Action(动作)
2. 工作原理
2.1 监控数据采集流程
plaintext
┌─────────┐ 10050 ┌──────────┐ 10051 ┌─────────┐
│ Agent │◄─────►│ Server │◄─────►│ Proxy │
└─────────┘ └────┬─────┘ └─────────┘
▼
┌────────────┐
│ Database │
└────────────┘
2.2 主动模式 vs 被动模式
表格
| 模式 | Server角色 | Agent角色 | 适用场景 |
|---|---|---|---|
| 被动模式 | 主动发起请求 | 被动响应 | 小规模 |
| 主动模式 | 等待连接 | 主动上报 | 大规模 |
被动模式配置:Server=192.168.1.100
主动模式配置:ServerActive=192.168.1.100; Hostname=web-server-01
触发器表达式:{host:key.function(parameter)}<operator>value
表格
| 函数 | 说明 | 示例 |
|---|---|---|
| avg() | 平均值 | avg(/host/cpu,5m) |
| max() | 最大值 | max(/host/mem,1h) |
| last() | 最新值 | last(/host/vfs) |
| nodata() | 无数据 | nodata(/host/ping,10m) |
示例:{Centos8:system.cpu.util.last(0)}>80
2.4 告警升级
plaintext
Trigger触发 → Action → Step1(邮件,0-30min) → Step2(微信,30-60min) → Step3(电话,>60min)
3. 部署与配置
3.1 Zabbix Server + MySQL + Nginx
yaml
# docker-compose.yml
version: '3.8'
services:
zabbix-server:
image: zabbix/zabbix-server-mysql:alpine-6.4
container_name: zabbix-server
environment:
DB_SERVER_HOST: mysql-server
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix_p@ssw0rd
ZBX_CACHESIZE: 512M
ZBX_HISTORYCACHESIZE: 128M
ZBX_TRENDCACHESIZE: 128M
ZBX_VALUECACHESIZE: 256M
ports:
- "10051:10051"
depends_on:
- mysql-server
restart: always
mysql-server:
image: mysql:8.0
container_name: mysql-server
environment:
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix_p@ssw0rd
MYSQL_ROOT_PASSWORD: root_p@ssw0rd
volumes:
- mysql-data:/var/lib/mysql
command:
- --character-set-server=utf8mb4
- --max_connections=500
- --innodb-buffer-pool-size=2G
restart: always
zabbix-web:
image: zabbix/zabbix-web-nginx-mysql:alpine-6.4
container_name: zabbix-web
environment:
DB_SERVER_HOST: mysql-server
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix_p@ssw0rd
ZBX_SERVER_HOST: zabbix-server
PHP_TZ: Asia/Shanghai
ports:
- "8080:8080"
depends_on:
- mysql-server
- zabbix-server
restart: always
volumes:
mysql-data:
bash
docker-compose up -d
# 访问 http://localhost:8080 账号: Admin / zabbix
3.2 Zabbix Agent2 配置
ini
# /etc/zabbix/zabbix_agent2.conf
Server=192.168.1.100
ServerActive=192.168.1.100
Hostname=web-server-01
# TLS配置(生产环境)
TLSConnect=cert
TLSAccept=cert
TLSCAFile=/etc/zabbix/ca.pem
TLSCertFile=/etc/zabbix/client.crt
TLSKeyFile=/etc/zabbix/client.key
# 自定义监控项
UnsafeUserParameters=1
Include=/etc/zabbix/zabbix_agent2.d/*.conf
自定义监控项:
ini
# /etc/zabbix/zabbix_agent2.d/userparameter_mysql.conf
UserParameter=mysql.ping[*],mysqladmin -h$1 -P$2 ping
UserParameter=mysql.status[*],mysqladmin -h$1 -P$2 extended-status | grep $3 | awk '{print $$4}'
3.3 Zabbix Proxy 部署
yaml
version: '3.8'
services:
zabbix-proxy:
image: zabbix/zabbix-proxy-sqlite3:alpine-6.4
container_name: zabbix-proxy
environment:
ZBX_HOSTNAME: proxy-sh-01
ZBX_SERVER_HOST: 192.168.1.100
ZBX_PROXYMODE: 0
ports:
- "10051:10051"
volumes:
- ./proxy_data:/var/lib/zabbix
restart: always
4. 常用操作
4.1 zabbix_get / zabbix_sender
bash
# 测试Agent连通性
zabbix_get -s 192.168.1.101 -p 10050 -k agent.ping
# 测试CPU负载
zabbix_get -s 192.168.1.101 -k system.cpu.load[all,avg1]
# 推送数据
zabbix_sender -z 192.168.1.100 -s "web-server-01" -k custom.key -o 12345
# 批量推送
echo "192.168.1.101 custom.metric1 100" > /tmp/data.txt
echo "web-server-01 custom.metric2 200" >> /tmp/data.txt
zabbix_sender -z 192.168.1.100 -i /tmp/data.txt
4.2 API操作
python
import requests
ZBX_URL = "http://192.168.1.100:8080/api_jsonrpc.php"
def zbx_api(method, params, token=None):
payload = {
"jsonrpc": "2.0", "method": method,
"params": params, "auth": token, "id": 1
}
return requests.post(ZBX_URL, json=payload).json()["result"]
# 获取Token
token = zbx_api("user.login", {"user": "Admin", "password": "zabbix"})
# 获取所有主机
hosts = zbx_api("host.get", {"output": ["hostid", "name"]}, token)
print(f"Total hosts: {len(hosts)}")
# 获取模板ID并批量链接
templates = zbx_api("template.get", {
"output": ["templateid"],
"filter": {"host": ["Template OS Linux"]}
}, token)
template_id = templates[0]["templateid"]
for host in hosts:
zbx_api("host.update", {
"hostid": host["hostid"],
"templates": [{"templateid": template_id}]
}, token)
# 创建监控项
zbx_api("item.create", {
"hostid": "10234",
"name": "Custom Metric",
"key_": "custom.api.metric",
"type": 0, "value_type": 3, "delay": "30s"
}, token)
4.3 自动发现(LLD)与自动注册
LLD脚本:nginx.discovery 返回 {"data":[{"{#STATUS}":"active"},{"{#STATUS}":"reading"}]}
自动注册Agent配置:
ini
ServerActive=192.168.1.100
Hostname=server-{HOST.IP}
Server端Action: Host metadata contains "linux" → Link template
5. 常见问题与排查
5.1 Agent不可达排查
bash
# 1. 网络连通性
telnet 192.168.1.101 10050
nc -zv 192.168.1.101 10050
# 2. Agent进程状态
systemctl status zabbix-agent2
# 3. 日志检查
tail -f /var/log/zabbix/zabbix_agent2.log
# 4. 测试
zabbix_get -s 192.168.1.101 -k agent.ping
表格
| 问题 | 原因 | 解决 |
|---|---|---|
| Connection refused | Agent未运行 | 启动服务 |
| Timeout | 防火墙阻挡 | 开放端口 |
| Hostname不匹配 | 配置错误 | 核对Web界面 |
5.2 告警风暴处理
触发器去抖动:{host:metric.min(5m)}>100 替代 {host:metric.last()}>100
Trigger依赖:
python
zbx_api("trigger.update", {"triggerid": "12346", "dependencies": [{"triggerid": "12345"}]}, token)
动作去重:Event age less than 5m
5.3 数据库性能优化
MySQL分区表:
sql
-- history表按天分区
ALTER TABLE history DROP PRIMARY KEY, ADD PRIMARY KEY (itemid, clock);
ALTER TABLE history PARTITION BY RANGE (clock) (
PARTITION p2024_01 VALUES LESS THAN (UNIX_TIMESTAMP('2024-02-01')),
PARTITION p2024_02 VALUES LESS THAN (UNIX_TIMESTAMP('2024-03-01')),
PARTITION p_future VALUES LESS THAN MAXVALUE
);
-- trends表按月分区
ALTER TABLE trends PARTITION BY RANGE (clock) (
PARTITION p2024_q1 VALUES LESS THAN (UNIX_TIMESTAMP('2024-04-01')),
PARTITION p_future VALUES LESS THAN MAXVALUE
);
Housekeeper配置:
bash
HousekeepingFrequency=1
MaxHousekeeperDelete=5000
HistoryCacheSize=128M
TrendCacheSize=128M
ValueCacheSize=256M
6. 最佳实践
6.1 模板设计规范
- 模板:
Template [Layer] [Component]→Template OS Linux - 监控项:
{name}.{metric}→cpu.util - 触发器:
{service}_{metric}_{condition}→nginx_down
6.2 触发器优化
bash
# 避免last(),改用avg/min/max
# 不好: {host:key.last()} > 100
# 好: {host:key.avg(5m)} > 100
# 添加时间窗口
{host:cpu.avg(5m)} > 90 and {host:cpu.max(5m)} > 90
# 检测数据丢失
{host:agent.ping.nodata(10m)}=1
6.3 容量规划
表格
| 规模 | Hosts | nvps | Server | MySQL |
|---|---|---|---|---|
| 小型 | <100 | <100 | 4C8G | 2C4G,100GB |
| 中型 | 100-500 | 100-500 | 8C16G | 4C8G,200GB |
| 大型 | 500-2000 | 500-2000 | 16C32G | 8C16G,500GB |
6.4 高可用方案
plaintext
┌─────────────┐
│ VIP/PACE │
└──────┬──────┘
┌─────────────┼─────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│Zabbix-SRV1│ │Zabbix-SRV2│ │Zabbix-SRV3│
│ (Primary) │ │ (Standby) │ │ (Standby) │
└───────────┘ └───────────┘ └───────────┘
6.5 关键参数调优
bash
StartPollers=100
StartPollersUnreachable=50
StartTrappers=30
StartPingers=50
StartDiscoverers=10
CacheSize=512M
HistoryCacheSize=128M
TrendCacheSize=128M
ValueCacheSize=256M
常用命令速查
bash
# Agent操作
systemctl enable --now zabbix-agent2
zabbix_get -s IP -k key
zabbix_sender -z SERVER -s HOST -k key -o value
# Server诊断
zabbix_server -R housekeeper_execute
zabbix_server -R config_cache_reload
# 数据库维护
mysql -u zabbix -p -e "OPTIMIZE TABLE history;"
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)