Influxdb概念及原理简介
所属分类 influxdb
浏览量 1080
Influxdb 开源时序数据库,GO语言开发
DB-Engines 时序数据库类别里排名第一
TSM 存储引擎,基于 LSM 思想,高写入性能 高压缩比
对Tags索引
InfluxQL SQL-Like查询语言
Continuous Queries ,支持auto-rollup和pre-aggregation,对常见的查询操作可以通过CQ来预计算加速查询。
TSM Time-Structured Merge Tree
LSM Log Structured Merge Tree
项目存储引擎 从 LevelDB 到 BlotDB,再到自研 TSM
LevelDB 作为时序数据库的 缺点
不支持热备 , 安全备份必须关闭后才能进行,LevelDB的RocksDB和HyperLevelDB变体可以解决此问题
时序数据过期数据删除,levelDB删除代价过高(通过添加墓碑的方式, 段合并时物理删除)
TSM
按不同的时间范围划分为不同的分区(Shard)
物理删除简单,直接删除分区即可
最初 采用每个shard 一个独立的数据库实例,LevelDB底层采用level compaction策略,每个存储引擎会打开多个的文件,shard增多,文件句柄占用过多
使用 BoltD B替换 LevelDB ,BoltDB底层数据结构是mmap B+树,由于B+ 树会产生大量的随机写,写入性能较差。
最终自研TSM ,基于时序数据库的特性作出一些优化,包含Cache、WAL以及Data File等各个组件,也会有flush、compaction等操作
database
Retention Policy(RP) 数据保留策略, 数据过期时间
Shard Group 逻辑概念
Shard 真正存储数据 提供读写服务
Shard WAL CACHE TSM-files
写入 类似 LSM,
先写cache, 异步flush 到TSM文件 ,同时写 WAL(Write Ahead Log) 预防数据丢失
Influxdb 数据模型
Measurement 类 mysql 表名
tag key 类似mysql 加了索引的列 indexed fields
Field key 类似mysql 没加索引的列 non-indexed fields
Point 类似一行记录 record
Timestamp
tag 只支持字符串类型
field 类型无限制
Series 时间线
Series = Measurement + tags
SeriesKey=measurement+datasource(tags)
时序数据在内存中表示为一个Map
< Key, List< Timestamp|Value>>
Key = seriesKey + fieldKey
Map执行flush形成TSM文件
TSM文件
Series Data Section
Series Index Section
Series Index Section
存储文件级别B+树索引Block,用于在文件中快速查询时间序列数据块
同一个Key对应的时序数据构建成多个连续的Block
Series Index Block由Index Block Meta以及一系列Index Entry构成
Index Block Meta最核心的字段是Key,表示这个索引Block内所有IndexEntry所索引的时序数据块都是该Key对应的时序数据。
Index Entry 指向对应的Series Data Block。
指向的Data Block由Offset唯一确定,Offset表示该Data Block在文件中的偏移量,
Size表示指向的Data Block大小
Min Time和Max Time表示指向的Data Block中时序数据集合的最小时间以及最大时间
根据时间范围查找时可以根据这两个字段进行过滤
TSM 索引部分加载到内存,数据部分因为太大并不会直接加载到内存
查询可以分为三步
根据Key找到对应的SeriesIndex Block,Key有序,使用二分查找
找到SeriesIndex Block之后再根据查找的时间范围,使用[MinTime, MaxTime]索引定位到可能的Series Data Block列表
将满足条件的Series Data Block加载到内存中解压进一步使用二分查找根据timestamp查找
多维查询之倒排索引
TimeSeries Index TSI
1.3版本之前仅支持 Memory-Based Index
1.3之后支持 Disk-Based Index
常用InfluxQL
show databases;
use database_name;
show measurements;
select * from measurement_name limit 10;
-- 数据中的时间字段默认显示的是一个纳秒时间戳,改成可读格式
precision rfc3339;
-- 可在连接数据库指定该参数
influx -precision rfc3339
-- 查看一个measurement中所有的tag key
show tag keys
-- 查看一个measurement中所有的field key
show field keys
-- 查看一个measurement中所有的保存策略(可以有多个,一个标识为default)
show retention policies;
LSM Tree 要点整理
leveldb简介
leveldb要点
常用时序数据库比较
上一篇
下一篇
elasticsearch分片分配机制简介
elasticsearch的几个特色功能
常用时序数据库比较
influxdb使用简介
influxdb 连续查询
influxDB HTTP API使用