influxdb tsi1 索引

包 tsi1

tsi1 包提供了一种内存映射索引实现,支持高基数序列。

概述

tsi1 中的顶级对象是 Index。它是系统其他部分的主要访问入口。IndexLogFileIndexFile 对象组成。

日志文件是小型的预写式日志文件,它们会按照接收顺序立即记录新的序列。文件中的数据会在内存中建立索引,以便能够快速访问。当系统重启时,这个日志文件会被重放,内存中的表示也会被重建。

索引文件也包含序列信息,不过,它们经过了高度索引,因此可以快速执行读取操作。索引文件是通过一个称为压缩的过程构建的,在这个过程中,一个日志文件或多个索引文件会被合并在一起。

操作

该索引可以执行许多与序列、测量和标签数据相关的任务。所有数据都是通过向索引中添加序列来插入的。在添加序列时,测量名称、标签键和标签值都会被分别提取并建立索引。

一旦添加了一个序列,就可以通过几种方式将其删除。首先,可以删除单个序列。其次,可以在批量操作中通过删除整个测量来删除该序列。

查询引擎需要能够以多种方式查找序列,例如按测量名称、按标签值或使用正则表达式。索引提供了一个 API,用于遍历序列的子集并执行集合操作,如并集和交集。

日志文件布局

序列最初插入的预写式文件只是按顺序追加所有新操作。它仅由一系列日志条目组成。一个条目包含一个标志,用于指定操作类型、测量名称、标签集和一个校验和。

┏━━━━━━━━━日志条目━━━━━━━━━┓
┃ ┌──────────────────────┐ ┃
┃ │         标志         │ ┃
┃ ├──────────────────────┤ ┃
┃ │     测量名称       │ ┃
┃ ├──────────────────────┤ ┃
┃ │      键/值对       │ ┃
┃ ├──────────────────────┤ ┃
┃ │      键/值对       │ ┃
┃ ├──────────────────────┤ ┃
┃ │      键/值对       │ ┃
┃ ├──────────────────────┤ ┃
┃ │       校验和       │ ┃
┃ └──────────────────────┘ ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━┛

当重放日志文件时,如果校验和不正确或条目不完整(由于部分写入失败),则会截断日志。

索引文件布局

索引文件由 3 种主要的块类型组成:一个序列块、一个或多个标签块以及一个测量块。在索引文件的末尾是一个尾部,用于记录这些块的偏移量等元数据。

序列块布局

序列块按排序顺序存储原始序列键。它还提供哈希索引,以便能够快速查找序列。为了在写入时限制内存大小,会定期插入哈希索引。一旦所有序列和哈希索引都已写入,就会写入一个索引条目列表,以便可以通过二分查找来查找哈希索引。

该块的末尾包含两个 HyperLogLog++ 草图,用于跟踪已创建和已删除序列的估计数量。草图之后是一个尾部,其中包含有关该块的元数据。

┏━━━━━━━序列块━━━━━━━━┓
┃ ┌──────────────────────┐ ┃
┃ │      序列键      │ ┃
┃ ├──────────────────────┤ ┃
┃ │      序列键      │ ┃
┃ ├──────────────────────┤ ┃
┃ │      序列键      │ ┃
┃ ├──────────────────────┤ ┃
┃ │                      │ ┃
┃ │      哈希索引      │ ┃
┃ │                      │ ┃
┃ ├──────────────────────┤ ┃
┃ │      序列键      │ ┃
┃ ├──────────────────────┤ ┃
┃ │      序列键      │ ┃
┃ ├──────────────────────┤ ┃
┃ │      序列键      │ ┃
┃ ├──────────────────────┤ ┃
┃ │                      │ ┃
┃ │      哈希索引      │ ┃
┃ │                      │ ┃
┃ ├──────────────────────┤ ┃
┃ │    索引条目      │ ┃
┃ ├──────────────────────┤ ┃
┃ │     HLL 草图      │ ┃
┃ ├──────────────────────┤ ┃
┃ │       尾部        │ ┃
┃ └──────────────────────┘ ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━┛

标签块布局

在序列块之后是一个或多个标签块。索引文件中的每个测量都有一个这样的块。该块的结构是每个键的排序值列表,然后是排序的键列表。这些列表中的每一个都有自己的哈希索引,用于快速直接查找。

┏━━━━━━━━标签块━━━━━━━━━┓
┃ ┌──────────────────────┐ ┃
┃ │        值         │ ┃
┃ ├──────────────────────┤ ┃
┃ │        值         │ ┃
┃ ├──────────────────────┤ ┃
┃ │        值         │ ┃
┃ ├──────────────────────┤ ┃
┃ │                      │ ┃
┃ │      哈希索引      │ ┃
┃ │                      │ ┃
┃ └──────────────────────┘ ┃
┃ ┌──────────────────────┐ ┃
┃ │        值         │ ┃
┃ ├──────────────────────┤ ┃
┃ │        值         │ ┃
┃ ├──────────────────────┤ ┃
┃ │                      │ ┃
┃ │      哈希索引      │ ┃
┃ │                      │ ┃
┃ └──────────────────────┘ ┃
┃ ┌──────────────────────┐ ┃
┃ │         键         │ ┃
┃ ├──────────────────────┤ ┃
┃ │         键         │ ┃
┃ ├──────────────────────┤ ┃
┃ │                      │ ┃
┃ │      哈希索引      │ ┃
┃ │                      │ ┃
┃ └──────────────────────┘ ┃
┃ ┌──────────────────────┐ ┃
┃ │       尾部        │ ┃
┃ └──────────────────────┘ ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━┛

每个值条目都包含一个使用该值的序列键的排序偏移量列表。可以围绕单个标签键值构建序列迭代器,或者可以使用并集或交集等集合运算符合并多个迭代器。

测量块

测量块存储一个排序的测量列表、它们关联的序列偏移量以及它们标签块的偏移量。这使得可以快速遍历一个测量的所有序列,并且可以快速直接查找测量及其标签。

这个块还包含用于新测量和已删除测量的 HyperLogLog++ 草图。

┏━━━━测量块━━━━━┓
┃ ┌──────────────────────┐ ┃
┃ │     测量名称     │ ┃
┃ ├──────────────────────┤ ┃
┃ │     测量名称     │ ┃
┃ ├──────────────────────┤ ┃
┃ │     测量名称     │ ┃
┃ ├──────────────────────┤ ┃
┃ │                      │ ┃
┃ │      哈希索引      │ ┃
┃ │                      │ ┃
┃ ├──────────────────────┤ ┃
┃ │     HLL 草图      │ ┃
┃ ├──────────────────────┤ ┃
┃ │       尾部        │ ┃
┃ └──────────────────────┘ ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━┛

清单文件

索引只是日志文件和索引文件的有序集合。这些文件可以合并在一起或重写,但它们的顺序必须始终保持不变。这是因为序列、测量和标签可以被标记为已删除(即逻辑删除),并且需要按时间顺序跟踪此操作。

每当活动文件集发生更改时,都会写入一个清单文件来跟踪该集合。清单指定文件的顺序,并且在启动时,索引目录中所有不在清单中的文件都会从索引目录中删除。

压缩索引文件

压缩是将文件合并为单个文件的过程。TSI 中有两个压缩阶段。

首先,一旦日志文件超过大小阈值,它们就会被压缩成一个索引文件。这个阈值相对较小,因为日志文件必须在堆中维护其索引,而 TSI 尽量避免这种情况。小的日志文件也可以非常快速地转换为索引文件,因此会积极进行此操作。

其次,一旦连续的一组索引文件超过某个因子(例如 10 倍),它们就会全部合并为一个索引文件,并且旧文件会被丢弃。由于所有块都是按排序顺序写入的,因此新的索引文件可以流式处理,从而最大限度地减少内存使用。

并发

索引文件是不可变的,因此它们不需要细粒度的锁,但是,压缩操作需要我们跟踪哪些文件正在使用,以免它们被过早丢弃。这是通过对文件集使用引用计数来实现的。

文件集只是一个有序的索引文件列表。当从索引中获取当前文件集时,会增加一个计数器以跟踪其使用情况。一旦用户完成对文件集的使用,就会释放它并且计数器会减少。在这个计数器归零之前,文件不能从文件系统中删除。

除了引用计数之外,在读取或写入索引文件时没有其他锁定机制。但是,每当访问日志文件时都需要加锁。这也是尽量减小日志文件大小的另一个原因。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容