本文来自: https://fabxc.org/tsdb/, 如翻译有误,请纠正.

我是从事监控工作的。特别是Prometheus, 一个包含自定义的时间序列库以及集成Kuberntes的监控系统。

在很多方面,Kubernetes代表着所有Prometheus为其设计的所有技术水准。Prometheus使得可持续开发,自动扩展和高度自动化环境更易于实现。在众多其他概念抉择中,Prometheus的查询语言和操作模型使其特别适合这样的环境。另外,如果监控的工作负载变得更加动态化,这样在监控系统本身也添加了新的应变。鉴于这一点,我们不会对Prometheus已经解决的问题翻倍,而是致力于提高高度动态或暂时性服务的性能。

Promethues的存储层已经展现出非凡的性能,单个服务器可以处理达100w每秒的样本数据,即使有数百万条数据,却出人意料的占领一小点磁盘空间。虽然当前的存储已经很好地满足我们的需求,但是我提出一个新的设计存储子系统来当前的解决方案的缺点,以解决接下的更大规模问题。

注意:我在数据库方面没有背景,我所说的可能是错的,有误导性的。你可以在Freenoe的#prometheus频道上批评我。

问题,问题,磁盘空间问题

首先,针对我们试图去完成的和引发的关键问题的快速概述。对每个问题,我们都会看一下Prometheus当前所达到的点,它做得好的地方和即将对问题用新的设计标志出来。

时间序列数据

我们有个收集时间点数据的系统。

识别标志 ->  (t0, v0), (t1, v1), (t2, v2), (t3, v3), ...

每个数据点是一个时间戳和值的数据元组。对于监控的目的,时间戳是一个整数,其值是任意的数字。一个64位的浮点数证明是一个好的计数器同时又是好的计量值。所以接下来,我们就这么这么定义了,一个伴随着监控时间戳增加的数据串是一个识别标志的序列。我们的识别标志是一个带着标签纬度的字典指标。标签纬度分割着测量单个标量的空间。每个标量加一组唯一的标签集合就是他自己的时间序列流。

下面典型的时间序列就是部分统计请求的标量:

requests_total{path="/status", method="GET", instance=”10.0.0.1:80”}

requests_total{path="/status", method="POST", instance=”10.0.0.3:80”}

requests_total{path="/", method="GET", instance=”10.0.0.2:80”}

让我们立即简化以上代表例子:  一个标量名字可以看作另一个标签维度——__nam__(在我们下面的例子)。在数据查询的那层,它可能被特别对待,但我们不关心如何存储它,这个我们之后将会看到。

{__name__="requests_total", path="/status", method="GET", instance=”10.0.0.1:80”}

{__name__="requests_total", path="/status", method="POST", instance=”10.0.0.3:80”}

{__name__="requests_total", path="/", method="GET", instance=”10.0.0.2:80”}

当我们查询时序数据时,我们依靠数据的标签来查询。在这个最简单的例子{__name__="requests_total"}, 就是查询所有属于requests_total的时序数据。对于查询的所有数据,我们将在一个特定时间窗口接受数据点。

在更加复杂的查询中,我们希望可以一次性满足几个选择器的数据查询,同时也可以代表比等式查询更加复杂的查询。例如,不等式(method!="GET")或者正则表达式匹配(method=~"PUT|POST").

这些极大的定义存储数据以及数据如何被重新调用。

垂直和水平

在一个简单的视图, 所有的数据点被分布在一个二维的平面图上。其水平维度代表着时间,序列标志着横跨垂直维度的空间。

series

^

│ . . . . . . . . . . . . . . . . . . . . . . {__name__="request_total", method="GET"}

│ . . . . . . . . . . . . . . . . . . . . . . {__name__="request_total", method="POST"}

│ . . . . . . .

│ . . . . . . . . . . . . . . . . . . . ...

│ . . . . . . . . . . . . . . . . . . . . .

│ . . . . . . . . . . . . . . . . . . . . . {__name__="errors_total", method="POST"}

│ . . . . . . . . . . . . . . . . .        {__name__="errors_total", method="GET"}

│ . . . . . . . . . . . . . .

│ . . . . . . . . . . . . . . . . . . . ...

│ . . . . . . . . . . . . . . . . . . . .

v <-------------------- time --------------------->

普罗米修斯依靠定期抓取当前值作为时间序列数据。这个批量抓取数据的来源实体我们称为目标。因此,写模式是完全垂直并且高并发的是由于从目标来的数据样本是完全被独立处理。这提供给我们一些大幅度的测量:单个普罗米修斯实例收集从数以万计的目标来的数据,这个暴露数十万不同的时序数据。

【翻译】从头开始写一个时间序列数据库-Writing a Time Series Database from Scratch的更多相关文章

  1. 用 Python 写一个 NoSQL 数据库Python

    NoSQL 这个词在近些年正变得随处可见. 但是到底 “NoSQL” 指的是什么? 它是如何并且为什么这么有用? 在本文, 我们将会通过纯 Python (我比较喜欢叫它, “轻结构化的伪代码”) 写 ...

  2. Summer——从头开始写一个简易的Spring框架

    Summer--从头开始写一个简易的Spring框架                ​ 参考Spring框架实现一个简易类似的Java框架.计划陆续实现IOC.AOP.以及数据访问模块和事务控制模块. ...

  3. 用Python写一个向数据库填充数据的小工具

    一. 背景 公司又要做一个新项目,是一个合作型项目,我们公司出web展示服务,合作伙伴线下提供展示数据. 而且本次项目是数据统计展示为主要功能,并没有研发对应的数据接入接口,所有展示数据源均来自数据库 ...

  4. 时间序列数据库(TSDB)初识与选择

    时间序列数据库(TSDB)初识与选择 本文作者由 MageByte 团队的 「借来方向」编写,关注公众号 给你更多硬核技术 背景 这两年互联网行业掀着一股新风,总是听着各种高大上的新名词.大数据.人工 ...

  5. 时间序列数据库(TSDB)初识与选择(InfluxDB、OpenTSDB、Druid、Elasticsearch对比)

    背景 这两年互联网行业掀着一股新风,总是听着各种高大上的新名词.大数据.人工智能.物联网.机器学习.商业智能.智能预警啊等等. 以前的系统,做数据可视化,信息管理,流程控制.现在业务已经不仅仅满足于这 ...

  6. 如何用 Python 写一个简易的抽奖程序

    不知道有多少人是被这个头图骗进来的:) 事情的起因是这样的,上周有同学问小编,看着小编的示例代码敲代码,感觉自己也会写了,如果不看的话,七七八八可能也写的出来,但是一旦自己独立写一段程序,感觉到无从下 ...

  7. 利用Python写一个抽奖程序,解密游戏内抽奖的秘密

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 极客挖掘机 PS:如有需要Python学习资料的小伙伴可以加点击下 ...

  8. 从头写一个Cucumber测试(一) Selenium Test

    转载:https://yaowenjie.github.io/%E7%BC%96%E7%A8%8B%E7%9B%B8%E5%85%B3/cucumber-test, 背景(废话不读系列)   前段时间 ...

  9. 用javaweb写一个注册界面,并将数据保存到后台数据库(全部完成)(课堂测试)

    一.题目:WEB界面链接数据库 1.考试要求: 1登录账号:要求由6到12位字母.数字.下划线组成,只有字母可以开头:(1分) 2登录密码:要求显示“• ”或“*”表示输入位数,密码要求八位以上字母. ...

随机推荐

  1. Taro开发微信小程序之初始化地图到当前位置

    在componentDidMount中,初始化mapCtx. let _this = this this.mapCtx = Taro.createMapContext('container') //c ...

  2. liteUploader上传控件的封装使用

    //原来的绑定方式 $('#' + frm_name).liteUploader({ script: url, params: { type: "image", size: siz ...

  3. Python人工智能第二篇

    Python人工智能之路 - 第二篇 : 现成的技术   预备资料: 1.FFmpeg: 链接:https://pan.baidu.com/s/1jonSAa_TG2XuaJEy3iTmHg 密码:w ...

  4. H-Modify Minieye杯第十五届华中科技大学程序设计邀请赛现场赛

    题面见 https://ac.nowcoder.com/acm/contest/700#question 题目大意是有n个单词,有k条替换规则(单向替换),每个单词会有一个元音度(单词里元音的个数)和 ...

  5. sql转百分比并保留两位小数

    --转百分比并保留两位小数 select ProfitRate =Convert(nvarchar(20), (Convert(decimal(18,2),((DayPrice -MyPrice)*1 ...

  6. synchronized锁机制 之 代码块锁(转)

    synchronized同步代码块 用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法执行一个较长时间的任务,那么B线程必须等待比较长的时间.这种情况下可以尝试使用 ...

  7. Struts2源码解析-----转载

    前面一节描述的Struts2很多东西,这节是对源码进行分析描述,通过这一节应该对struts2有了清楚认识! 还是把Struts2这个框图贴出来: 第一步:HttpServletRequest进入到S ...

  8. nginx 添加response响应头

    硬添

  9. Python的安装图解

    安装步骤: 第一步:打开Python官网:http://www.python.org 第二步:点击Download,下载windows版本 第三步:选择要下载的版本第四步:安装到指定的位置第五步:验证 ...

  10. VirtualBox CentOS7 Mini 安装增强工具

    安装相关依赖 # yum install vim gcc kernel kernel-devel bzip2 -y # reboot 点击虚拟机菜单栏 => 设备 => 安装增强功能 # ...