本文来自: 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. PL/SQL简单使用——导入、导出数据表

    1.使用PL/SQL导出.导入表 在使用PL/SQL操作oracle数据库时,经常使用的一个操作就是将自己写的数据表导出,或者想把他人的数据表导入到自己的数据库中.虽然是很简单的操作,但自己之前一直出 ...

  2. OGRE Tutorials 1

    [Guide to building OGRE] 1.Preparing the build environment You should now create a build directory f ...

  3. VirtualBox 休眠恢复后无法联网解决办法

    环境:lubuntu 首先ifconfig查看网卡名,我这里是enp0s3. 接着: sudo ifconfig enp0s3 down sudo ifconfig enp0s3 up sudo dh ...

  4. Linux下Samba的安装和使用

    一. samba的安装: sudo apt-get insall samba sudo apt-get install smbfs 二. 创建共享目录: mkdir /home/phinecos/sh ...

  5. RabbitMQ 1

    RabbitMQ能做些什么? 消息系统允许软件.应用相互连接和扩展.这些应用可以相互链接起来组成一个更大的应用,或者将用户设备和数据进行连接.消息系统通过将消息的发送和接收分离来实现应用程序的异步和解 ...

  6. 【Spring源码解析】—— 结合SpringMVC过程理解IOC容器初始化

    关于IOC容器的初始化,结合之前SpringMVC的demo,对其过程进行一个相对详细的梳理,主要分为几个部分: 一.IOC的初始化过程,结合代码和debug过程重点说明 1. 为什么要debug? ...

  7. java基础 ----- 程序的调试

    --- -- 什么是程序调试 当程序出错时,我们希望可以这样 逐条语句执行程序   -----    观察程序的执行情况 ------  发现问题   -----  解决问题 但是,程序一闪就运行结束 ...

  8. linux尝试登录失败后锁定用户账户的两种方法

    linux尝试登录失败后锁定用户账户的两种方法 更新时间:2017年06月23日 08:44:31   作者:Carey    我要评论   这篇文章主要给大家分享了linux尝试登录失败后锁定用户账 ...

  9. Linux驱动之触摸屏程序编写

    本篇博客分以下几部分讲解 1.介绍电阻式触摸屏的原理 2.介绍触摸屏驱动的框架(输入子系统) 3.介绍程序用到的结构体 4.介绍程序用到的函数 5.编写程序 6.测试程序 1.介绍电阻式触摸屏的原理 ...

  10. Windows10开机pin界面循环重启解决办法

    昨天电脑在开机时,进入pin界面,输入pin码之后系统没反应,也不显示登陆成功,大概一分钟之后自动重启,遂百度答案:大部分建议都是在开机显示win图标时强制关机,强制关机两次即自动进入疑难解答页面,以 ...