In-Memory Index

我们可以理解为 TSM 存储的是正排索引,而 Index 存储的是倒排索引。Index 有两种实现,In-Memory index 和 TSI。最初,InfluxDB 仅提供了 In-Memory 实现,后来为了适应大量短暂的 series 的场景,避免内存不足,实现了 TSI。若要使用 TSI,可以通过如下配置:

 # default inmem
index-version = "tsi1"

在 InfluxDB 进程启动的时候会根据 TSM 文件构建出 In-Memory Index。有两个相关的配置:

max-series-per-database = 1000000
max-values-per-tag = 100000

In-Memory Index 有两种:

  • Index:每个 database 目录会创建一个 Index。

  • ShardIndex:每个 shard 目录会创建一个 ShardIndex。

数据库文件目录的层级结构为:db => rp => shard

注册索引创建函数

系统启动的时候会向 tsdb 注册创建 Index 的函数,会注册两个函数,一个用于创建 Index,另一个用于创建 ShardIndex:

创建索引实例

下面是主进程入口一直到 tsdb.(*Store).Open 的流程。

Store 的 Open 操作会遍历 data 目录,为每个 db 创建一个 Index,为每个 Shard 创建一个 ShardIndex。

ShardIndex 与 Index 是组合的关系,通过 opt 传递 Index,所以 ShardIndex 的大部分核心接口都是通过 Index 实现的。

ShardIndex

ShardIndex 的方法分为四类:

  • 删除 series,支持单个和批量。

  • 创建 series

  • SeriesIDSet 相关

  • 仅仅是代理 Index 的方法

数据结构

主要存储了两个字段:

  • seriesIDSet:series Ids 的位图,通过 Roaring Bitmap 实现

  • measurements:measurement name 到 series count 的 map

删除 series

更新measurement 中 series 的数量。

创建 Series

SeriesIDSet 相关

代理 Index 的方法

本身没有逻辑,都是代理 Index 的方法

Index

数据结构

主要包含各种维度的索引,都是通过 map 实现:

  • series: series key 到 series 的索引,series key = measurement + tag set

  • measurements:measurement name 到 measurement 的索引

如下图,Index 是一个多级的 Map 结构:

Last updated

Was this helpful?