时间序列数据库要点整理
所属分类 bigdata
浏览量 2157
[timestamp],[d1],[d2]...[dn],[v1],[v2]...[vn]
d1 dn 维度,比如 ip, dpp 等
v1 vn 指标值,比如 load free-memory 等
[timestamp],[metric],[value]
加上 TAG
timestamp],[metric],[tag=tagvalue,...],...[value]
按时间范围查询
按维度和指标筛选
服务端聚合
预计算
数据压缩
分布式 水平扩展能力
时序数据存储
基于文件的简单存储:RRD Tool,Graphite Whisper。
基于K/V数据库 opentsdb(基于hbase),influxdb,prometheus(基于leveldb),kairosDB(基于cassandra)
基于关系型数据库 mysql,postgresql
原始数据查询
聚合
入库时聚合 物化视图
查询时聚合
检索:这是搜索引擎最擅长的领域。代表产品是Lucene。其核心技术是基于高效率数据结构和算法的倒排索引。
加载:这是分析型数据库最擅长的领域。代表产品是C-store和Monetdb。其核心技术是按列组织的磁盘存储结构。
分布式计算:这是大数据计算引擎最擅长的领域。代表产品是Hadoop和spark。其核心技术是sharding 和 map/reduce等等。
Lucene的inverted index可以比mysql的b-tree检索更快。
lucene可以使用AND或者OR组合使用索引进行检索。
ES支持nested document,可以把一批数据点打包,减少需要索引的文档数。
Mysql存储时间序列的最佳实践是不使用二级索引,只使用clustered index扫描主表。类似于Opentsdb。
Lucene 从 4.0 开始支持 DocValues,极大降低了内存的占用,减少了磁盘上的尺寸并且提高了加载数据到内存计算的吞吐能力。
term
Posting list
term dictionary
term index
压缩技术
Lucene Finite State Transducers
Term dictionary在磁盘上是以分block的方式保存的,一个block内部利用公共前缀压缩
联合使用两个索引两种方式
使用skip list数据结构。 同时遍历两个字段的 posting list
使用bitset数据结构 两个字段的bitset
lucene bitset 数据结构 Roaring Bitmap
https://www.elastic.co/cn/blog/frame-of-reference-and-roaring-bitmaps
减少文档数 行变列
ES Nested Document
主键/聚集索引 和 普通索引/次级索引
Opentsdb Hbase 没有 普通索引
Hbase rowkey
rowkey 设计
[metric_name][timestamp][tags]
获取一个metric在一个时间范围内的所有数据很快
ip做为tags,读取某个ip 的数据比较麻烦
DocValues 按列组织的存储格式
Lucene底层读取文件 基于memory mapped byte buffer mmap。
由操作系统缓存文件到内存里。在内存足够的情况下,访问文件就相当于访问内存。
预读
普通磁盘每秒100MB
es index 分片 Shard
Segment
Segment对应了一些列文件存储索引(倒排表等)和主存储(DocValues等),这些文件内部又分为小的Block进行压缩。
时间序列数据一般按照日期分成多个 Index来存储
Pipeline Aggregation 聚合之后再做聚合
上一篇
下一篇
LSM Tree 要点整理
java GC之 CMS 和 G1
统一运维监控平台相关资料整理
内核参数设置及优化
高可用架构简单介绍
prometheus概述