go语言版本:1.9.2 linux/amd64
InfluxDB版本:1.7
influxdb存储引擎tsdb代码目录:github.com\influxdata\influxdb\tsdb
可以先阅读以下对于tsdb的官方文档。 其采用的存储模型是LSM-Tree模型,对其进行了一定的改造。将其称之为Time-Structured Merge Tree (TSM)
当一个point写入时,influxdb根据其所属的database、measurements和timestamp选取一个对应的shard。每个 shard对应一个TSM存储引擎。每个shard对应一段时间范围的存储。
一个TSM存储引擎包含:
- In-Memory Index 在shard之间共享,提供measurements,tags,和series的索引
- WAL 同其他database的binlog一样,当WAL的大小达到一定大小后,会重启开启一个WAL文件。
- Cache 内存中缓存的WAL,加速查找
- TSM Files 压缩后的series数据
- FileStore TSM Files的封装
- Compactor 存储数据的比较器
- Compaction Planner 用来确定哪些TSM文件需要compaction,同时避免并发compaction之间的相互干扰
- Compression 用于压缩持久化文件
- Writers/Readers 用于访问文件
shard通过CreateShard 来创建。可以看出其依次创建了所需的文件目录,然后创建Index 和Shard 数据结构。
Store:
github.com\influxdata\influxdb\tsdb\store.go
// Store manages shards and indexes for databases.
type Store struct {
mu sync.RWMutex
shards map[uint64]*Shard // 所有 shards 的索引,key 为其 shard ID
databases map[string]struct{}
sfiles map[string]*SeriesFile
SeriesFileMaxSize int64 // Determines size of series file mmap. Can be altered in tests.
path string // 数据库文件在磁盘上的存储路径
// shared per-database indexes, only if using "inmem".
indexes map[string]interface{}
// Maintains a set of shards that are in the process of deletion.
// This prevents new shards from being created while old ones are being deleted.
pendingShardDeletes map[uint64]struct{}
EngineOptions EngineOptions
baseLogger *zap.Logger
Logger *zap.Logger
closing chan struct{}
wg sync.WaitGroup
opened bool
}
Store 是存储结构中最顶层的抽象结构体,主要包含了 InfluxDB 中所有数据库的 索引 和 实际存储数据的 Shard 对象。InfluxDB 中的其他服务都需要通过 Store 对象对底层数据进行操作。store是influxdb的存储模块,全局只有一个该实例。主要负责将数据按一定格式写入磁盘,并且维护influxdb相关的 存储概念。例如:创建/删除Shard、创建/删除retention policy、调度shard的compaction、以及最重要的WriteToShard 等等。在store内部又包含index和engine2个抽象概念,index是对应shard的索引,engine是对应shard的存储实现, 不同的engine采用不同的存储格式和策略。后面要讲的tsdb其实就是一个engine的实现。在influxdb启动时,会创建 一个store实例,然后Open它,初始化时,它会加载已经存在的Shard ,并启动一个Shard监控任务, 监控任务负责调度每个Shard的Compaction和对使用inmem索引的Shard计算每种Tag拥有的数值的基数(与配置中max-values-per-tag有关)。
Shard:
github.com\influxdata\influxdb\tsdb\shard.go
// Shar