草庐IT

融合Zabbix和Prometheus,打造无短板可视化的监控不难!

徐良 2023-03-28 原文

​一、监控工具简介

1、Zabbix

Zabbix 是由Alexei Vladishev开源的分布式监控系统,是一个企业级的分布式开源监控方案。2004年3月发布1.0 稳定版,比Prometheus早了10年以上。能够监控各种网络参数以及服务器健康性和完整性的软件。使用灵活的通知机制,允许用户为几乎任何事件配置基于邮件的告警。

后端使用数据库存储监控配置和历史数据,可以较为方便地对接数据分析、报表定制等渠道,在前端开放了丰富的 RESTful API 供第三方平台调用,整体架构符合当前 DevOps 的趋势。

2、Prometheus

Prometheus是由前Google员工创办公司SoundCloud开发的开源监控报警系统和时序列数据库。相对于k8s是Google Borg系统的开源实现,Prometheus是Google BorgMon的开源实现。

Prometheus 由两个部分组成,一个是监控报警系统,另一个是自带的时序数据库(TSDB)。

Prometheus 在开源社区十分活跃,在 GitHub 上拥有四万多Star,并且系统每隔两三周就会有一个小版本的更新,Prometheus 与它的“师兄”k8s 自带云原生的光环,天然能够友好协作。

二、架构对比

1、Zabbix 架构

Zabbix Server​

核心组件,C 语言编写,负责接收 Agent、Proxy 发送的监控数据,也支持 JMX、SNMP 等多种协议直接采集数据。同时,它还负责数据的汇总存储以及告警触发等。

Zabbix Proxy​

可选组件,对于被监控机器较多的情况下,可使用 Proxy 进行分布式监控,它能代理 Server 收集部分监控数据,以减轻 Server 的压力。

Zabbix Agentd​

部署在被监控主机上,用于采集本机的数据并发送给 Proxy 或者 Server,它的插件机制支持用户自定义数据采集脚本。

Agent 可在 Server 端手动配置,也可以通过自动发现机制被识别。数据收集方式同时支持主动 Push 和被动 Pull 两种模式。

  • Database​
用于存储配置信息以及采集到的数据,支持 MySQL、Oracle 等关系型数据库。同时,最新版本的 Zabbix 已经开始支持时序数据库,不过成熟度还不高。

  • Web Server​
Zabbix 的 GUI 组件,PHP 编写,提供监控数据的展现和告警配置。

2、Prometheus架构

  • Prometheus Server​
用于定时抓取数据指标(metrics)、存储时间序列数据(TSDB),TSDB在存储监控的性能会优于传统关系型数据库。

  • Jobs/exporters​
Prometheus 使用各种 exporter 进行监控,exporter 的功能类似于 Zabbix 的 Agent,负责收集监控对象端的数据。

  • Pushgateway​
监控端的数据会用push的方式主动传给此组件,随后被 Prometheus 服务定时 pull 此组件数据即可。

  • Alertmanager​
报警组件,类似于Zabbix的Action,可以进行报警触发,比如发送短信和邮件。

Web UI 用于多样的UI展示,一般为Grafana,还有一些例如配置自动发现目标的小组件和后端存储组件。

三、Zabbix和Prometheus优劣 

1、Zabbix的优势

  • 产品成熟​
由于诞生时间长且使用广泛,拥有丰富的文档资料以及各种开源的数据采集插件,能覆盖绝大部分监控场景,支持很多不同类型的设备和平台。

  • 采集方式丰富​
支持Agent、SNMP、JMX、SSH 等多种采集方式,以及主动和被动的数据传输方式,Agent可以更好地进行统一标准化配置。

  • 较强的扩展性​
支持 Proxy 分布式监控,有Agent 自动发现功能,插件式架构支持用户自定义数据采集脚本。

  • 配置管理方便​
能通过Web界面进行监控和告警配置,操作方便,上手简单。

2、Prometheus的优势

  • 较强的处理能力​
监控数据直接存储在 Prometheus Server 本地的时序数据库中,单个实例可以处理数百万的 Metrics。

  • 灵活的数据模型​
引入了Tag,属于多维数据模型,聚合统计更方便,支撑不同团队个性化展现。

  • 强大的查询语句​
PromQL 允许在同一个查询语句中,对多个 Metrics 进行加法、连接和取分位值等操作。

  • 支持云环境​
能自动发现容器,同时 K8s 和 Etcd 等项目都提供了对 Prometheus 的原生支持,是目前容器监控最流行的方案。

3、对比

Zabbix 属于老牌的监控系统,资料多,功能全面且稳定,90%以上的配置可以通过Web 端统一操作和实现,比强依赖于配置文件的 Prometheus 要更为方便。

Prometheus有灵活的数据模型、更成熟的时序数据库,大数据量情况下性能更高。支持和Grafana 做快速集成,组合美观且强大的可视化体验,支持为不同团队提供更个性化的展现。

纯容器的环境,毫无疑问Prometheus是更适合的选择,Prometheus是天生为容器化平台打造的监控系统,环境很复杂,有各种操作系统、硬件、中间件、数据库、机房等,那么Zabbix更适合的监控平台,Zabbix兼顾了监控的深度和广度,实现了统一监控平台的目的;但当监控服务器上万,或者监控周期较长,超过了一年,需要面向不同团队灵活可视化展现时,Prometheus又有很强的优势。

四、Zabbix使用现状

公司按照业务线已经划分多套zabbix,运行稳定,但监控数据分散,无法集中化管理,多维度可视化能力较弱,数据存储周期过短,不方便容量预测和管理。

实时监控数据

监控趋势图

主机组

1、Zabbix 数据库表结构

1)配置数据

① hosts表

存储被监控主机的信息。

常用字段介绍如下:

  • Hostid:唯一标识Host在Zabbix及数据库中的id。不同表之间的关联也要用hostid。
  • Proxy_hostid:若启用“proxy-server”架构,才会出现被监控机器的proxy_hostid。
  • Host:被监控机器的名字。
  • Status:机器目前的状态。“0”为正常监控,“1”为disable。
② items表

存储所有监控项,利用hostid在items表中查询该主机有那些监控项,itemid为监控项的id,name为监控项的名称,key_为键值,也就是表达式,怎么对监控项取值。

  • itemid:item的id。
  • type:item的type,和前端见面配置item的type的对应。数据库中,这一列的值是0到17的数字,分别代表不同的类型。
  • hostid:item所在的host的hostid。如果该item是属于template,那么这里显示的是templateid。
  • name:item的名字。
  • key_:item的key。
  • status:item的状态。
  • value_type:item返回值的类型,配置item时候配置的“Type of Information”。
③ hosts_groups表

存储了host(主机)与host groups(主机组)的关联关系。

④ Host_groups表

主机组,zabbix上主机组命名规范化,方便多维度查找。

姓名_部门_产品_集群名

⑤ problem表

存储问题事件。

查询当前未恢复的问题事件Top10  并将时间戳转换为格式化时间。

SELECT p.eventid as 事件id,FROM_UNIXTIME(p.clock,'%Y-%m-%d %H:%i:%s') as clock,p.name as 触发事件,p.severity as 事件等级 FROM problem p WHERE p.source='0' AND p.object='0' AND NOT EXISTS (SELECT NULL FROM event_suppress es WHERE es.eventid=p.eventid) AND p.r_eventid IS NULL ORDER BY p.eventid DESC LIMIT 10;
2)历史数据

Zabbix系统针对每个监控项在每次采集时所收集到的数据,这个数据保存Zabbix系统数据库的历史表中。监控的主机的数量较多的时候,zabbix系统每台产生的数量是非常庞大的,这对数据库是一种负担。建议对数据库进行分区或尽量减小历史数据的保留天数,以免给数据库系统带来很大的压力。

①history表:​存储信息类型为浮点数的监控项历史数据。

  • history_log表:​存储信息类型为日志的监控项历史数据。
  • history_str表:​存储信息类型为字符的监控项历史数据。
  • history_text表:​存储信息类型为文本的监控项历史数据。
  • history_uint表:​存储信息类型为数字(无正负)的监控项历史数据。
② history表结构

  • itemid: 监控项唯一标识id。
  • clock: 时间戳整数部分。
  • value:监控项的值。
  • ns:纳秒数。
查询 2022/06/07 00:00:00 -2022/06/08 00:00:00 itemid 29175 浮点数监控项历史数据。

select itemid,from_unixtime(clock) as time,value from history where itemid=29175 and clock >= unix_timestamp('2022/06/07 00:00:00') and clock <= unix_timestamp('2022/06/08 00:00:00');

五、super_exporter

为了解决zabbix存在的不足,我们进行了zabbix和Prometheus融合监控项目,通过为每套zabbix数据库开发部署一套super_exporter,定期从数据库抓取该zabbix下的所有监控服务器性能数据,上报给Prometheus。为了减轻主数据库压力,提升响应速度,为每套zabbix新增一个独立从库,专门为super_exporter抓取数据使用。

prometheus配置抓取任务,主机多的情况下,单个zabbix下总监控项会达到上万,性能优化后确保总执行时间不超过30s。

Metrics返回该zabbix管理的所有监控主机对应的多个监控项性能指标,涉及dba,host,产品部门,产品,集群,机房等标签。

super_exporter从hosts表获取本zabbix实例管理的监控主机集合,从hstgrp表获取主机对应运维负责人、部门、产品、集群名等业务层多维数据。从zabbix实例本身部署情况获取机房位置等数据,从items获取需要集中管理的监控项,从history类表抓取最近采集周期的监控数据。

六、Grafana展现

通过抓取zabbix汇聚的监控数据,存于TSD时序数据库,利用PromQL语言进行相关监控项的多标签聚合计算。使用grafana灵活强大的多维度可视化能力,方便及时地进行性能风险识别,进行长生命周期的资源容量预估。

通过数据行列转化,实例健康指数积分计算和排序,风险实例头部展示,临近性能值趋势对比,实时查看实例整体运行情况。

实时聚合多机房zabbix监控告警,集中化展现当前告警项;同时记录历史告警,审计告警趋势。

zabbix和prometheus融合,能够结合zabbix的成熟生态、配置灵活性和Prometheus的存储、展现优势,提供更强大的监控能力,支撑家庭业务百亿级人机物连接相关监控数据存储。单个Prometheus支持百万级Metrics,但随着接入zabbix的增多,监控数据时间存储周期拉长,未来将引入Thanos进行Prometheus长期化存储。同时super_exporter未来对接cmdb系统,匹配更多的业务标签数据,支持更多维的统计计算能力,满足公司不同团队的定制化数据展示需求。​

有关融合Zabbix和Prometheus,打造无短板可视化的监控不难!的更多相关文章

  1. ruby - Ruby 中的波形可视化 - 2

    我即将开始一个将录制和编辑音频文件的项目,我正在寻找一个好的库(最好是Ruby,但会考虑Java或.NET以外的任何库)以进行实时可视化波形。有人知道我应该从哪里开始搜索吗? 最佳答案 要流入浏览器的数据量很大。Flash或Flex图表可能是唯一能提高内存效率的解决方案。Javascript图表往往会因大型数据集而崩溃。 关于ruby-Ruby中的波形可视化,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.c

  2. Unity数据可视化图表插件XCharts3.0发布 - 2

    Unity数据可视化图表插件XCharts3.0发布历时8个多月,业余时间,断断续续,XCharts3.0总算发布了。如果要打个满意度,我给3.0版本来个80分。对于代码框架结构设计的调整改动,基本符合预期,甚是满意。相比之前的1.0和2.0版本,我认为3.0才是一个拿得出手给广大开发者使用的版本。1.0发布的时候,很兴奋,从0.1到1.0,也磨了一年,真的等不及想给大家试用了,还特地写过一篇文章以示庆祝。那个时候,1.0虽然还还不够完善,功能也不够丰富,但它是XCharts的开始,没有1.0,也就没有后面的2.0和3.0。后面的2.0发布,做了很多改进和优化,随着版本迭代,慢慢的发现有不少硬

  3. micropython复现经典单片机项目(二)可视化音频 频谱解析(基本搞定) - 2

    本人是音乐爱好者,从小就特别喜欢那个随着音乐跳动的方框效果,就是这个:arduino上一大把对,我忍你很久了,我就想用mpy做,全网没有,行我自己研究。果然兴趣是最好的老师,我之前有篇博客专门讲音频,有兴趣的可以回顾一下。提到可视化频谱,必然绕不开fft,大学学过这玩意,当时一心玩,老师讲的一个字都么听进去,网上教程简略扫了一下,大该就是把时域转频域的工具,我大mpy居然没有fft函数,奶奶的,先放着。音频信息如何收集?第一种傻瓜式的ADC,模拟转数字,原始粗暴,第二种,I2S库,我之前博客有讲过,数据是PCM编码。然后又去学PCM编码,一学豁然开朗,舒服,以代码为例:audio_in=I2S

  4. ruby-on-rails - Ruby On Rails 4.2 的可视化日志查看器 - 2

    我以前在Laravel4上工作过,它有一个很棒的日志查看器工具laravellogviewer查看demo我正在寻找与Rubyonrails4.2非常相似的东西,如果你们知道Rails4.2的任何好的可视化日志记录GEM,请告诉我..从代码我需要记录不同的日志级别,这个工具应该直观地组织我的日志,谢谢.. 最佳答案 这应该可以帮助您入门https://github.com/shadabahmed/logstasher如其所说Thisgemisheavilyinspiredfromlograge,butit'sfocusedonone

  5. ruby - 融合表 : Why do I keep getting a "400 Bad Request" error when trying to update a table style via Ruby's RestClient gem - 2

    我正在尝试使用RubygemRestClient为我的一个FusionTables更新样式。这是我的代码:require'rest_client'tableId=''styleId=''key=''table_url="https://www.googleapis.com/fusiontables/v1/tables/#{tableId}/styles/#{styleId}?key=#{key}"update='{"polygonOptions":{"strokeColor":"#ffffff"}}'token='STRINGCONTAININGAUTHORIZATIONTOKEN'R

  6. 视频融合技术解决方案,三维全景拼接赋能平台 - 2

    近年来,随着信息化时代的到来,三维全景拼接以视频监控领域为代表的智能硬件公司迅速崛起,随后全国各地在视频监控领域进行了大量的建设。但随着摄像头数量的增加,视频监控画面离散、庞杂、关联性差等诸多问题日渐凸显。如何优化现有视频技术,助力管理者或使用者有效、直观、准确地掌控现场实时动态,成为我国信息化前行路上面临的新课题。视频融合技术平台解决方案北京智汇云舟科技有限公司成立于2012年,专注于创新性的“视频孪生(实时实景数字孪生)”技术研发与应用。公司依托自研三维地理信息引擎(3DGIS),融合建筑信息模型(BIM)、视频监控(Video)、人工智能(AI)及物联网(IOT)等多种技术,并在此基础上

  7. “数实融合 元力觉醒”,苏州市元宇宙生态大会圆满召开! - 2

     为贯彻落实《苏州市培育元宇宙产业创新发展指导意见》,抢抓数字经济发展新机遇,加速培育与元宇宙发展相关的技术底座,“数实融合元力觉醒——苏州市软件行业协会元宇宙专委会成立大会暨元宇宙生态大会”于4月14日成功举办。 苏州和数智能软件有限公司作为苏州市软件行业协会元宇宙专委会轮值理事长单位,参加了“元宇宙专委会揭牌与轮值理事长单位授牌仪式”。 大会上,数字主持人“丹丹”向社会发布了由苏州市软件行业协会、苏州市软件行业协会元宇宙专委会、西交利物浦大学、苏州科技大学、苏州和数智能软件有限公司等单位编写的《元宇宙行业分析报告2023》。该报告立足苏州、辐射长三角,系统梳理了元宇宙行业现状、元宇宙核心技

  8. 通过可视化运维配置,实现故障秒级自愈 - 2

    急促的告警铃声响彻寂静的夜晚。对运维人来说,晚间值守耗费更大的精力,往往一个简单的磁盘使用率告警通知,就不得不爬起来进行处理,毕竟告警无小事,对于小问题,运维人也不能心存侥幸心理。虽然有着值班人员和团队的支撑,但频繁的告警还是让运维人员精疲力竭,如何让系统的稳定性提高,减轻一线人员的工作量,减轻一线人员的压力?通过智能运维,实现故障自愈将成为不可避免的选择。故障自愈是提升企业网络系统可用性和降低故障处理的人力投入,实现故障自愈从"人工处理"到"无人值守"的变革。通过实时发现告警,进行预诊断分析,判断告警类型和级别,如果是一般告警,平台进行自动恢复,如果是严重复杂告警则通过告警通知、运维工单等形

  9. 推出 JetBrains Aqua:为测试自动化打造的强大 IDE初步了解 - 2

    目录啥是Aqua? 视频介绍初体验​小伙伴可能遇到问题总结:啥是Aqua?        JetBrainsAqua是一款可以感知上下文的智能IDE,能够理解Java、Kotlin、Python、JavaScript、TypeScript和SQL等语言,并为每种语言提供智能编码辅助。详情链接JetBrainsAqua官网速达-下载         在Aqua中,我们融合了测试自动化工程师在日常工作中需要的一切,包括多语言IDE(支持JVM、Python和JavaScript等)、HTTP客户端、数据库管理功能、Docker支持、TMS客户端,以及一款用于UI自动化的新型强大Web检查器。 视频

  10. 基于深度学习的轴承寿命预测实践,开发CNN、融合LSTM/GRU/ATTENTION - 2

    关于轴承相关的项目之前做的大都是故障识别诊断类型的,少有涉及回归预测的,周末的时候宅家发现一个轴承寿命加速实验的数据集就想着拿来做一下寿命预测。首先看下数据集如下:直接百度即可搜到,这里就不再赘述了。Learning_set为训练集Test_set为测试集我这里为了简单处理直接使用Learning_set作为总数据集,随机划分指定比例作为测试集。当然了你也可以选择分别读取加载两部分的数据分别作为训练集和测试集都可以的。每个目录下都是一堆csv文件,样例如下:样例数据内容如下:9,11,19,1.1879e+05,0.059,-0.3729,11,19,1.1883e+05,0.603,-0.0

随机推荐