为什么说Prometheus是足以替代Zabbix的监控利器?
优采云 发布时间: 2020-08-12 07:11本文按照dbaplus社群第198期线上分享整理而成,文末还有好书推荐哦~
讲师介绍
一、简介
Kubernetes自从2012年开源以来便以不可抵挡之势成为容器领域调度和编排的领头羊,Kubernetes是Google Borg系统的开源实现,于此对应Prometheus则是Google BorgMon的开源实现。Prometheus是由SoundCloud开发的开源监控报案系统和时序列数据库。从字面上理解,Prometheus由两个部份组成,一个是监控报案系统,另一个是自带的时序数据库(TSDB)。
2016年,由Google发起的Linux基金会旗下的原生云基金会(Cloud Native Computing Foundation)将Prometheus列入其第二大开源项目。Prometheus在开源社区也非常活跃,在GitHub上拥有两万多Star,并且系统每隔一两周都会有一个小版本的更新。
二、各种监控工具对比
其实,在Prometheus之前区面早已出现了好多的监控系统,如Zabbix、Open-Falcon、Nagios等。那么Prometheus和那些监控系统有啥优缺呢?我们先简单回顾一下这种监控系统。
1、Zabbix
Zabbix是由Alexei Vladishev开源的分布式监控系统,支持多种采集方式和采集客户端,同时支持SNMP、IPMI、JMX、Telnet、SSH等多种合同,它将采集到的数据储存到数据库中,然后对其进行剖析整理,如果符合告警规则,则触发相应的告警。
Zabbix核心组件主要是Agent和Server,其中Agent主要负责采集数据并通过主动或则被动的方法采集数据发送到Server/Proxy,除此之外,为了扩充监控项,Agent还支持执行自定义脚本。Server主要负责接收Agent发送的监控信息,并进行汇总储存,触发告警等。
Zabbix Server将搜集的监控数据储存到Zabbix Database中。Zabbix Database支持常用的关系型数据库,如果MySQL、PostgreSQL、Oracle等,默认是MySQL,并提供Zabbix Web页面(PHP编撰)数据查询。
Zabbix因为使用了关系型数据储存时序数据,所以在监控*敏*感*词*集群时经常在数据储存方面捉襟见肘。所以从Zabbix 4.2版本后开始支持TimescaleDB时序数据库,不过目前成熟度还不高。
2、Open-Falcon
Open-Falcon是魅族开源的企业级监控工具,用Go语言开发而成,包括魅族、滴滴、美团等在内的互联网公司都在使用它,是一款灵活、可扩充而且高性能的监控方案,主要组件包括了:
1)Falcon-agent是用Go语言开发的Daemon程序,运行在每台Linux服务器上,用于采集主机上的各类指标数据,主要包括CPU、内存、磁盘、文件系统、内核参数、Socket联接等,目前早已支持200多项监控指标。并且,Agent支持用户自定义的监控脚本。
2)Hearthbeat server简称HBS脉搏服务,每个Agent就会周期性地通过RPC形式将自己的状态上报给HBS,主要包括主机名、主机IP、Agent版本和插件版本,Agent就会从HBS获取自己须要执行的采集任务和自定义插件。
3)Transfer负责接收Agent发送的监控数据,并对数据进行整理,在过滤后通过一致性Hash算法发送到Judge或则Graph。
4)Graph是基于RRD的数据上报、归档、存储组件。Graph在收到数据之后,会以rrdtool的数据归档形式来储存,同时提供RPC形式的监控查询插口。
5)Judge告警模块,Transfer转发到Judge的数据会触发用户设定的告警规则,如果满足,则会触发电邮、微信或则反弹插口。这里为了防止重复告警引入了Redis暂存告警,从而完成告警的合并和抑制。
6)Dashboard是面向用户的监控数据查询和告警配置界面。
3、Nagios
Nagios原名为NetSaint,由Ethan Galstad开发并维护。Nagios是一个老牌监控工具,由C语言编撰而成,主要针对主机监控(CPU、内存、磁盘等)和网路监控(SMTP、POP3、HTTP和NNTP等),当然也支持用户自定义的监控脚本。
它还支持一种愈发通用和安全的采集方式NREP(Nagios Remote Plugin Executor),它首先在远端启动一个NREP守护进程,用于在远端主机里面运行监测命令,在Nagios服务端用check nrep的plugin插件通过SSL对接到NREP守护进程执行相应的监控行为。相比SSH远程执行命令的形式,这种形式愈发安全。
4、Prometheus
Prometheus是由SoundCloud开发的开源监控报案系统和时序列数据库。Prometheus的基本原理是通过HTTP周期性抓取被监控组件的状态,任意组件只要提供对应的HTTP插口而且符合Prometheus定义的数据格式,就可以接入Prometheus监控。
Prometheus Server负责定时在目标上抓取metrics(指标)数据并保存到本地储存上面。Prometheus采用了一种Pull(拉)的形式获取数据,不仅增加客户端的复杂度,客户端只须要采集数据,无需了解服务端情况,而且服务端可以愈加便捷的水平扩充。
如果监控数据达到告警阀值Prometheus Server会通过HTTP将告警发送到告警模块alertmanger,通过告警的抑制后触发电邮或则webhook。Prometheus支持PromQL提供多维度数据模型和灵活的查询,通过监控指标关联多个tag的方法,将监控数据进行任意维度的组合以及聚合。
5、综合对比
1)综合对比如前面的表格,从开发语言上看,为了应对高并发和快速迭代的需求,监控系统的开发语言已然渐渐从C语言转移到Go。不得不说,Go凭着简约的句型和甜美的并发,在Java抢占业务开发,C攻打底层开发的情况下,准确定位中间件开发需求,在当前开源中间件产品中被广泛应用。
2)从系统成熟度上看,Zabbix和Nagios都是老牌的监控系统:Nagios是在1999年出现的,Zabbix是在1998年出现的,系统功能比较稳定,成熟度较高。而Prometheus和Open-Falcon都是近来几年才诞生的,虽然功能还在不断迭代更新,但站在巨人的右臂之上,在构架设计上借鉴了好多老牌监控系统的经验;
3)从系统扩展性方面看,Zabbix和Open-Falcon都可以自定义各类监控脚本,并且Zabbix除了可以做到主动推送,还可以做到被动拉取,Prometheus则定义了一套监控数据规范,并通过各类exporter扩充系统采集能力。
4)从数据储存方面来看,Zabbix采用关系数据库保存,这极大限制了Zabbix采集的性能,Nagios和Open-Falcon都采用RDD数据储存,Open-Falcon还加入了一致性hash算法分片数据,并且可以对接到OpenTSDB,而Prometheus自研一套高性能的时序数据库,在V3版本可以达到每秒千万级别的数据储存,通过对接第三方时序数据库扩充历史数据的储存;
5)从配置复杂度上看,Prometheus只有一个核心server组件,一条命令便可以启动,相比而言,其他系统配置相对麻烦,尤其是Open-Falcon。
6)从社区活跃度上看,目前Zabbix和Nagios的社区活跃度比较低,尤其是Nagios,Open-Falcon似乎也比较活跃,但基本都是国外的公司参与,Prometheus在这方面抢占绝对优势,社区活跃度最高,并且遭到CNCF的支持,后期的发展值得期盼;
7)从容器支持角度看,由于Zabbix和Nagios出现得比较早,当时容器还没有诞生,自然对容器的支持也比较差。Open-Falcon即使提供了容器的监控,但支持力度有限。Prometheus的动态发觉机制,不仅可以支持swarm原生集群,还支持Kubernetes容器集群的监控,是目前容器监控最好解决方案。Zabbix在传统监控系统中,尤其是在服务器相关监控方面,占据绝对优势。而Nagios则在网路监控方面有广泛应用,伴随着容器的发展,Prometheus开始成为主导及容器监控方面的标配,并且在未来可见的时间内被广泛应用。
总体来说,对比各类监控系统的好坏,Prometheus可以说是目前监控领域最锋利的“瑞士*敏*感*词*”了。
三、Prometheus功能介绍
下图是Prometheus整体构架图。左侧是各类数据源主要是各类符合Prometheus数据格式的exporter,除此之外为了支持推送数据的Agent,可以通过Pushgateway组件,将Push转化为Pull。Prometheus甚至可以从其它的Prometheus获取数据,后面介绍联邦的时侯详尽介绍。
图片的两侧是服务发觉,Prometheus支持监控对象的手动发觉机制,从而可以动态获取监控对象,虽然Zabbix和Open-Falcon也支持动态发觉机制,但Prometheus支持最健全。
图片中间是核心,通过Retrieval模块定时拉取数据,通过Storage模块保存数据。PromQL是Prometheus提供的查询句型,PromQL通过解析语法树,查询Storage模块获取监控数据。图片左边是告警和页面诠释,页面查看不仅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"}完成数据的聚合,非常方便和通用。
Prometheus指标类型有四种:
1)Counter(计数器):计数统计,累计多长或则累计多少次等。它的特征是只增不减,譬如HTTP访问总数;
2)Gauge(仪表盘):数据是一个瞬时值,如果当前显存药量,它随着时间变化忽高忽低。
如果须要了解某个时间段内恳求的响应时间,通常做法是使用平均响应时间,但这样做未能彰显数据的长尾效应。例如,一个HTTP服务器的正常响应时间是30ms,但有极少几次恳求历时3s,通过平均响应时间很难甄别长尾效应,所以Prometheus引入了Histogram和Summary。
3)Histogram(直方图):服务端分位,不同区间内样本的个数,譬如班级成绩,低于60分的9个,低于70分的10个,低于80分的50个。
4)Summary(摘要):客户端分位,直接在客户端通过分位情况,还是用班级成绩举例:0.8分位的是,80分,0.9分为85分,0.99分为的是98分。
Prometheus通过HTTP插口的形式从各类客户端获取数据,这些客户端必须符合Prometheus监控数据格式,通常由两种形式,一直是侵入式埋点监控,通过在客户端集成假如Kubernetes API直接通过引入Prometheus go client,提供/metrics接口查询kubernetes API各类指标。
另一种是通过exporter形式,在外部将原先各类中间件的监控支持转化为Prometheus的监控数据格式,如redis exporter将reids指标转化为Prometheus才能辨识的HTTP请求。
Prometheus并没有采用json的数据格式,而是采用 text/plain 纯文本的形式 ,这是它的特殊之处。
HTTP返回Header和Body如上图所示,指标后面两行#是注释,标识指标的含意和类型。指标和指标的值通过空格分割,开发者一般不需要自己拼接这些个数的数据, Prometheus提供了各类语言的SDK支持。
Prometheus为了支持各类中间件以及第三方的监控提供了exporter,大家可以把它理解成监控适配器,将不同指标类型和格式的数据统一转化为Prometheus才能辨识的指标类型。
譬如Node exporter主要通过读取linux的/proc以及/sys目录下的系统文件获取操作系统运行状态,reids exporter通过reids命令行获取指标,mysql exporter通过读取数据库监控表获取mysql的性能数据。他们将这种异构的数据转化为标准的Prometheus格式,并提供HTTP查询插口。
Prometheus提供了两种数据持久化形式:一种是本地储存,通过Prometheus自带的tsdb(时序数据库),将数据保存到本地c盘,为了性能考虑,建议使用SSD。但本地储存的容量虽然有限,建议不要保存超过一个月的数据。Prometheus本地储存经过多年改进,自Prometheus 2.0后提供的V3版本tsdb性能早已十分高,可以支持单机每秒1000w个指标的搜集。
另一种是远端储存,适用于大量历史监控数据的储存和查询。通过中间层的适配器的转化,Prometheus将数据保存到远端储存。适配器实现Prometheus储存的remote write和remote read插口并把数据转化为远端储存支持的数据格式。目前,远端储存主要包括OpenTSDB、InfluxDB、Elasticsearch、M3db、Kafka等,其中M3db是目前特别受欢迎的前端储存。
和关系型数据库的SQL类似,Prometheus也外置了数据查询语言PromQL,它提供对时间序列数据丰富的查询,聚合以及逻辑运算的能力。一条PromQL主要包括了指标名称、过滤器以及函数和参数。指标可以进行数据运算,包括+ (加法)、- (减法)、* (乘法)、/ (除法)、% (求余)、^ (幂运算),聚合函数包括了:sum (求和)、min (最小值)、max (最大值)、avg (平均值)、stddev (标准差)、count (计数)、topk (前n条)、quantile (分布统计)等。查询数据通过HTTP GET恳求发送PromQL查询句子。形式如: