为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处。LaplaceDemon/ShiJiaqi。

http://www.cnblogs.com/shijiaqi1066/p/5855064.html

本文使用LevelDB,HBase这类列式存KV储数据来构建时间序列数据库。

时间序列数据的特征

经典物理世界,若需要进行测量,则首先需要标注出来。所以首先物体需要有一个ObjectName。

物体有一些静态属性。静态属性不随时间发送变化。时间序列数据一般不关注静态属性。

还有一些动态属性。动态属性的值会随时间发送变化,一般的动态属性被称为指标。指标的名称即metricName。

基础表

Meta

物体与指标都具有名称。而名称字符串应该与一个无符号整数映射起来。即存储ObjectName与ObjectId的对应关系。

Data

使用SSTable存储KV型数据。支持Scan查询。存储Key与Value的关系。

时间序列数据库的查询需求

在不考虑聚合问题的前提下,一般的时间序列数据的查询有以下需求:

查询一段时间([timestamp0,timestam1])内某个object的所有metric的值。   ==> 抽象成函数即  query( objectId , timestamp0 , timestamp1 )

查询一段时间([timestamp0,timestam1])内某个object的某个metric的值。  ==> 抽象成函数即  query( objectId , metricId  , timestamp0 , timestamp1 )

查询一段时间内所有object的某个metric的值。 == > 抽象成函数即  query( metricId , timestamp0 , timestamp1 )

查询一段时间内所有object的所有metric的值。 == > 抽象成函数即  query( timestamp0 , timestamp1 )

一般的 query( objectId , metricId  , timestamp0 , timestamp1 ) 这种查询更为常见。

Key的构造

方法1:

timestamp | objectId | metricId

数据按时间顺序排序。是一种比较合理的构造方法,适合object较少的情况。

方法2:

timestamp | metricId | objectId

与方法1的应用场景一致。适合object较少的情况。且适合指定metricId的查询。

方法3:

objectId | timestamp | metricId

可以方便的查询,查询一段时间([timestamp0,timestam1])内某个object的所有指标值。即:query( objectId , timestamp0 , timestam1 )

但对一段时间([timestamp0,timestam1])内某个object的某个metric值,性能会稍显不足。这是因为在查询过程中需要过滤掉非指定metricId的指标。

比如一个object有30个metric,当前只需要查询object的metric1。则需要跳过{metric2 , metric3 , ...... , metric30 }的值。效率明显降低了。

方法4:

objectId | metricId | timestamp

可以方便查询一段时间([timestamp0,timestam1])内某个object的某个metric值。

但是如果需要查询一段时间([timestamp0,timestam1])内某个object的所有指标值,就会有所困难。

方法5:

改进方法4:在Meta中记录每个objectId与metricId的映射关系。即需要增加一张Mapping表。

查询一段时间([timestamp0,timestam1])内某个object的所有指标值,需要先从Mapping表中查询objectId具有的metricIds集合:

objectId  ==> {metric1,metric2,metric3,metric4,...metricN}

然后按照对每一个metricId进行查询:

query( objectId , metric1  , [timestamp0,timestam1] )

query( objectId , metric2  , [timestamp0,timestam1] )

query( objectId , metric3  , [timestamp0,timestam1] )

......

query( objectId , metricN  , [timestamp0,timestam1] )

查询后,把各个merge起来。

数值存储

数据存储于磁盘上都是以字节数组存储的。当读出来时需要知道存储时的数据格式。所以,需要把存储时的值格式记录下来。

静态数值类型

存储前,定义存储格式,并记录下来。存储时按照定义的存储格式进行序列化。类似于MySQL的使用方式。

动态数值类型

在数值序列化成byte[]后,用1个byte标记数值类型。并将整个byte添加到byte[]之前。合一起后存储下来。

即: typeByte  | valueBytes

读取数值时,按照第一个typeByte的值来解析后面的byte[]。

动态数值类型更加灵活,但每一条数据都需要多存储1个byte的额外信息。对于静态数值类型,会造成存储空间的浪费。

设计一个完整的时间序列数据库

元信息层

ObjectMeta表

objectName-objectId

MetricMeta表

metricName-metricId

ObjectMetricMeta表

objectId-metricId

静态层存储

业务层存储(不存在于时间序列数据库中)

staitcData

objectId-metricId-value

动态属性值存储

objectId|metricId|timestamp <--> (valueType)  value

为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处。LaplaceDemon/ShiJiaqi。

http://www.cnblogs.com/shijiaqi1066/p/5855064.html

利用可排序Key-Value DB构建时间序列数据库(简论)的更多相关文章

  1. POJ - 3249 Test for Job (在DAG图利用拓扑排序中求最长路)

    (点击此处查看原题) 题意 给出一个有n个结点,m条边的DAG图,每个点都有权值,每条路径(注意不是边)的权值为其经过的结点的权值之和,每条路径总是从入度为0的点开始,直至出度为0的点,问所有路径中权 ...

  2. 时间序列数据库调研之InfluxDB

    基于 Go 语言开发,社区非常活跃,项目更新速度很快,日新月异,关注度高 测试版本 1.0.0_beta2-1 安装部署 wget https://dl.influxdata.com/influxdb ...

  3. [转帖]时间序列数据库 (TSDB)

    时间序列数据库 (TSDB) https://www.jianshu.com/p/31afb8492eff 0.3392019.01.28 10:51:33字数 5598阅读 4030 背景 2017 ...

  4. 时间序列数据库武斗大会之 KairosDB 篇

    [编者按] 刘斌,OneAPM后端研发工程师,拥有10多年编程经验,参与过大型金融.通信以及Android手机操作系的开发,熟悉Linux及后台开发技术.曾参与翻译过<第一本Docker书> ...

  5. 时间序列数据库——索引用ES、聚合分析时加载数据用什么?docvalues的列存储貌似更优优势一些

    加载 如何利用索引和主存储,是一种两难的选择. 选择不使用索引,只使用主存储:除非查询的字段就是主存储的排序字段,否则就需要顺序扫描整个主存储. 选择使用索引,然后用找到的row id去主存储加载数据 ...

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

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

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

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

  8. 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!

    为什么80%的码农都做不了架构师?>>>   摘要: 近日,阿里云宣布高性能时间序列数据库 (High-Performance Time Series Database , 简称 H ...

  9. Akumuli时间序列数据库——列存储,LSM,MVCC

    Features Column-oriented time-series database. Log-structured append-only B+tree with multiversion c ...

随机推荐

  1. 【PyQt5-Qt Designer】浅谈关闭窗口

    1.关闭全部窗口(主窗口+所有的子窗口) 在逻辑界面中写入 sys.exit(0) 2.关闭子窗口(其他窗口不关闭) self.close()

  2. 【三分】light bulb(zoj3203)

    题目描述: 如图,你可以在房间里移动,灯泡的高度为H,你的身高为h,灯泡与墙的水平距离为D,求你影子的最长长度(影子长度=地上影子长度+墙上影子长度) 样例输入: 0.5 样例输出: 1.000 0. ...

  3. Examples of GoF Design Patterns in Java's core libraries

    设计模式分类 stackOverflow Structural(结构模式) Adapter:把一个接口或是类变成另外一种. java.util.Arrays#asList() javax.swing. ...

  4. 【Linux】测试环境如何搭建?

    [Linux]测试环境如何搭建? (该文档所在我的百度网盘位置: ) 通常面试会问到会不会搭建测试环境?到底啥是测试环境搭建呢,其实测试环境没有想像的那么高大上,弄个 tomcat,把测试的 war ...

  5. vscode 使用iView时标签报错 Parsing error: x-invalid-end-tag

    错误展示: 问题原因: iView将标签渲染为原生html标签时,由于这些标签是自闭合的,所以有end标签会报错. 解决方案: 修改配置文件,忽略该项检查: 根目录下 - .eslintrc.js - ...

  6. finecms如何控制调用子栏目的数量

    finecms如何控制调用子栏目的数量?比如只要调用栏目id为23下的3个子栏目要怎么写?我们把num=3放后面不能实现,放在return前面就可以了,原来是顺序的问题,return只能放最后 {li ...

  7. 0703-spring cloud config-git配置属性加解密之对称加密

    一.概述 可以使用{cipher} *格式的加密值,只要有一个有效的密钥,那么它们将在主应用程序上下文获取环境之前被解密.要在应用程序中使用加密功能,您需要在您的类路径中包含Spring Securi ...

  8. eslint 代码规范2

    eslint 规则修改 需要修改规则:文件[.eslintrc.js] 在句末是不能有分号的,若想加分号, 报错: 添加代码: 'semi': ['error', 'always'] 不要使用制表符. ...

  9. eclipse中安装XML editor Rinzo

    eclipse中安装XML editor Rinzo  1. 较高版本的eclipse可以通过 Help--Market 搜索 Rinzo,然后安装 2. 第1种方法如果不行,尝试下面的方法 (1)从 ...

  10. Linux 环境配置 网络端口进程命令

    网络通信命令ping 命令路径:/bin/ping 执行权限:所有用户作用:测试网络的连通性语法:ping 选项 IP地址  -c 指定发送次数    ping 命令使用的是icmp协议,不占用端口e ...