在构建监控系统时,选择合适的监控模式对于确保系统的高效运行至关重要。Zabbix作为一个广泛应用的开源监控解决方案,支持两种主要的数据采集方式:主动模式(Active)和被动模式(Passive)。本文将详细探讨这两种模式的工作原理、各自的优缺点以及如何根据实际需求做出最佳选择。
Zabbix 主动与被动模式
Zabbix 有两种工作模式:主动和被动模式
无论是模式还是被动模式,都是站在zabbix agent 角度来说的工作模式
Zabbix 的主动和被动模式工作原理
Zabbix 监控流程中 Agent 收集数据分为主动和被动两种模式。
主动模式和被动模式都是相对 zabbix agent 而言的
Zabbix默认是被动模式,如果有100个监控项,被动模式需要 Zabbix Server找 Zabbix Agent要100次
主动模式是Zabbix Server给 Zabbix Agent发送一个包括100个监控项的任务清单,Zabbix Agent根据任务清单,采集好100个监控项的值,主动汇报给 Zabbix Server这100个监控项,Zabbix Agent主动模式只需要发送一次数据,大大提高了传输效率。
被动模式:Server 向 Agent 请求获取监控项的数据,Agent返回数据。此为默认模式,如果有100个监控项,则需要100次交互。
主动模式:Agent 请求 Server 获取主动的监控项列表,并主动将监控项内需要检测的数据提交给 server/proxy,如有100个监控项,只需要1次交互即可。
注意:两种模式可以在Zabbix Server上同时存在,可以将一部分监控项设为主动,其它设为被动模式。
被动监测通信过程如下
Server打开一个TCP连接
Server发送请求agent.ping
Agent接收到请求并且响应<HEADER><DATALEN>
Server处理接收到的数据
关闭TCP连接
被动模式每获取一个监控项都需要打开一个tcp连接,这样当监控项越来越多时,Zabbix Server会打开很多
端口,就会出现server端性能瓶颈问题
主动模式监测通信过程如下
zabbix agent 首先向ServerActive配置的IP请求获取active items,获取并提交active items数据
值给server或者proxy。
zabbix多久获取一次active items?
它会根据agent的配置文件中的RefreshActiveChecks的频率进行,如果获取失败,那么将会在60秒之后重试
主动模式的流程分两个部分
获取ACTIVE ITEMS列表
Agent主动打开一个TCP连接(主动检测变成Agent打开)
Agent请求items检测列表
Server返回items列表
Agent 处理响应
关闭TCP连接
Agent开始收集数据
主动检测提交数据过程
Agent建立TCP连接
Agent批量提交items列表收集的所有监控项数据
Server处理数据,并返回响应状态
关闭TCP连接
被动模式
被动模式是指 zabbix agent 被动的接受zabbix server(或者Zabbix Proxy)周期性发送过来的数据收集指令,此为默认的工作方式。
在被动模式之下,zabbix server会根据主机关联的模板中的监控项和数据采集间隔时间,周期性的打开随机端口并向zabbix agent服务器的10050端口发起tcp连接,然后发送获取监控项数据的指令,即 zabbix server发送什么指令那么zabbix agent就收集什么数据,zabbix server什么时候发送指令,zabbix agent就什么时候采集,zabbix server不发送指令,zabbix agent就一直不响应,所以zabbix agent也不用关心其监控项和数据采集周期间隔时间。
被动模式的优点就是配置简单,安装后即可使用,因此也成为zabbix的默认工作模式,但是被动模式的最大问题就是会加大zabbix server的负载,在数百甚至数千台服务器的环境下会导致zabbix server需要轮训向每个zabbix agent发送数据采集指令,如果zabbix server负载过高还会导致不能及时获取到最新数据。
被动模式因为性能的原因,一台 Zabbix Server 一般只能监控500台以下的主机,更多的主机建议使用主动模式。
Zabbix Server 通过Poller进程实现被动模式
[root@zabbix-server ~]#grep StartPollers /etc/zabbix/zabbix_server.conf
### Option: StartPollers
# StartPollers=5
[root@zabbix-server ~]#ps ax|grep poller
40478 ? S 0:03 /usr/sbin/zabbix_server: http poller #1 [got 0 values in 0.000036 sec, idle 5 sec]
40479 ? S 0:01 /usr/sbin/zabbix_server: browser poller #1 [got 0 values in 0.000022 sec, idle 5 sec]
40504 ? S 0:01 /usr/sbin/zabbix_server: proxy poller #1 [exchanged data with 0 proxies in 0.000017 sec, idle 5 sec]
40510 ? S 0:01 /usr/sbin/zabbix_server: poller #1 [got 0 values in 0.000042 sec, idle 5 sec]
40512 ? S 0:01 /usr/sbin/zabbix_server: poller #2 [got 0 values in 0.000007 sec, idle 5 sec]
40513 ? S 0:01 /usr/sbin/zabbix_server: poller #3 [got 0 values in 0.000037 sec, idle 5 sec]
40514 ? S 0:01 /usr/sbin/zabbix_server: poller #4 [got 0 values in 0.000021 sec, idle 5 sec]
40515 ? S 0:01 /usr/sbin/zabbix_server: poller #5 [got 0 values in 0.000026 sec, idle 5 sec]
40516 ? S 0:01 /usr/sbin/zabbix_server: unreachable poller #1 [got 0 values in 0.000017 sec, idle 5 sec]
40533 ? S 0:01 /usr/sbin/zabbix_server: history poller #1 [got 0 values in 0.000021 sec, idle 5 sec]
40534 ? S 0:01 /usr/sbin/zabbix_server: history poller #2 [got 1 values in 0.000099 sec, idle 5 sec]
40535 ? S 0:01 /usr/sbin/zabbix_server: history poller #3 [got 0 values in 0.000019 sec, idle 5 sec]
40536 ? S 0:01 /usr/sbin/zabbix_server: history poller #4 [got 0 values in 0.000027 sec, idle 5 sec]
40537 ? S 0:02 /usr/sbin/zabbix_server: history poller #5 [got 0 values in 0.000047 sec, idle 5 sec]
40548 ? S 0:01 /usr/sbin/zabbix_server: odbc poller #1 [got 0 values in 0.000026 sec, idle 5 sec]
40549 ? Sl 0:08 /usr/sbin/zabbix_server: http agent poller #1 [got 0 values, queued 0 in 5 sec, awaiting 0]
40550 ? Sl 2:07 /usr/sbin/zabbix_server: agent poller #1 [got 13 values, queued 18 in 5 sec, awaiting 5]
40554 ? Sl 0:06 /usr/sbin/zabbix_server: snmp poller #1 [got 0 values, queued 0 in 5 sec, awaiting 0]
40557