【翻译】从头开始写一个时间序列数据库-Writing a Time Series Database from Scratch
本文来自: 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的更多相关文章
- 用 Python 写一个 NoSQL 数据库Python
NoSQL 这个词在近些年正变得随处可见. 但是到底 “NoSQL” 指的是什么? 它是如何并且为什么这么有用? 在本文, 我们将会通过纯 Python (我比较喜欢叫它, “轻结构化的伪代码”) 写 ...
- Summer——从头开始写一个简易的Spring框架
Summer--从头开始写一个简易的Spring框架 参考Spring框架实现一个简易类似的Java框架.计划陆续实现IOC.AOP.以及数据访问模块和事务控制模块. ...
- 用Python写一个向数据库填充数据的小工具
一. 背景 公司又要做一个新项目,是一个合作型项目,我们公司出web展示服务,合作伙伴线下提供展示数据. 而且本次项目是数据统计展示为主要功能,并没有研发对应的数据接入接口,所有展示数据源均来自数据库 ...
- 时间序列数据库(TSDB)初识与选择
时间序列数据库(TSDB)初识与选择 本文作者由 MageByte 团队的 「借来方向」编写,关注公众号 给你更多硬核技术 背景 这两年互联网行业掀着一股新风,总是听着各种高大上的新名词.大数据.人工 ...
- 时间序列数据库(TSDB)初识与选择(InfluxDB、OpenTSDB、Druid、Elasticsearch对比)
背景 这两年互联网行业掀着一股新风,总是听着各种高大上的新名词.大数据.人工智能.物联网.机器学习.商业智能.智能预警啊等等. 以前的系统,做数据可视化,信息管理,流程控制.现在业务已经不仅仅满足于这 ...
- 如何用 Python 写一个简易的抽奖程序
不知道有多少人是被这个头图骗进来的:) 事情的起因是这样的,上周有同学问小编,看着小编的示例代码敲代码,感觉自己也会写了,如果不看的话,七七八八可能也写的出来,但是一旦自己独立写一段程序,感觉到无从下 ...
- 利用Python写一个抽奖程序,解密游戏内抽奖的秘密
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 极客挖掘机 PS:如有需要Python学习资料的小伙伴可以加点击下 ...
- 从头写一个Cucumber测试(一) Selenium Test
转载:https://yaowenjie.github.io/%E7%BC%96%E7%A8%8B%E7%9B%B8%E5%85%B3/cucumber-test, 背景(废话不读系列) 前段时间 ...
- 用javaweb写一个注册界面,并将数据保存到后台数据库(全部完成)(课堂测试)
一.题目:WEB界面链接数据库 1.考试要求: 1登录账号:要求由6到12位字母.数字.下划线组成,只有字母可以开头:(1分) 2登录密码:要求显示“• ”或“*”表示输入位数,密码要求八位以上字母. ...
随机推荐
- RabbitMQ消费者抛异常日志持续打印的问题
场景 消费者接受消息,进行一系列处理,但是由于某些原因处理过程中该消费者的抛出了异常,并且不捕获(直接 throws IOException 抛出去): 由于抛出了IOException,那么这条消息 ...
- C语言作业04-数组
1.本章学习总结 1.1思维导图 1.2本章学习体会及代码量学习体会 1.2.1学习体会 通过本章的学习,学会了几种用于循环的语句,能够利用循环解决复杂的问题,但对于几种循环的使用并不熟练,其中对于c ...
- 一.C#基础:标识符和关键字
只要语言就会有标识符,和关键字的概念,以下是C#的标识符与关键字: 一个字符串要成为标识符要满足的条件1:只包含字母,(包括大小写),数字,@符号,下划线——.2:首位可以是字母,@,但一定不能是数字 ...
- python 错题集
1.IOError: [Errno 22] invalid mode ('rb') or filename: '\xe2\x80\xaaD:\NLP\cv082_11080.csv' 将一个py文件用 ...
- JDBC测试计划-连接mysql
一.测试环境准备 mysql:5.5 JDBC驱动:mysql-connector-java-5.1.30.jar 文件复制到JMeter/lib目录下 JMeter:jmeter-3.2 ...
- 【相关网站 - 02】- Java 好文博客
一.源码分析博客 还有这种操作?浅析为什么要看源码 你觉得什么才是 Java 的基础知识? 1. JDK 2. Mybatis 3. Spring 4. Sring Boot 5. Spring Cl ...
- mysql学习笔记--数据库预处理
一.概念 1. 预编译一次,可以多次执行.用来解决一条sql语句频繁执行的问题 2. 语法 a. 预处理语句:preapre 预处理名字 from 'sql语句' b. 执行预处理:execute 预 ...
- [BZOJ2252]矩阵距离(BFS)
题意 输入矩阵m行n列(m<=500,n<=500),只含0.1,输出离每个元素距离最近的1的距离,其中距离定义为D(aij,akl)=abs(i-k)+abs(j-l). 示例: 输入: ...
- 阿里巴巴开源 Spring Cloud Alibaba,加码微服务生态建设
本周,Spring Cloud联合创始人Spencer Gibb在Spring官网的博客页面宣布:阿里巴巴开源 Spring Cloud Alibaba,并发布了首个预览版本.随后,Spring Cl ...
- GlusterFS
1. GlusterFS概述 GlusterFS是Scale-Out存储解决方案Gluster的核心,它是一个开源的分布式文件系统,具有强大的横向扩展能力,通过扩展能够支持数PB存储容量和处 ...