LSM-tree 通過緩存的方式將隨機寫轉(zhuǎn)化為順序?qū)懀詷O大提升寫入性能腺律。compaction 則是 LSM-tree 在盡量不影響寫入性能下保證數(shù)據(jù)有序性的機制,中文可譯為”壓實“湘今。InfluxDB 基于 LSM-tree 的變體 TSM-tree 結(jié)構(gòu)返劲,本文基于 InfluxDB v2.0.3@fe04d34版本塞淹,討論其 compaction 策略窟蓝。
按照 compaction 的輸入數(shù)據(jù)來源,可分為 snapshot compaction 和 level compaction 兩類饱普。所有類型的 compaction 輸出的文件類型都是一樣的 tsm 文件运挫,文件名形式為[generation]-[sequence].tsm状共,其中 generation 可以認為是 tsm 文件對應(yīng)的 compaction 序號,而 sequence 則對應(yīng) TSM-tree 的 level谁帕。需要指出的是峡继,sequence 可能會大于最大 level,即超過4匈挖,那么相應(yīng) sequence 的 level 在邏輯上依然是屬于 level 4鬓椭。
snapshot compaction
對 cache 執(zhí)行的 snapshot compaction,由后臺定時任務(wù)(周期1 s)檢測觸發(fā)关划,觸發(fā)條件為 cache 的大小是否超過閾值(默認25 MB)或 cache 的最近一次寫入時間是否早于閾值(默認4小時),cache 作為輸入翘瓮,輸出 level 1的 tsm 文件贮折,tsm 文件中的數(shù)據(jù)以 series key + field name 為粒度有序排列。
level compaction
對不同 level 的 tsm 文件執(zhí)行的 level compaction资盅,由后臺定時任務(wù)(周期1 s)檢測出發(fā)调榄。實際上,選取 tsm 文件的粒度并不直接是文件呵扛,而是 generation每庆。為了描述準確性,后文都將使用 generation今穿。
TSM-tree 的 compaction 是類似于 RocksDB 的 tiered compaction缤灵,即除最大 level 外,只會對當前 level 的 generation 進行合并蓝晒,在每個 level 可能會形成多個 sorted run腮出,通過犧牲一定的讀放大以減小寫放大,這與時序數(shù)據(jù)寫多讀少的場景需求是匹配的芝薇。
TSM-tree 的最大 level 為4胚嘲,可以根據(jù) level compaction 是否需要合并多個 generation 的 tsm 文件將其分為 level 1-3 compaction 和 full compaction 兩類。
level 1-3 compaction
level 1-3 compaction 主要作用是減小 level 內(nèi)的 generation 的數(shù)量洛二,以及執(zhí)行 tombstone 文件的合并馋劈,觸發(fā)條件是對應(yīng) level 內(nèi)的 generation 超過閾值(level 1 超過8,level 2-3 超過4)晾嘶,或?qū)?yīng) level 內(nèi)存在 tombstone 文件妓雾。
full compaction
full compaction 的主要作用是減少 generation 之間的數(shù)據(jù)冗余,因此通常會涉及多個 generation 合并垒迂。按照數(shù)據(jù)輸入可劃分為 full level compaction 和 optimize compaction君珠。
full level compaction
full level compaction 的掃描范圍為 level 1-3 的generation,觸發(fā)條件為上次寫入時間距今超過閾值(默認4小時)娇斑,這個判定條件會導致在部分場景(如備份還原導致停機超過4小時)觸發(fā)不必要的 full level compaction策添。不是所有 generation 都會參與 compaction材部。數(shù)據(jù)已經(jīng)足夠稠密的 generation(文件大小超過2GB,且文件 block 數(shù)量為 1000唯竹,且無 tombstone 文件)不會參與乐导,當然 level 4 的 generation 也不會參與。
optimize compaction
optimize compaction 主要針對 level 4 的 generation浸颓。數(shù)據(jù)已經(jīng)足夠稠密的 generation(文件大小超過2GB物臂,且文件 block 數(shù)量為 1000,且無 tombstone 文件)不會參與产上。