本文来自: 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. 关于MVC工厂模式的增删改查sql存储过程

    这里MVC中用到了反射,工厂,泛型,接口 在搭建框架的时候,除了MVC的三层以外,还有泛型的接口层和工厂层 下面是dal层调用sql存储过程,增删改查,dal层继承了接口层,实现了接口层里面的方法 1 ...

  2. C# 读取TXT文本数据 添加到数据库

    protected void Button1_Click(object sender, EventArgs e) { //使用FileStream读取文件 FileStream fileStream ...

  3. java第一天 数据类型、变量的命名、类型的转换

    数据类型 /* 数据类型:Java是一种强类型语言,针对每一种数据都给出了明确的数据类型 数据类型分类: A:基本数据类型 B:引用数据类型(类,接口,数组) 基本数据类型:4类8种 A:整数 字节 ...

  4. 浙江省赛之Singing Everywhere

    题目:http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5996 方法: 在大佬的指导下完成. 寻找峰值,找到一共k个 ...

  5. Centos 7创建一个服务

    首先创建服务文件 vim /etc/systemd/system/node.service #内容如下 [Unit] Description=ethereum-go Monitor Daemon Af ...

  6. vue如何使用rules对表单字段进行校验

    基于element-ui 1.在代码中,添加属性::rule <el-form :model="form" :rules="rules" ref=&quo ...

  7. BP算法的矩阵推导

    目录 1. 需要的微积分知识 1.1 导数 1.2 求导的链式法则 2. 梯度下降法 2.1 梯度 2.2 梯度算法的解释 3.误差反向传播算法 3.1 理论推导 3.1.1 符号说明 3.1.2 推 ...

  8. JS的深浅拷贝

    项目中根据各种需求或多或少会需要用到拷贝,通过查询整理之后今天简单的记录一下. 我们可以利用 slice.concat 返回一个新数组的特性可以实现数组的拷贝. var arr = ['a', 1, ...

  9. python 数据库mysql、redis及发送邮件

    python 关系型数据库链接使用--mysql import pymysql # 引用mysql模块 # 创建连接,指定数据库的ip地址,账号.密码.端口号.要操作的数据库.字符集coon = py ...

  10. jmeter安装与使用

    1.下载安装Jmeter.JDK Jmeter官网下载地址: http://jmeter.apache.org/download_jmeter.cgi JDK官网下载地址: http://www.or ...