【好书推荐】Prometheus和这些监控系统有啥异同?

优采云 发布时间: 2021-03-25 23:10

  【好书推荐】Prometheus和这些监控系统有啥异同?

  原创标题:普罗米修斯为什么能替代Zabbix?

  本文是根据dbaplus社区的第198次在线共享而编写的,在文章的结尾有不错的书籍推荐〜

  讲师介绍

  

  一、简介

  Kubernetes自2012年开源以来,已成为容器调度和编排中不可阻挡的领导者。Kubernetes是Google Borg系统的开源实现,与Prometheus相对应的是Google BorgMon的开源实现。 Prometheus是SoundCloud开发的开源监视警报系统和时间序列数据库。从字面上理解,普罗米修斯由两部分组成,一个是监视警报系统,另一个是它自己的时间序列数据库(TSDB)。

  2016年,由Google发起的Linux基金会下的Cloud Native Computing Foundation将Prometheus列为其第二大开源项目。 Prometheus在开源社区中也非常活跃,在GitHub上拥有超过20,000个Star,并且该系统每隔一到两周就会进行一次小版本更新。

  二、各种监视工具的比较

  实际上,在Prometheus之前,市场上有许多监视系统,例如Zabbix,Open-Falcon,Nagios等。那么Prometheus与这些监视系统之间的异同是什么?让我们简要回顾一下这些监视系统。

  1、 Zabbix

  Zabbix是Alexei Vladishev的开源分布式监视系统。它支持多个采集方法和采集客户端。它还支持SNMP,IPMI,JMX,Telnet,SSH和其他协议。它将采集接收到的数据存储在数据库中,然后进行分析和整理。如果符合警报规则,则会触发相应的警报。

  

  Zabbix的核心组件主要是代理和服务器。代理主要负责采集数据,并通过主动或被动采集将数据发送到服务器/代理。此外,为了扩展监视项目,代理还支持执行自定义脚本。服务器主要负责接收代理发送的监视信息,将其存储在一起并触发警报。

  Zabbix服务器将采集的监视数据存储在Zabbix数据库中。 Zabbix数据库支持常用的关系数据库。如果是MySQL,PostgreSQL,Oracle等,则默认值为MySQL,并在Zabbix网页(用PHP编写)上提供数据查询。

  由于Zabbix使用关系数据存储时间序列数据,因此在监视大型集群时,它经常在数据存储方面遇到困难。因此,从Zabbix 4. 2版本开始,就支持TimescaleDB时间序列数据库,但目前成熟度不高。

  2、 Open-Falcon

  

  Open-Falcon是使用Mi语言开发的小米开源企业级监视工具。小米,滴滴,美团等互联网公司都在使用它。它是一种灵活,可扩展的高级性能监控程序的主要组件包括:

  1) Falcon-agent是使用Go语言开发的Daemon程序。它运行在每台Linux服务器上,并用于采集主机上的各种索引数据,主要包括CPU,内存,磁盘,文件系统,内核参数,套接字连接等,目前支持200多个监视指示器。此外,该代理还支持用户定义的监视脚本。

  2)心跳服务器缩写为HBS心跳服务。每个代理都会通过RPC定期向HBS报告其状态,该RPC主要包括主机名,主机IP,代理版本和插件版本,并且代理还将从HBS接收信息。获取采集任务和所需的自定义插件表演。

  3) Transfer负责接收代理发送的监视数据,对数据进行排序,并在过滤后通过一致的哈希算法将其发送给Judge或Graph。

  4) Graph是基于RRD的数据报告,归档和存储组件。 Graph接收到数据后,将其存储在rrdtool的数据归档方法中,同时将提供RPC方法的监视和查询界面。

  5)判断警报模块,传输转发到判断的数据将触发用户设置的警报规则,如果满足,它将触发电子邮件,微信或回调界面。在这里,为了避免重复警报,引入了Redis临时存储警报,以完成警报的组合和抑制。

  6)仪表板是一个面向用户的监视数据查询和警报配置界面。

  3、 Nagios

  

  Nagios最初称为NetSaint,由Ethan Galstad开发和维护。 Nagios是用C语言编写的高级监视工具,主要用于主机监视(CPU,内存,磁盘等)和网络监视(SMTP,POP 3、 HTTP和NNTP等),当然,它还支持用户定义的监视脚本。

  它还支持更通用,更安全的采集方法,即NREP(Nagios远程插件执行器)。它首先在远程主机上启动NREP守护程序,以在远程主机上运行检测命令并在Nagios中提供服务。check nrep插件用于通过SSL连接到NREP守护程序,以执行相应的监视操作。与SSH远程执行命令相比,此方法更安全。

  4、普罗米修斯

  

  Prometheus是SoundCloud开发的开源监视警报系统和时间序列数据库。 Prometheus的基本原理是通过HTTP定期捕获受监视组件的状态。只要组件提供相应的HTTP接口并符合Prometheus定义的数据格式,任何组件都可以访问Prometheus监视。

  Prometheus Server负责定期在目标上获取指标数据并将其保存到本地存储中。 Prometheus使用pull方法获取数据,这不仅降低了客户端的复杂性,而且客户端只需要采集个数据,而无需了解服务器的情况,因此可以更方便地水平扩展服务器。

  如果监视数据达到警报阈值,则Prometheus Server将通过HTTP将警报发送到警报模块alertmanger,并在抑制警报后触发电子邮件或Webhook。 Prometheus支持PromQL以提供多维数据模型和灵活的查询。通过将多个标签与监视指标相关联,可以在任意维度上组合和汇总监视数据。

  5、全面比较

  

  1)与上表相比,从开发语言的角度来看,为了满足高并发和快速迭代的需求,监视系统的开发语言已逐渐从C语言转换为Go。必须说,当Java占用业务开发和C占用基础开发时,Go依靠简洁的语法和优雅的并发来准确地定位中间件开发需求,并且在当前的开源中间件产品中得到了广泛的应用。

  2)从系统成熟度的角度来看,Zabbix和Nagios都是老牌的监视系统:Nagios于1999年出现,Zabbix于1998年出现。系统功能相对稳定和成熟。普罗米修斯(Prometheus)和开放猎鹰(Open-Falcon)都是近年出生的。尽管功能仍在迭代更新中,但它们站在巨人的肩膀上,并借鉴了许多在建筑设计中已建立的监控系统的经验;

  3)从系统可伸缩性的角度来看,Zabbix和Open-Falcon都可以自定义各种监视脚本,并且Zabbix不仅可以进行主动推送,还可以进行被动推送。 Prometheus定义了一套Monitor数据规范,并通过各种导出器扩展了系统采集的功能。

  4)从数据存储的角度来看,Zabbix使用关系数据库存储,这极大地限制了Zabbix 采集的性能。 Nagios和Open-Falcon都使用RDD数据存储,并且Open-Falcon还增加了一致性。哈希算法对数据进行分片并可以连接到OpenTSDB,而Prometheus自行开发了一套高性能时间序列数据库,可以实现数十个V3版本中每秒可存储数百万个数据,并通过连接到第三方时间序列数据库来扩展历史数据的存储;

  5)就配置复杂性而言,Prometheus只有一个核心服务器组件,可以用一个命令启动。相比之下,其他系统配置则相对麻烦,尤其是Open-Falcon。

  6)从社区活动的角度来看,Zabbix和Nagios当前的社区活动相对较低,尤其是Nagios。尽管Open-Falcon也相对活跃,但它基本上是国内公司的参与,而Prometheus占据了这一领域。绝对优势,社区是最活跃的,并在CNCF的支持下,后期的发展值得期待;

  7)从容器支持的角度来看,由于Zabbix和Nagios出现得较早,所以容器当时不是诞生的,自然对容器的支持相对较差。尽管Open-Falcon提供了容器监视,但是其支持是有限的。 Prometheus的动态发现机制不仅支持大量的本机集群,而且还支持监视Kubernetes容器集群。目前,它是用于容器监视的最佳解决方案。 Zabbix在传统监控系统中具有绝对优势,尤其是在与服务器相关的监控中。 Nagios广泛用于网络监控。随着容器的发展,Prometheus已开始成为容器监视中的主导和标准配置,并将在可预见的将来广泛使用。

  总的来说,通过比较各种监视系统的优缺点,普罗米修斯可以说是监视领域中最犀利的“瑞士*敏*感*词*”。

  三、普罗米修斯函数介绍

  下图是Prometheus的总体体系结构。左侧是各种数据源,主要是符合Prometheus数据格式的出口商。另外,为了支持推送数据的代理,可以使用Pushgateway将Push转换为Pull。 Prometheus甚至可以从其他Prometheus获取数据,稍后将在引入联盟时对其进行详细描述。

  

  图片的上方是服务发现。 Prometheus支持受监视对象的自动发现机制,以便可以动态获取受监视对象。尽管Zabbix和Open-Falcon也支持动态发现机制,但是Prometheus支持最完善的机制。

  图片的中心是核心。数据通过“检索”模块定期拉出,数据通过“存储”模块保存。 PromQL是Prometheus提供的查询语法。 PromQL解析语法树并查询存储模块以获得监视数据。图片的右侧是警报和页面显示。除了Prometheus随附的Webui之外,页面视图还可以通过诸如grafana之类的组件查询Prometheus监视数据。

  Prometheus指标格式分为两部分:一个是指标名称,另一个是指标标签。格式如下:

  {=,...}

  标签可以反映指示器的尺寸特征。例如,对于指标http_request_total,可以有两个标签{status =“ 200”,method =“ POST”}和{status =“ 200”,method =“ GET”}。当您需要获取从GET和POST返回200的请求时,可以分别使用以上两个指示符。当您需要获取所有返回200的请求时,可以通过http_request_total {status =“ 200”}完成数据汇总,这非常方便且通用。

  普罗米修斯指标有四种类型:

  1) Counter(计数器):对统计信息,累积量进行计数或累积次数等进行计数。其特征是它只会增加而不减少,例如HTTP访问的总次数;

  2) Gauge(仪表盘):数据是一个瞬时值,如果当前的内存使用情况,它会随时间上下波动。

  如果您需要了解某个时间段内请求的响应时间,通常的做法是使用平均响应时间,但这不能反映数据的长尾效应。例如,HTTP服务器的正常响应时间为30毫秒,但很少有3秒钟的请求。很难通过平均响应时间来区分长尾效应,因此Prometheus引入了直方图和摘要。

  3)直方图(直方图):服务器端分位数,不同时间间隔内的样本数量,例如类别得分,低于60的9得分,低于70的10得分以及低于80 50的得分。

  4)摘要(摘要):客户端分位数,直接在客户端传递分位数,或使用类结果作为示例:0.第8个四分位数为80点,0. 9分为85分,0. 99分是98分。

  

  Prometheus通过HTTP接口从各种客户端获取数据。这些客户端必须符合Prometheus监视数据格式。通常有两种方法,它们始终是侵入式监视。如果Kubernetes API直接集成在客户端上通过引入Prometheus go客户端,将提供/ metrics接口以查询kubernetes API的各种指标。

  另一种方法是使用导出器从外部将各种中间件的原创监视支持转换为Prometheus的监视数据格式。例如,redis导出器将reids指示符转换为Prometheus可以识别的HTTP请求。

  Prometheus不使用json数据格式,而是使用纯文本/纯文本,这是它的特殊功能。

  HTTP返回标头和正文,如上图所示。指标#的前两行是注释,用于标识指标的含义和类型。指标和指标值之间用空格隔开。开发人员通常不需要自己缝合大量数据。 Prometheus提供了多种语言的SDK支持。

  

  Prometheus提供了一个导出器,以支持各种中间件和第三方监视。您可以将其理解为监视适配器,以将不同指标类型和格式的数据统一转换为Prometheus可以识别的指标类型。

  例如,Node导出器主要通过读取Linux的/ proc和/ sys目录中的系统文件来获取操作系统的运行状态,reids导出器通过reids命令行获取指示符,而mysql导出器获取mysql通过读取数据库性能数据监视表。 。他们将这些异构数据转换为标准的Prometheus格式,并提供HTTP查询接口。

  

  Prometheus提供了两种数据持久性方法:一种是本地存储,通过Prometheus附带的tsdb(时间序列数据库)将数据保存到本地磁盘。出于性能方面的考虑,建议使用SSD。但是,本地存储的容量毕竟是有限的。建议不要将数据保存超过一个月。 Prometheus本地存储已改善了很多年。 Prometheus 2. 0之后提供的tsdb V3版本具有很高的性能,并且可以在一台机器上支持每秒采集1000w指示器。

  另一个是远程存储,适用于存储和查询大量历史监视数据。通过中间层适配器的转换,Prometheus将数据保存到远程存储中。该适配器实现Prometheus存储的远程写入和远程读取接口,并将数据转换为远程存储支持的数据格式。目前,远程存储主要包括OpenTSDB,InfluxDB,Elasticsearch,M3db,Kafka等,其中M3db是当前非常流行的后端存储。

  

  类似于关系数据库中的SQL,Prometheus还具有内置的数据查询语言PromQL,它为时序数据提供了丰富的查询,聚合和逻辑运算功能。 PromQL主要包括指标名称,过滤器,函数和参数。指标可以执行数据运算,包括+(加法),-(减法),*(乘法),/(除法),%(余数),^(幂运算),聚合函数包括:总和(总和),最小(最小) ),最大(最大值),平均(平均值),标准偏差(标准偏差),计数(计数),最高峰(前n),分位数(分布统计)等。要查询数据,请通过HTTP GET请求发送PromQL查询语句。如:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线