王 军|Zabbix高级认证工程师ZCP
感谢译者王军,欢迎更多资深用户翻译官方博文并分享!
当我们在监控环境中,构建高频率监控时,有许多设计选择需要考虑。要考虑如何减少性能影响?存储空间的数据保留策略是什么?有哪些现成的功能可以解决这些潜在的问题?
在本文中,我们将讨论什么时候应该使用预处理,什么时候适合使用“不保存历史记录”选项,以及这两种方法的优缺点。
数据节流以及其他预处理步骤
我们之前讨论过,数据节流是高频监测的首选方法。使用数据节流,你可以丢弃重复的值,并且也可以设置丢弃重复值的心跳间隔。这对于离散值的监控项非常有用,例如:服务状态,网络端口状态等等。
有心跳设置和无心跳设置的节流示例
另外,从Zabbix4.2开始所有的预处理都可以由Zabbix proxies来处理。这意味着我们可以在重复的值到达Zabbix Server之前丢弃它们。它可以帮助我们提高性能(在 Zabbix Server的数据库中插入的指标变少)并减少 DB 大小(DB 中存储的指标变少,有助于提高 Zabbix 的整体性能)。
这种方法有一些需要注意的事项,因为监控项值在到达 Zabbix Server之前就被丢弃了,所以触发器不会触发(这就是设置心跳检查的作用)。而且,由于 Zabbix Server根据接收到的历史数据计算趋势,所以可能缺少这些监控项的趋势信息。需要注意的是,这不光适用于数据节流的预处理规则——任何预处理都可以在代理上完成,任何预处理规则都可以进行数据转换。
理解“不保留历史记录”选项
数据节流和我们在配置监控项时设置“不保存历史记录”的行为有点不同。如果我们通过Proxy来采集一个监控项并设置了“不保存历史记录”,历史数据并不总是被丢弃。原因如下:
- 首先,我们不要忘了有些值可以填入主机资产中!如果特定监控项值被配置填充到主机资产字段里了-它会被转发到Zabbix Server,但是它不会被存入历史表中。
- 如果监控项没有被填入主机资产字段中-文本数据,例如:字符,日志和文本,在达到Zabbix Server之前会被丢弃,但数值类型的-浮点数和整型,将被转发到Zabbix Server。这样做的原因是为了从数值中推算出趋势信息。注意,数值型数据不会存入历史表中,只有趋势数据会保留。
注意:从Zabbix 5.2开始,就实现了这个功能。参考:ZBX-17548
为监控项设置“不保存历史记录”
利用趋势函数进行高频监控
记住"不保存历史数据"的具体内容,我们回想一下,从Zabbix 5.2开始,就提供了一些趋势函数!
我们可以通过历史函数例如trendavg,trendcount,trendmax,trendmin,trendsum来执行不同类型的趋势计算,对一段时间内的趋势数据进行统计并计算出最小(min)/最大(max)/平均(avg)趋势值。
如果我们只需要特定时间段(小时、天、周等)的指标趋势数据,我们就可以使用这些趋势函数并结合“不保存历史数据”选项,来丢弃不必要的数据,提高 Zabbix 服务器的性能!
使用趋势函数的方法有两种:
- 如果你想采集并展示趋势数据,你需要创建一个监控项来采集指标(例如:通过Agent类型的监控项net.if.in来采集网络入口流量)并创建一个单独的可计算类型监控项,对这个可计算型监控项使用趋势函数来计算一段时间内趋势数据的平均(avg)/最小(min)/最大(max)值。原始监控项可以选择“不保存历史数据”。
trendavg监控项——从监控项net.if.in[ifHCInOctets.5]中计算每小时的趋势数据
- 如果你想要对一段趋势数据定义触发器,而不需要收集趋势数据,那么你可以不创建可计算监控项,直接在原始监控项中使用趋势函数来创建触发器。
如果每小时平均趋势值超过100m,这个触发器就会触发。提示:在这种情况下,只需要原始监控项。
在我们的环境中结合这些预处理方法(丢弃或转换数据),并且选择不保存历史数据,在一定程度上,我们就可以降低对Zabbix的性能影响。在此基础上添加一层分布式 Zabbix Proxies,你就可以真正实现一个大型的、可伸缩的 Zabbix 架构,该架构经过优化,可以快速地获取和处理数据。