influxdb源码阅读之tsdb核心数据结构梳理

本文详细介绍了InfluxDB的存储引擎TSDB,包括其基于LSM-Tree改造的Time-Structured Merge Tree (TSM)模型。内容涵盖了TSM存储引擎的各个组成部分,如In-Memory Index、WAL、Cache、TSM Files、FileStore、Compactor等。文章还提及Shard的创建过程,以及Store、Engine和Index的抽象接口设计,强调了其可插拔特性,特别是tsm1引擎的结构和数据组织方式。
摘要由CSDN通过智能技术生成

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值