利用可排序Key-Value DB构建时间序列数据库(简论)
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处。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构建时间序列数据库(简论)的更多相关文章
- POJ - 3249 Test for Job (在DAG图利用拓扑排序中求最长路)
(点击此处查看原题) 题意 给出一个有n个结点,m条边的DAG图,每个点都有权值,每条路径(注意不是边)的权值为其经过的结点的权值之和,每条路径总是从入度为0的点开始,直至出度为0的点,问所有路径中权 ...
- 时间序列数据库调研之InfluxDB
基于 Go 语言开发,社区非常活跃,项目更新速度很快,日新月异,关注度高 测试版本 1.0.0_beta2-1 安装部署 wget https://dl.influxdata.com/influxdb ...
- [转帖]时间序列数据库 (TSDB)
时间序列数据库 (TSDB) https://www.jianshu.com/p/31afb8492eff 0.3392019.01.28 10:51:33字数 5598阅读 4030 背景 2017 ...
- 时间序列数据库武斗大会之 KairosDB 篇
[编者按] 刘斌,OneAPM后端研发工程师,拥有10多年编程经验,参与过大型金融.通信以及Android手机操作系的开发,熟悉Linux及后台开发技术.曾参与翻译过<第一本Docker书> ...
- 时间序列数据库——索引用ES、聚合分析时加载数据用什么?docvalues的列存储貌似更优优势一些
加载 如何利用索引和主存储,是一种两难的选择. 选择不使用索引,只使用主存储:除非查询的字段就是主存储的排序字段,否则就需要顺序扫描整个主存储. 选择使用索引,然后用找到的row id去主存储加载数据 ...
- 时间序列数据库(TSDB)初识与选择
时间序列数据库(TSDB)初识与选择 本文作者由 MageByte 团队的 「借来方向」编写,关注公众号 给你更多硬核技术 背景 这两年互联网行业掀着一股新风,总是听着各种高大上的新名词.大数据.人工 ...
- 时间序列数据库(TSDB)初识与选择(InfluxDB、OpenTSDB、Druid、Elasticsearch对比)
背景 这两年互联网行业掀着一股新风,总是听着各种高大上的新名词.大数据.人工智能.物联网.机器学习.商业智能.智能预警啊等等. 以前的系统,做数据可视化,信息管理,流程控制.现在业务已经不仅仅满足于这 ...
- 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
为什么80%的码农都做不了架构师?>>> 摘要: 近日,阿里云宣布高性能时间序列数据库 (High-Performance Time Series Database , 简称 H ...
- Akumuli时间序列数据库——列存储,LSM,MVCC
Features Column-oriented time-series database. Log-structured append-only B+tree with multiversion c ...
随机推荐
- 写出简洁的Python代码: 使用Exceptions(转)
add by zhj: 非常好的文章,异常在Python的核心代码中使用的非常广泛,超出一般人的想象,比如迭代器中,当我们用for遍历一个可迭代对象时, Python是如何判断遍历结束的呢?是使用的S ...
- 实践-通过matlab操作sqlite数据库
1.下载sqlite-jdbc连接数据库地址 https://bitbucket.org/xerial/sqlite-jdbc/downloads/ 2.将该jar包的绝对路径写入matlab的cla ...
- $(document).ready()方法和window.onload有什么区别?
①.window.onload 方法是在网页中所有的元素(包括元素的所有关联文件)完全加载到浏览器后才执行的: ②.$(document).ready()方法可以在DOM载入就绪时就对其进行操纵,并调 ...
- Entity Framework学习 - 5.DB First执行时提示model没有key
原因:自动生成的类中有关联主键,没有自动生成Key及Column 解决方法:在xxx.tt的66行左右修改为 var simpleProperties = typeMapper.GetSimplePr ...
- 微信即将支持App直接打开小程序
“今年,微信将更快速地支持各APP直接打开小程序.”微信开放平台基础部高级产品经理林兴表示.对于官方即将支持的App直接打开小程序,林兴解释说,正如大家都喜欢微信钱包里的各种便捷服务,以后一个旅游攻略 ...
- composer安装其实可以很简单 两行命令就解决了
最近接了一个cakephp项目,就想着用composer安装实施,因为Composer 可以方便地帮你安装项目中声明所依赖的外部工具库(libraries).之前没有接触过,相对比较陌生,但是相信ph ...
- $ sudo python -m pip install pylint 出错解决方法
问题:在unbuntu执行$ sudo python -m pip install pylint出错解决方法支行以下命令sudo pip install pylint==1.9.3这样roboware ...
- RN-TextInput组件去掉下划线
<View style={styles.container}> <TextInput style={styles.textInputStyle} underlineColorAndr ...
- Java中基本数据类型byte,short,char,int,long,float,double 取值范围
部分内容转自:java 彻底理解 byte char short int float long double 首先说byte: 这段是摘自jdk中 Byte.java中的源代码: /** * A co ...
- Python生态工具、文本处理和系统管理(虚拟)
一.Python生态工具 一.Python内置小工具 1.秒级启动一个下载服务器 Python 内置了一个下载服务器就能够显著提升效率了 . 例如, 你的同事要让你传的文件位于某一个目录下,那么,你可 ...