InfluxDB -- TSM存储引擎的整体结构
TSM存储引擎的存储类tsdb.Store,包含索引区和数据区:
tsdb.Store
//索引
-- map[string]*Index
-- map[string]*measurement
-- map[string]*series
//数据
-- map[uint64]*Shard
-- Engine // 抽象接口,可插拔设计,目前是 tsm1 存储引擎
-- *WAL
-- *Cache
-- *Compactor
-- *FileStore
索引区:map结构,databaseName-->Index结构;
- Index结构包含measurement和series元信息;
tsdb.Store整体结构 Store是存储的顶层结构,包含索引和数据:
//tsdb/store.go
type Store struct {
pathstring// shared per-database indexes, only if using "inmem".
indexes map[string]interface{}//key=databaseName, value实际是*Index//所有shards,key=shardId
shardsmap[uint64]*Shard
}
文章图片
Store::indexes索引区 indexes定义为map[string]interface: key=databaseName,value=https://www.it610.com/article/*Index。
该对象缓存了influxdb中所有的database、retention policy、measurement、series等元信息,若series设计不合理,容易导致内存占用偏高。
在influxdb启动时,将初始化该结构,从所有shards下的tsm file中加载index信息,获取其中的meaurement以及series信息,缓存到该结构中。
//tsdb/index/inmem/inmem.go
// Index is the in memory index of a collection of measurements, time
// series, and their tags.
type Index struct {
//数据库下measurementName-->*measurement
measurements map[string]*measurement // measurement name to object and index
//数据库下seriesKey-->*series
seriesmap[string]*series// map series key to the Series object
database string//数据库名称
}
measurement结构保存某个measurement下series、tags等信息:
- seriesByID:seriesId-->series;
- seriesByTagKeyValue:
- 这个对象较为复杂,它实际是tagKey-->tagValue-->[]uint64;
- 可通过tagKey查询到其tagValue、包含该tagKey的[]seriesId;
- 方便通过tagKey查询各种元信息;
//tsdb/index/inmem/meta.go
type measurement struct {
Databasestring
Namestring `json:"name,omitempty"`
fieldNames map[string]struct{}// in-memory index fields
//seriesId-->*series
seriesByIDmap[uint64]*series// lookup table for series by their id
//tagKey-->tagValue-->[]seriesId
//查询时,可根据tagKey找到seriesId,然后再找到相关的series
seriesByTagKeyValue map[string]*tagKeyValue // map from tag key to value to sorted set of series idssortedSeriesIDs seriesIDs // sorted list of series IDs in this measurement
}
type tagKeyValue struct {
musync.RWMutex
entries map[string]*tagKeyValueEntry
}
type tagKeyValueEntry struct {
m map[uint64]struct{} // series id set
}
【InfluxDB -- TSM存储引擎的整体结构】series的结构很简单,包含serisId、key和tag信息:
// series belong to a Measurement and represent unique time series in a database.
type series struct {
// immutable
IDuint64
Measurement *measurement//归属的measurement
Keystring
Tagsmodels.Tags
}
文章图片
Store::shards数据区 shard在TSM中的位置:
- influxdb按照数据的时间戳范围,创建不同的shard,每个shard负责管理一段时间内的数据;
- 每个shard都有自己的cache、wal、tsmfile和compactor;
- 可以通过时间快速定位到shard,加速查询;同时批量删除时,删除响应的shard目录即可;
文章图片
每个shard可以理解为一个单独的底层数据引擎,由其中的engine负责和底层的文件打交道:
//tsdb/shard.go
type Shard struct {
pathstring//shard在磁盘中的路径
walPath string//shard中的wal目录
iduint64//shardIddatabasestring
retentionPolicy string
_engine Engine//存储引擎
}
Engine是interface,InfluxDB使用tsm1实现了该接口:tsm1.Engine负责维护管理管理shard下的cache/wal/filestore/compactor对象
//tsdb/engine/tsm1/engine.go
type Engine struct {
pathstring
index tsdb.Index//索引信息WAL*WAL//WAL文件对象
Cache*Cache//WAL文件在内容中的缓存
Compactor*Compactor//合并管理对象
CompactionPlan CompactionPlanner
FileStore*FileStore//数据文件对象//Cache超过一定大小会被写入TSM文件,默认25M
//配置文件:cache-snapshot-memory-size
CacheFlushMemorySizeThreshold uint64//Cache超过多久没有数据写入,将其写入TSM文件,默认30min
//配置文件:cache-snapshot-write-cold-duration
CacheFlushWriteColdDuration time.Duration
}
每个Shard包含:Cache、WAL、Compactor、FileStore四大组件。
文章图片
Cache cache相当于LSM-Tree中的MemTable,内存中是一个map结构,key=seriesKey+分隔符+fieldName。
插入数据时,同时向cache和WAL写入数据,可以认为cache是wal在内存中的缓存;当influxdb启动时,会遍历所有的wal,重新构造cache,这样即使系统故障,也不会导致数据丢失。
cache中的数据不会无限增长,当达到cache-snapshot-memory-size(默认25M)时,将cache进行快照,将快照中的数据写入tsm文件中;同时删除对应的wal文件。
WAL wal文件内容与cache相同,用于进程崩溃后,通过wal文件恢复数据(恢复到cache);
FileStore FileStore具体是TSM File,单个TSM File最大2GB,用于存放压缩后的时序数据,对不同的数据类型,使用不同的压缩算法;
- Timestamp: simple8B
- Floats: XOR
- Integers: ZigZag
- Strings: Snappy
compactor在后台运行,每隔1s检查一次是否需要合并:
- cache中的数据大小达到阈值,进行快照,然后转存到一个tsm文件中;
- 合并tsm文件,将低level tsm合并到高level,减少文件数量,同时进行数据的过期删除;
2.http://blog.fatedier.com/2016...
3.https://docs.influxdata.com/i...
推荐阅读
- MySQL|MySQL 存储过程语法及实例
- 数据技术|一文了解Gauss数据库(开发历程、OLTP&OLAP特点、行式&列式存储,及与Oracle和AWS对比)
- 2018-03-11|2018-03-11 存储过程
- 笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历
- C语言学习(bit)|16.C语言进阶——深度剖析数据在内存中的存储
- 03_ARMv8指令集介绍加载与存储指令
- 区块链学习第二十七周2018.02.20-02.26|区块链学习第二十七周2018.02.20-02.26 关于EOS存储系统
- 集合框架(集合嵌套存储和遍历元素的案例代码实现)
- 创建、执行存储过程
- JDBC实战教程(四)-控制事务和调用存储过程