【翻译】从头开始写一个时间序列数据库-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登录密码:要求显示“• ”或“*”表示输入位数,密码要求八位以上字母. ...
随机推荐
- 小乌龟 coding 克隆、提交一直提示无权限
因为之前设置过账号,但是网上各种命令行清除都没有用,进入小乌龟设置删除全局配置,系统配置,保存就可以克隆等操作了
- linux dns域名缓存
在linux服务器中,我们 总会设置一个dns做域名解析 一般来说dns的缓存是不会造成多大的困扰,但是,有时候会遇到dns解析导致网络不能正常访问 在linux中,有一个缓存服务,我们可以重启这个来 ...
- gitlab中批量删除本地以及远程tag的操作
git 批量删除标签# 删除所有远程标签git show-ref --tag | awk '{print ":" $2}' | xargs git push origin # 删除 ...
- Excel基本操作
一.excel公式下拉 1.选择最长一列excel ,按CTRL+↓移到最后一个单元格,2光标移到下拉公式的那一列,3.再按CTRL+SHIFT+↑,4.再按CTRL+D 二.输入身份证号等长数字 方 ...
- 随便说说sequelize的问题
最近在做的项目频繁的修改数据库让人感觉很烦躁,sequelize在执行sync的时候只会重新创建表,如果原先有数据只能直接删除,但是这样显然是不行的,因为数据不能就这么消失了吧. 所以必须要migra ...
- ES6学习笔记(数组)
1.扩展运算符:, 2, 3]) // 1 2 3 console.log(1, ...[2, 3, 4], 5) // 1 2 3 4 5 用于函数调用 function add(x, y) { r ...
- 新学python画一个爱心
from turtle import * def curvemove(): for i in range(200): right(1) forward(1) color('yellow','red') ...
- css动画特效
<html> <head> <meta charset="utf-8" /> <title>6种css3鼠标滑过动画效果</t ...
- Unity3D 物体移动方法总结
1. 简介 在Unity3D中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position. 2. 通过Transform组件移动物体 Transform 组件用于描述物体在 ...
- 20175234 2018-2019-2 《Java程序设计》第九周学习总结
目录 20175234 2018-2019-2 <Java程序设计>第九周学习总结 教材学习内容总结 教材学习中的问题和解决过程 代码托管 感想 学习进度条 参考资料 20175234 2 ...