背景对于很多人来说,对于未知的、不确定的、失控的事情,都会下意识地回避。我第一次接触普罗米修斯时也有类似的感觉。对于初学者来说,Prometheus包含的概念太多,门槛太高。概念:Instance、Job、Metric、MetricName、MetricLabel、MetricValue、MetricType(Counter、Gauge、Histogram、Summary)、DataType(InstantVector、RangeVector、Scalar、String)、Operator、Function马老师说:“虽然阿里巴巴是全球最大的零售平台,但阿里不是零售公司,而是数据公司。”Prometheus也是如此,它本质上是一个基于数据的监控系统。日常监控,假设需要监控WebServerA的各个API的请求量为例。需要监控的维度包括:服务名(job)、实例IP(instance)、API名(handler)、方法(method)、返回码(code)、请求量(value)。以SQL为例,演示常用查询操作:查询method=putandcode=200的请求量(红框)SELECT*fromhttp_requests_totalWHEREcode=”200”ANDmethod=”put”ANDcreated_atBETWEEN1495435700AND1495435710;Queryhandler=prometheusandmethod=postrequests(greenbox)SELECT*fromhttp_requests_totalWHEREhandler=”prometheus”ANDmethod=”post”ANDcreated_atBETWEEN1495435700AND1495435710;queryinstance=10.59.8.110并且处理程序从queryRequestvolume(绿框)开始SELECT*fromhttp_requests_totalWHEREhandler=”query”ANDinstance=”10.59.8.110”ANDcreated_atBETWEEN1495435700AND1495435710;从上面的例子我们可以看出,在常见的查询和统计方面,日常监控大多是针对监控的维度进行查询,并结合时间进行查询。如果监控100个服务,每个服务平均部署10个实例,每个服务有20个API,4个方法,每30秒采集一次数据,保存60天。那么数据条总数为:100(服务)10(实例)20(API)4(方法)86400(秒/天)*60(天)/30(秒)=138.24亿条数据,写入和存储,在Mysql这样的关系型数据库上是不可能查询到如此量级的数据的。所以Prometheus使用TSDB作为存储引擎。存储引擎TSDB作为Prometheus的存储引擎,非常适合监控数据的应用场景。存储数据的量级非常大。大多数时候,写操作都是写的。写操作几乎是顺序添加的。大多数时候,当数据到达时,它是按时间顺序写入的。操作很少写入很久以前的数据,也很少更新数据。在大多数情况下,数据会在数据采集后几秒或几分钟后写入数据库。删除操作一般是块删除。选择起始历史时间并指定后续区块。很少在特定时间或单独的随机时间删除数据。基础数据大,一般超过内存大小。一般只选择一小部分,没有规则,缓存几乎没有作用。读取操作在升序或降序中非常典型。高并发读操作很常见。那么TSDB是如何实现上述功能的呢?"labels":[{"latency":"500"}]"samples":[{"timestamp":1473305798,"value":0.9}]原始数据分为标签、样本两部分。前者记录监控的维度(label:labelvalue),指标名和label可选的key-value对唯一确定一个时间序列(用series_id表示);后者包括一个时间戳(timestamp)和一个指标值(value)。系列^│。...........服务器{延迟=“500”}│。................服务器{}│。..........v<--------time---------->TSDB使用timeseries:doc::存储键的值。为了加快常见的查询查询操作:标签和时间范围组合。TSDB额外构建了三个索引:Series、LabelIndex和TimeIndex。以labellatency为例:Series存储两部分数据。一部分是按字典顺序排列的所有标签键值对的序列(series);另一部分是时间线到数据文件的索引,根据时间窗口切割存储数据块记录的具体位置信息,因此在查询大量非查询窗口记录时可以快速跳过dataLabelIndex每一对标签都会使用index:label:作为key来存储标签所有值的列表,并通过引用指向Series的值的起始位置。TimeIndex数据会以index:timeseries::为key,指向对应时间段的数据文件。强大的数据计算存储引擎为数据计算提供完美的辅助,使Prometheus完全不同于其他监控服务。Prometheus可以查询不同的数据序列,然后添加基本的运算符和强大的函数来进行度量级数的矩阵运算(见下图)。这样看来,Promtheus系统的能力并不弱于监控行业的“数据仓库”+“计算平台”。所以大数据在行业应用之初,可以理解为这是未来监控的方向。一次计算,处处查询当然,如此强大的计算能力消耗的资源是恐怖的。因此,查询预先计算好的结果通常比每次都查询原始表达式要快很多,尤其是在仪表盘和告警规则的适用场景中,仪表盘每次刷新都需要重复查询同一个表达式,而告警规则。二次操作也是如此。因此Prometheus提供了Recoding规则,可以对经常需要或者需要大量计算的表达式进行预计算,并将结果保存为一组新的时间序列,从而达到一次计算多次查询的目的。
