zabbix与prometheus如何选

379 阅读5分钟

对于运维监控来说,最为广泛使用的开源监控系统是zabbix和prometheus。zabbix是运维监控系统里面的一员老将了,其在基础监控方面有着广泛的用户使用基础;prometheus则是一位后起之秀,伴随着容器技术的逐步发展越来越受到用户的青睐,两个监控系统各有其擅长的领域。

zabbix

功能强大的开源监控系统,主要覆盖主机、网络、应用程序的监控,具有数据采集、告警触发、告警通知等功能。数据采集上支持agent数据采集、被动式数据监控(通过SNMP, IPMI等),同时支持通过插件和自定义脚本的方式来扩展数据采集功能。

prometheus

云原生开源监控系统,核心功能在于时序数据的收集与分析,其自带数据库,并有一套专门的PromQL查询语法,其在容器监控方面相比zabbix具有极大的优势,在云原生时代,使用kubernetes的场景中,prometheus技术算是必备的监控手段。一般在使用时会搭配alertmanager。

表1是两者的特点对比:

zabbixprometheus
功能采集、分析、告警采集、分析、告警
开发语言C、PHPGolang
数据库MySQL PostgreSQL SQLite Oracle IBMDB2自带tsdb
使用规模中小型规模规模不限
数据模型/查询语言数据模型和查询语言计数器(counter)、仪表盘(gauge)、直方图(histogram)、摘要(summary)四种数据模型包含指标、标签,聚合函数PromQL查询语法
告警自带告警,web配置结合alertmanager通知
可视化Web功能较多简单的页面、仅支持查询
配置手动配置 很难适应多变的环境可自动化配置、自发现服务指标
扩展性可扩展可扩展
优势场景传统监控云原生监控
数据采集Agent/插件、脚本自发现、exporter

表1. zabbix与prometheus特点对比

应该选择哪一款监控系统,其实还需要企业根据自身的特点来决定。很多时候是将这些系统和其他系统进行组合使用,构建适合企业运维场景的监控体系。具体到实践中该如何取舍,就需要更多地了解它们的特性。

zabbix会消耗更多的系统资源,一旦监控的规模上来之后,zabbix自身会存在性能瓶颈,而且由于默认使用的是关系DB存储,因此在查询性能以及存储空间方面不如prometheus。实践中可能会通过部署多套独立的zabbix来解决规模问题,或者通过二次开发将数据转存到opentsdb这种时序数据库等方法来解决,也可以使用postgresql的扩展为TimescaleDB,不过目前该项技术还处于实验性阶段。

prometheus其本身在数据展示方面比较简单,在告警的处理上也只是简单的通知,因此一般情况下会结合grafana进行数据展示,与alertmanager结合进行告警的抑制、屏蔽等。其告警规则由于采用PromQL语法,与zabbix在告警原理上存在本质不同,因此可以配置更加强大和复杂的告警规则,基本可以覆盖日常的所有告警场景,很多告警指标无需要提前生成。当然prometheus的告警也并非完美,比如某项监控指标如果在某段时间内没有上报数据,就可能导致告警误报的情况,即nodata问题,这个在后续文章中将讲述如何处理。

何时zabbix最优

  1. 规模较小,小于1000台设备,无需处理海量指标

  2. 需要监控服务器、网络设备等传统基础监控信息

  3. 需要丰富的监控功能组件和预定义模板

何时prometheus最优

  1. 需要监控容器、服务网格、微服务等云原生环境

  2. 规模较大、指标多、高可扩展性

  3. 需要更加丰富的告警规则、更加全面的数据分析

监控系统也不是一劳永逸,如何充分利用好这些系统,还有很多事情需要去做。比如zabbix中的主机监控,如何去维护hostgroup、配置各种模板、网络自发现、自动加监控、去监控、进行监控数据的后处理,分析等。promethues中如何进行数据清洗、数据丰富,如何配置告警规则生效时间,关联cmdb、告警事件后续如何处理等等。

 很多公司由于开展监控比较早,因此可能同时存在这两套监控系统,各取所长。为了充分利用prometheus在数据分析处理方面的优势,我们也可以将zabbix的数值型数据转换到prometheus的tsdb数据库中,统一对数据进行监控、分析等。

将zabbix监控数据转换为prometheus的tsdb数据的方法一般有两种,一种是直接通过读取数据库数据进行转换,另一种是通过zabbix的api进行读取,通过api读取比较简单,可以不用关注zabbix本身存储的是哪种数据格式。

关于zabbix转换到prometheus的方法,可以参考github.com/veops/ops-t…