本系列主要講解kafka基本設計和原理分析,分以下內容:html
topic中partition存儲分佈
假設實驗環境中Kafka集羣只有一個broker,xxx/message-folder爲數據文件存儲根目錄,在Kafka broker中server.properties文件配置(參數log.dirs=xxx/message-folder),例如建立topic名稱分別爲test, partitions數量都爲partitions=4,副本爲1
存儲路徑和目錄規則爲:xxx/logs編程
test-0 test-1 test-2 test-3
在Kafka文件存儲中,同一個topic下有多個不一樣的partition,每一個partiton爲一個目錄,partition的名稱規則爲:topic名稱+有序序號,第一個序號從0開始計,最大的序號爲partition數量減1,partition是實際物理上的概念,而topic是邏輯上的概念。併發
partition中文件存儲方式
下面示意圖形象說明了partition中文件存儲方式:
分佈式
這樣作的好處就是能快速刪除無用文件,有效提升磁盤利用率。
partition中segment文件存儲結構
segment文件由兩部分組成,分別爲「.index」文件和「.log」文件,分別表示爲segment索引文件和數據文件。這兩個文件的命令規則爲:partition全局的第一個segment從0開始,後續每一個segment文件名爲上一個segment文件最後一條消息的offset值,數值大小爲64位,20位數字字符長度,沒有數字用0填充。
下面文件列表是筆者在Kafka broker上作的一個實驗,建立一個topicXXX包含1 partition,設置每一個segment大小爲500MB,並啓動producer向Kafka broker寫入大量數據,以下圖所示segment文件列表形象說明了上述2個規則:高併發
以上述圖2一對segment file文件爲例,說明segment中index<—->data file對應關係物理結構以下:
設計
上述圖3索引文件存儲大量元數據,數據文件存儲大量消息,索引文件中元數據指向對應數據文件中message的物理偏移地址。
其中以索引文件中元數據3,497爲例,依次在數據文件中表示第3個message(在全局partiton表示第368772個message)、以及該消息的物理偏移地址爲497。3d
從上圖瞭解到segment data file由許多message組成,下面詳細說明message物理結構以下:
指針
相關字段含義對應以下:
code
經過offset查找messageserver
例如讀取offset=368776的message,須要經過下面2個步驟查找。
第一步查找segment file
上圖爲例,其中00000000000000000000.index表示最開始的文件,起始偏移量(offset)爲0.第二個文件00000000000000368769.index的消息量起始偏移量爲368770 = 368769 + 1.一樣,第三個文件00000000000000737337.index的起始偏移量爲737338=737337 + 1,其餘後續文件依次類推,以起始偏移量命名並排序這些文件,只要根據offset二分查找文件列表,就能夠快速定位到具體文件。
當offset=368776時定位到00000000000000368769.index|log
第二步經過segment file查找message
經過第一步定位到segment file,當offset=368776時,依次定位到00000000000000368769.index的元數據物理位置和00000000000000368769.log的物理偏移地址,而後再經過00000000000000368769.log順序查找直到offset=368776爲止。
從上圖可知這樣作的優勢,segment index file採起稀疏索引存儲方式,它減小索引文件大小,經過mmap能夠直接內存操做,稀疏索引爲數據文件的每一個對應message設置一個元數據指針,它比稠密索引節省了更多的存儲空間,但查找起來須要消耗更多的時間。
Kafka高效文件存儲設計特色
關於做者
愛編程、愛鑽研、愛分享、愛生活
關注分佈式、高併發、數據挖掘
如需捐贈,請掃碼