層級(jí)壓縮
為什么需要壓縮
因?yàn)?sstable 文件越來越多,會(huì)耗盡磁盤空間,并且也會(huì)影響查找效率,所以需要壓縮和合并 sstable枷畏。我們把修改、刪除都當(dāng)作添加操作導(dǎo)致了 sstable 中有大量冗余數(shù)據(jù)虱饿,所以壓縮就是保留最新數(shù)據(jù)拥诡,丟棄舊數(shù)據(jù)触趴。
日志文件
假設(shè)用戶新增一個(gè)鍵值對(duì),如果我們修改 memtable 后就返回成功給用戶渴肉,然后系統(tǒng)立刻崩潰重啟冗懦,用戶就會(huì)發(fā)現(xiàn)新增成功,但是找不到該數(shù)據(jù)仇祭。所以披蕉,為了防止系統(tǒng)崩潰時(shí)丟失最新數(shù)據(jù),在處理用戶請(qǐng)求之前乌奇,先往日志文件中追加一條記錄没讲,再修改 memtable。只要日志文件中有操作記錄华弓,即使系統(tǒng)崩潰了食零,用戶數(shù)據(jù)也不會(huì)丟失困乒。(因?yàn)橹貑⒑蠹牌粒到y(tǒng)可以根據(jù)日志文件重新構(gòu)建一個(gè)完整的 memtable)
那么每次寫操作都要寫文件,對(duì)性能會(huì)不會(huì)有影響呢娜搂?相比純內(nèi)存操作迁霎,多了寫文件的操作,性能肯定會(huì)下降百宇。但是我們獲得了持久化的存儲(chǔ)考廉,這樣的性能代價(jià)也是能接受的。而且携御,往日志文件中追加記錄屬于順序?qū)懖粒碚撋夏苓_(dá)到磁盤I/O的速率,也不會(huì)太慢啄刹。
Level 0
每處理一個(gè)用戶請(qǐng)求涮坐,日志文件就會(huì)多出一條日志記錄。隨著時(shí)間的流逝誓军,日志文件會(huì)越來越大袱讹,直到超過一個(gè)固定大小(默認(rèn)1MB),
- 將 memtable 的內(nèi)容寫到一個(gè)不可修改的 sstable 文件中(存儲(chǔ)在磁盤上)
- 添加這個(gè)新的 sstable* 到 Level-0
當(dāng) Level-0 的文件數(shù)量達(dá)到某個(gè)閾值時(shí)(當(dāng)前是4)昵时,Level-0 的所有文件將與 Level-1 中(和 Level-0 )重疊的文件合并捷雕,生成一系列新的 Level-1 文件(Level-1 中每個(gè)文件的大小為2MB)。
Level-0 的特殊之處在于:處于 Level-0 的 sstable 的 key space 可能是互相重疊的壹甥。
Level >= 1
Level >= 1 :處于同一層級(jí)的 sstable 的 key space 不會(huì)重疊救巷。
當(dāng) Level-T 的大小超過它的限制時(shí),我們就會(huì)在一個(gè)后臺(tái)線程中壓縮它句柠。這個(gè)壓縮線程會(huì)從選擇 Level-T 的某個(gè)文件和 Level-(T+1) 中重疊的所有文件征绸,然后合并它們久橙,生成一系列新的 Level-(T+1) 文件。每個(gè)文件大小默認(rèn)是2MB管怠。