Kafka文件存儲(chǔ)機(jī)制需要從以下4個(gè)步驟進(jìn)行分析
(1) topic中partition存儲(chǔ)分布
(2) partiton中文件存儲(chǔ)方式
(3) partiton中segment文件存儲(chǔ)結(jié)構(gòu)
(4) 在partition中如何通過offset查找message
通過上述4過程詳細(xì)分析澎媒,我們就可以清楚認(rèn)識(shí)到kafka文件存儲(chǔ)機(jī)制的奧秘。
1捞奕、topic中partition存儲(chǔ)分布
例如創(chuàng)建2個(gè)topic名稱分別為report_push昧碉、launch_info, partitions數(shù)量都為partitions=4县恕,則存儲(chǔ)路徑和目錄規(guī)則為:
|--report_push-0
|--report_push-1
|--report_push-2
|--report_push-3
|--launch_info-0
|--launch_info-1
|--launch_info-2
|--launch_info-3
在Kafka文件存儲(chǔ)中靠闭,同一個(gè)topic下有多個(gè)不同partition惜论,每個(gè)partition為一個(gè)目錄槽卫,partiton命名規(guī)則為topic名稱+有序序號禽笑,第一個(gè)partiton序號從0開始入录,序號最大值為partitions數(shù)量減1。
2佳镜、partiton中文件存儲(chǔ)方式
下面示意圖形象說明了partition中文件存儲(chǔ)方式:
1僚稿、每個(gè)partion(目錄)相當(dāng)于一個(gè)巨型文件被平均分配到多個(gè)大小相等segment(段)數(shù)據(jù)文件中。但每個(gè)段segment file消息數(shù)量不一定相等蟀伸,這種特性方便old segment file快速被刪除蚀同。
2、每個(gè)partiton只需要支持順序讀寫就行了啊掏,segment文件生命周期由服務(wù)端配置參數(shù)決定蠢络。
這樣做的好處就是能快速刪除無用文件,有效提高磁盤利用率迟蜜。
3刹孔、partiton中segment文件存儲(chǔ)結(jié)構(gòu)
partion中segment file組成和物理結(jié)構(gòu)如下:
1、segment file組成:由2大部分組成娜睛,分別為index file和data file髓霞,此2個(gè)文件一一對應(yīng)卦睹,成對出現(xiàn),后綴".index"和“.log”分別表示為segment索引文件方库、數(shù)據(jù)文件结序。
2、segment文件命名規(guī)則:partion全局的第一個(gè)segment從0開始纵潦,后續(xù)每個(gè)segment文件名為上一個(gè)segment文件最后一條消息的offset值徐鹤。數(shù)值最大為64位long大小,19位數(shù)字字符長度邀层,沒有數(shù)字用0填充返敬。
創(chuàng)建一個(gè)topicXXX包含1 partition,設(shè)置每個(gè)segment大小為500MB,并啟動(dòng)producer向Kafka broker寫入大量數(shù)據(jù),如下所示segment文件列表形象說明了上述2個(gè)規(guī)則:
以上圖中一對segment file文件為例寥院,說明segment中index<-->data file對應(yīng)關(guān)系物理結(jié)構(gòu)如下:
上圖中索引文件存儲(chǔ)大量元數(shù)據(jù)救赐,數(shù)據(jù)文件存儲(chǔ)大量消息,索引文件中元數(shù)據(jù)指向?qū)?yīng)數(shù)據(jù)文件中message的物理偏移地址只磷。
其中以索引文件中元數(shù)據(jù)3,497為例,依次在數(shù)據(jù)文件中表示第3個(gè)message(在全局partiton表示第368772個(gè)message)泌绣、以及該消息的物理偏移地址為497钮追。
從上圖了解到segment data file由許多message組成,下面詳細(xì)說明message物理結(jié)構(gòu)如下:
參數(shù)說明:
8 byte offset
在parition(分區(qū))內(nèi)的每條消息都有一個(gè)有序的id號阿迈,這個(gè)id號被稱為偏移(offset),它可以唯一確定每條消息在parition(分區(qū))內(nèi)的位置元媚。即offset表示partiion的第多少message
4 byte message size
message大小
4 byte CRC32
用crc32校驗(yàn)message
1 byte "magic"
表示本次發(fā)布Kafka服務(wù)程序協(xié)議版本號
1 byte "attributes"
表示為獨(dú)立版本、或標(biāo)識(shí)壓縮類型苗沧、或編碼類型刊棕。
4 byte key length
表示key的長度,當(dāng)key為-1時(shí),K byte key字段不填
K byte key
可選
value bytes payload
表示實(shí)際消息數(shù)據(jù)待逞。
4甥角、在partition中如何通過offset查找message
例如讀取offset=368776的message,需要通過下面2個(gè)步驟查找识樱。
1嗤无、第一步查找segment file
上圖為例,其中00000000000000000000.index表示最開始的文件怜庸,起始偏移量(offset)為0.第二個(gè)文件00000000000000368769.index的消息量起始偏移量為368770 = 368769 + 1.同樣当犯,第三個(gè)文件00000000000000737337.index的起始偏移量為737338=737337 + 1铺峭,其他后續(xù)文件依次類推潮剪,以起始偏移量命名并排序這些文件咖摹,只要根據(jù)offset 二分查找文件列表催束,就可以快速定位到具體文件梆暮。
當(dāng)offset=368776時(shí)定位到00000000000000368769.index|log
2、第二步通過segment file查找message
通過第一步定位到segment file蒙秒,當(dāng)offset=368776時(shí)交汤,依次定位到00000000000000368769.index的元數(shù)據(jù)物理位置和00000000000000368769.log的物理偏移地址,然后再通過00000000000000368769.log順序查找直到offset=368776為止恰响。
從上述圖3可知這樣做的優(yōu)點(diǎn)趣钱,segment index file采取稀疏索引存儲(chǔ)方式,它減少索引文件大小胚宦,通過mmap可以直接內(nèi)存操作首有,稀疏索引為數(shù)據(jù)文件的每個(gè)對應(yīng)message設(shè)置一個(gè)元數(shù)據(jù)指針,它比稠密索引節(jié)省了更多的存儲(chǔ)空間,但查找起來需要消耗更多的時(shí)間枢劝。