面試知識(shí)點(diǎn) | Kafka的數(shù)據(jù)存儲(chǔ)與索引設(shè)計(jì)
點(diǎn)擊上方藍(lán)色字體,選擇“設(shè)為星標(biāo)”

本文會(huì)介紹Kafka的底層數(shù)據(jù)存儲(chǔ)形式、Kafka的高效索引設(shè)計(jì)及實(shí)際查詢的過(guò)程。
1、segment
Kafka把Partition分成若干個(gè)segment,segment是Kafka的最小存儲(chǔ)單元。在broker往分區(qū)里面寫入數(shù)據(jù)時(shí),如果達(dá)到segment上限,就關(guān)閉當(dāng)前segment并打開一個(gè)新segment。沒有關(guān)閉的segment叫做活躍片段,活躍片段永遠(yuǎn)不會(huì)被刪除。(默認(rèn)segment上限是1GB大小或者存活一周,所以如果配置了topic數(shù)據(jù)保存1天,但是5天了segment都沒有1GB,則數(shù)據(jù)會(huì)存儲(chǔ)5天。)
這樣子設(shè)計(jì)相當(dāng)于把整個(gè)partition這個(gè)『大文件』拆成了細(xì)碎小文件,避免了在一個(gè)大文件里面查找內(nèi)容;而且要數(shù)據(jù)過(guò)期要?jiǎng)h除的話可以直接刪除整個(gè)文件,比刪文件里面的內(nèi)容更簡(jiǎn)單。

2、存儲(chǔ)與查詢
segment的真正存儲(chǔ)會(huì)分成2份文件,一種是.index的索引文件,一種是.log的數(shù)據(jù)存儲(chǔ)文件,成對(duì)出現(xiàn)。index保存offset的索引,log保存真正的數(shù)據(jù)內(nèi)容。index文件的文件名是本文件的起始o(jì)ffset。

如上圖,假設(shè)要查詢offset=368775的數(shù)據(jù),則命中了0000000000000368769這個(gè)index,查看到368775在這個(gè)index文件中位于第三位(368775 = 368769 + 6,剛好命中這個(gè)索引),對(duì)應(yīng)到log文件的物理偏移量是1407。如果沒有命中這個(gè)索引,則通過(guò)上個(gè)索引的文件偏移量再順序查詢。
3、索引設(shè)計(jì)
Kafka建立的這種索引也就是稀疏索引,即建立較少offset的索引用來(lái)較少內(nèi)存使用。但是由于offset的索引建立得不完全,則查詢命中可能消耗更多時(shí)間。

版權(quán)聲明:
文章不錯(cuò)?點(diǎn)個(gè)【在看】吧!??




