InfluxDB的索引儲存

2021-10-03 03:26:45 字數 3500 閱讀 7597

tsi

預設配置下索引資訊存放於記憶體中,index-version="tsi1"配置作用是將索引資訊持久化至硬碟,tsi索引主要包含logfile檔案(.tsl結尾)、tsi檔案,其實上篇提到的series 檔案也算。tsl、tsi檔案位於在每個shard中index目錄下。

index file

當tsl檔案大小達到配置的閾值時(由配置檔案中的max-index-log-file-size指定,預設為1m),logfile檔案會compaction成tsi檔案,tsi檔案算是儲存格式最為複雜的。

magic

tag blocks

measurement block

seriesid set

tombstoneseriesidset

seriessketch

tombstonesketch

trailer

4 byte

82 byte

其中最為重要的是measurement block和tag blocks,因為measurement block中有tag block的索引。先來看measurement block的結構

measurements

hashindex

measurements sketch

measurements tombstone sketch

trailer

66 byte

同樣trailer包含各個模組的位址和大小。measurements中包含多個measurement,通過hashindex來確定measurement的位址,key為measurement name。measurements sketch和measurements tombstone sketch用來記數統計使用。先通過trailer定取到hashindex的位址和大小,讀出hashindex再根據我們提供的name去取measurement。先來看hashindex的格式

measurements count

measurement 1 offsize

measurement 2 offsize…

8 byte

8 byte

通過measurement name經過hash計算就可以得到measurement的位址,接下裡繼續看measurement的結構

flag

tag block offsize

tag block size

measurement name size

measurement name

series count

series data size

series data18

8---

--flag表示series data 的編碼方式,分別是變長varint編碼或者roaring bitmap方式,tag block offsize指的是該measurement對應的tag block的位址。measurement name size、series count、series data size用varint方式編碼。series count指的是當前measurement在此檔案中的series id 個數。

通過measurement block拿到了tag block的位址,乙個measurement可能存在多個tag,也放在乙個tag block中。接下裡看tag block的儲存格式

tag block value iterator

value index

…tag block key iterator

key hash index

trailer

58 byte

tagblock儲存了某個measurement的tagkey和ta**alue,前面我們根據measurement block獲取到該measurement的tagblock的位址以及大小(size),因此可以直接獲取tagblock的trailer,同樣該trailer儲存了各個模組的位址和大小,首先是tag block value iterator和value index,我們知道乙個tag key對應多個value,同樣乙個measurement中也可能存在多個tag key。乙個key對應的values 儲存在乙個tag block value iterator中。tag block value iterator是tagblockvalueelem的集合,(至於為什麼這麼命名,是因為原始碼中就是這麼命名的)。接下裡是tag block key iterator,這個模組是tag key的集合,乙個tag key對應的結構稱為tagblockkeyelem,tagblockkeyelem儲存了某個key,以及key對應的tag block value iterator的位址以及大小等資訊。key hash index是對tagblockkeyelem的索引,該模組的結構非常簡單,和前面的索引結構相同,即[cout,off1,off2…],每個值占用8byte。當然是通過key name來定位。拿到了tagblockkeyelem的位址,接下裡看tagblockkeyelem的結構

flag

values offsize

values size

values index offsize

values index size

key size

key name

1 byte

8byte

8byte

8byte

8byte--

flag表示是否刪除,0表示未刪除,values offsize表示key對應的tag block value iterator的位址,對於多個value如何快速的找到某個具體value,這裡就需要對value進行索引,這就是values index的作用,每個tag block value iterator都乙個valueindex。values index offsize表示該tag block value iterator的位址。接下裡是key size採用變長編碼,key name就是 tag key。通過tagblockkeyelem獲取到了tag block value iterator的位址以及values index offsize,我們可以通過values index獲取到任意乙個value的資訊,接下裡看tag block value iterator中的tagblockvalueelem結構

flag

value size

value

series count

series size

series data

1 byte--

---flag表示該value對應的series data的編碼方式,roaring bitmap或者原生varint編碼,value size、series count、series size採用varint編碼。在講述measurement block中也提到了series data ,measurement block中的series data儲存了當前檔案中該measurement擁有的所有的series id(bitmap儲存),而在tagblockvalueelem中的series data 儲存了該value對應的series id。

InfluxDB 倒排索引之Index檔案

本文主要講解influxdb中的倒排索引,influxdb和傳統的lsm tree hbase使用的模型 不一樣的地方是其內部中多了乙個倒排索引,這也是讓influxdb查詢較快的秘訣。在1.7的 版本中,influxdb提供了兩種型別的倒排索引,記憶體和磁碟的,之前只有記憶體版本的,但是隨著資料的...

mysql索引儲存形式 MySql索引儲存形式

聚簇索引 聚集索引 非聚簇索引 非聚集索引 是因為儲存引擎不同引起的,儲存引擎中innodb是聚簇索引 myisam是非聚簇索引,聚簇索引是資料與索引儲存在乙個起,非聚簇索引資料乙個檔案 索引乙個檔案,資料與索引不在乙個檔案中。mysql的索引以b tree的資料結構儲存在磁碟,預設儲存引擎為inn...

索引的儲存結構

下面是本人畫的一張關於資料頁和索引儲存結構圖 此圖中,最上部分是資料頁的儲存結構。下半部分是表中有索引,這裡就出現了b tree結構,索引的根級會引用索引的下一級,直到索引的最後一級,這一級引用的物件是rid 當表中不存在聚集索引時,rid會指向每一行資料儲存位置,rid的字段長度為16位元組 或聚...