加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

从零写一个时间序列数据库

发布时间:2019-06-19 07:24:07 所属栏目:编程 来源:Fabian Reinartz
导读:编者按:Prometheus 是 CNCF 旗下的开源监控诉警办理方案,它已经成为 Kubernetes 生态圈中的焦点监控体系。本文作者Fabian Reinartz 是Prometheus 的焦点开拓者,这篇文章是其于 2017 年写的一篇关于Prometheus 中的时刻序列数据库的计划思索,固然写作时
副问题[/!--empirenews.page--]

从零写一个时刻序列数据库

编者按:Prometheus 是 CNCF 旗下的开源监控诉警办理方案,它已经成为 Kubernetes 生态圈中的焦点监控体系。本文作者 Fabian Reinartz 是 Prometheus 的焦点开拓者,这篇文章是其于 2017 年写的一篇关于 Prometheus 中的时刻序列数据库的计划思索,固然写作时刻有点久了,可是个中的思量和思绪很是值得参考。长文预警,请坐下来逐步咀嚼。


我从事监控事变。出格是在 Prometheus 上,监控体系包括一个自界说的时刻序列数据库,而且集成在 Kubernetes 上。

在很多方面上 Kubernetes 揭示出了 Prometheus 全部的计划用途。它使得一连陈设continuous deployments弹性伸缩auto scaling和其他高动态情形highly dynamic environments下的成果可以等闲地会见。查询语句和操纵模子以及其余观念决定使得 Prometheus 出格得当这种情形。可是,假如监控的事变负载动态水平明显地增进,这就会给监控体系自己带来新的压力。思量到这一点,我们就可以出格致力于在高动态或瞬态处事transient services情形下晋升它的示意,而不是回过甚来办理 Prometheus 已包办理的很好的题目。

Prometheus 的存储层在汗青以来都揭示出卓越的机能,单一处事器就可以或许以每秒数百万个时刻序列的速率摄入多达一百万个样本,同时只占用了很少的磁盘空间。尽量当前的存储做的很好,但我仍旧提出一个新计划的存储子体系,它可以批改现存办理方案的弱点,并具备处理赏罚更大局限数据的手段。

备注:我没稀有据库方面的配景。我说的对象也许是错的并让你误入邪路。你可以在 Freenode 的 #prometheus 频道上对我(fabxc)提出你的品评。

题目,困难,题目域

起首,快速地概览一下我们要完成的对象和它的要害困难。我们可以先看一下 Prometheus 当前的做法 ,它为什么做的这么好,以及我们规划用新计划办理哪些题目。

时刻序列数据

我们有一个网络一段时刻数据的体系。

  1. identifier -> (t0, v0), (t1, v1), (t2, v2), (t3, v3), ....

每个数据点是一个时刻戳和值的元组。在监控中,时刻戳是一个整数,值可所以恣意数字。64 位浮点数对付计数器和丈量值来说是一个好的暗示要领,因此我们将会行使它。一系列严酷单调递增的时刻戳数据点是一个序列,它由标识符所引用。我们的标识符是一个带有标签维度label dimensions字典的怀抱名称。标签维度分别了单一指标的丈量空间。每一个指标名称加上一个独一标签集就成了它本身的时刻序列,它有一个与之关联的数据流value stream

这是一个典范的序列标识符series identifier集,它是统计哀求指标的一部门:

  1. requests_total{path="/status", method="GET", instance=”10.0.0.1:80”}
  2. requests_total{path="/status", method="POST", instance=”10.0.0.3:80”}
  3. requests_total{path="/", method="GET", instance=”10.0.0.2:80”}

让我们简化一下暗示要领:怀抱名称可以看成另一个维度标签,在我们的例子中是 __name__。对付查询语句,可以对它举办非凡处理赏罚,但与我们存储的方法无关,我们后头也接见到。

  1. {__name__="requests_total", path="/status", method="GET", instance=”10.0.0.1:80”}
  2. {__name__="requests_total", path="/status", method="POST", instance=”10.0.0.3:80”}
  3. {__name__="requests_total", path="/", method="GET", instance=”10.0.0.2:80”}

我们想通过标签来查询时刻序列数据。在最简朴的环境下,行使 {__name__="requests_total"} 选择全部属于 requests_total 指标的数据。对付全部选择的序列,我们在给定的时刻窗口内获取数据点。

在更伟大的语句中,我们或者想一次性选择满意多个标签的序列,而且暗示比相称前提更伟大的环境。譬喻,非语句(method!="GET")或正则表达式匹配(method=~"PUT|POST")。

这些在很洪流平上界说了存储的数据和它的获取方法。

纵与横

在简化的视图中,全部的数据点可以漫衍在二维平面上。程度维度代表着时刻,序列标识符域经纵轴睁开。

  1. series
  2. ^
  3. | . . . . . . . . . . . . . . . . . . . . . . {__name__="request_total", method="GET"}
  4. | . . . . . . . . . . . . . . . . . . . . . . {__name__="request_total", method="POST"}
  5. | . . . . . . .
  6. | . . . . . . . . . . . . . . . . . . . ...
  7. | . . . . . . . . . . . . . . . . . . . . .
  8. | . . . . . . . . . . . . . . . . . . . . . {__name__="errors_total", method="POST"}
  9. | . . . . . . . . . . . . . . . . . {__name__="errors_total", method="GET"}
  10. | . . . . . . . . . . . . . .
  11. | . . . . . . . . . . . . . . . . . . . ...
  12. | . . . . . . . . . . . . . . . . . . . .
  13. v
  14. <-------------------- time --------------------->

Prometheus 通过按期地抓取一组时刻序列的当前值来获取数据点。我们从中获取到的实体称为方针。因此,写入模式完全地垂直且高度并发,由于来自每个方针的样本是独立摄入的。

这里提供一些丈量的局限:单一 Prometheus 实例从数万个方针中网络数据点,每个数据点都袒露在数百到数千个差异的时刻序列中。

在每秒收罗数百万数据点这种局限下,批量写入是一个不能妥协的机能要求。在磁盘上分手地写入单个数据点会相内地迟钝。因此,我们想要按次序写入更大的数据块。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读