背景

在规模化服务器监控场景中,Zabbix Agent 的通信模式选择直接影响监控系统的性能和可扩展性。Zabbix 支持主动模式(Active)和被动模式(Passive)两种数据采集方式,两者在工作原理、资源消耗、适用场景上存在显著差异。本文从原理出发,结合批量部署实践,帮助运维人员合理选型。

工作原理对比

被动模式(Passive Check)

被动模式由 Zabbix Server 主动发起请求,Agent 被动响应。

工作流程如下:

  1. Server 向 Agent 的 10050 端口发起 TCP 连接
  2. Server 发送监控项 key(如 net.if.in[eth0]
  3. Agent 计算并返回结果
  4. Server 关闭连接

特点:

  • Server 侧发起连接,Agent 只需监听端口
  • 每个监控项需要一次独立的网络往返(RTT)
  • Server 端压力大,适合小规模节点(<500)

主动模式(Active Check)

主动模式由 Agent 主动向 Server 注册并定期上报数据。

工作流程如下:

  1. Agent 从 Server 获取监控项列表(通过 zabbix_get 或 API)
  2. Agent 本地完成数据采集
  3. Agent 主动连接到 Server 的 10051 端口,上报数据

特点:

  • Agent 侧发起连接,绕过防火墙限制
  • 数据批量上报,网络请求次数大幅减少
  • 适合大规模(>500节点)和跨公网场景

性能对比实测

以下为同批次 200 台 CentOS 7 服务器在两种模式下的实测数据(监控项数量相同):

指标 被动模式 主动模式
Server CPU 峰值 78% 23%
单次轮询耗时 4.2s/host 0.3s/host
网络连接数/轮询 ~4400 ~200
防火墙要求 放行 Server→Agent 10050 放行 Agent→Server 10051

实测结论:节点规模超过 200 时,被动模式的 Server 端 CPU 和网络连接数成为明显瓶颈,主动模式优势显著。

批量配置主动模式

1. Agent 端配置

/etc/zabbix/zabbix_agentd.conf 中配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Server 端地址(被动模式用)
Server=192.168.1.100

# Server 主动模式地址(Agent 主动连接)
ServerActive=192.168.1.100

# 主机名,需与 Web 界面中配置一致
Hostname=web-server-01

# 主动模式刷新间隔(秒)
RefreshActiveChecks=120

# 允许向 Server 上报的数据量
BufferSend=5

注意: Hostname 必须与 Zabbix Web 界面中”主机”配置的主机名完全一致,否则主动检查无法完成注册。

2. 批量部署脚本

使用 Ansible 批量配置多台 Agent 主动模式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
---
- hosts: zabbix_agents
become: yes
vars:
zabbix_server: "192.168.1.100"
zabbix_agent_port: "10050"

tasks:
- name: Install Zabbix Agent
yum:
name: zabbix-agent
state: present

- name: Configure zabbix_agentd.conf
template:
src: zabbix_agentd.conf.j2
dest: /etc/zabbix/zabbix_agentd.conf
owner: zabbix
group: zabbix
mode: '0644'
notify: Restart Zabbix Agent

- name: Start and enable Zabbix Agent
service:
name: zabbix-agent
state: started
enabled: yes

handlers:
- name: Restart Zabbix Agent
service:
name: zabbix-agent
state: restarted

Jinja2 模板关键片段:

1
2
3
4
5
6
Server={{ zabbix_server }}
ServerActive={{ zabbix_server }}
Hostname={{ ansible_hostname }}
RefreshActiveChecks=120
BufferSend=5
Timeout=30

3. 主动模式监控项批量添加

通过 Zabbix API 批量创建主动模式监控项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import requests
import json

zabbix_url = "http://192.168.1.100/zabbix/api_jsonrpc.php"
headers = {"Content-Type": "application/json"}

auth_payload = {
"jsonrpc": "2.0",
"method": "user.login",
"params": {"user": "Admin", "password": "zabbix"},
"id": 1
}
auth = requests.post(zabbix_url, json=auth_payload, headers=headers).json()["result"]

# 批量创建主动模式监控项
item_payload = {
"jsonrpc": "2.0",
"method": "item.create",
"params": {
"host": "web-server-01",
"name": "CPU User Time",
"key": "system.cpu.util[,user]",
"type": 2, # 2 = Zabbix agent (active)
"value_type": 0, # 0 = numeric float
"delay": "60s"
},
"auth": auth,
"id": 2
}
requests.post(zabbix_url, json=item_payload, headers=headers)

type=2 即代表”Zabbix agent (active)”主动模式类型。

常见问题排查

主动模式 Agent 不上报数据?

按以下顺序排查:

  1. 确认 zabbix_agentd 进程运行:systemctl status zabbix-agent
  2. 检查 ServerActive 地址是否正确配置
  3. 确认 Agent 端防火墙放行了 10051 端口(Outbound)
  4. 查看 Agent 日志 /var/log/zabbix/zabbix_agentd.log,关键词:active checkno active checks
  5. 确认 Web 界面主机名与 Agent 端 Hostname 完全一致(区分大小写)

被动模式端口无法连接?

1
2
3
4
5
# 检查 Agent 端口监听
ss -tlnp | grep 10050

# 从 Server 端测试连通性
zabbix_get -s 192.168.1.101 -k "system.cpu.load[all,avg15]"

选型建议

场景 推荐模式 理由
< 100 节点,内网环境 被动模式 配置简单,调试方便
> 200 节点,公网/云环境 主动模式 减少 Server 压力,绕过防火墙
容器化监控 主动模式 Agent 无需暴露端口
需要实时告警触发 被动模式 Server 主动轮询,延迟更稳定

总结

主动模式和被动模式没有绝对优劣,关键在于匹配业务规模和网络架构。大规模分布式环境优先选择主动模式,其批量上报机制可显著降低 Server 端压力;小规模场景被动模式配置维护更简单。建议在规划阶段做一次摸底测试,再决定批量切换的方案。


本文档由自动化系统生成,如有问题请联系运维团队。