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 = 100000In-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?
