Kafka(五)------Kafka文件儲存特點

1、前提準備

集羣名稱 broker ip
kafka集羣 broker1 127.0.0.1

log.dirs=F://kafka_2.12-2.5.0/data/kafka

創建兩個topic

topic名稱 分區數 副本數
kafkaTopic1 2 1
kafkaTopic2 2 1
#創建topic
.\bin\windows\kafka-topics.bat --create -zookeeper localhost:2181 --replication-factor 1 --partitions 2 --topic "kafkaTopic1"
.\bin\windows\kafka-topics.bat --create -zookeeper localhost:2181 --replication-factor 1 --partitions 2 --topic "kafkaTopic2"

目錄結構
在這裏插入圖片描述

2、topic中partiton存儲特點

單節點文件存儲

在Kafka文件存儲中,同一個topic下有多個不同partition,每個partition單獨爲一個目錄。

partiton命名規則:topic名稱+有序序號,第一個partiton序號從0開始,序號最大值爲partitions數量減1。

多節點kafka集羣文件存儲

轉載:https://blog.csdn.net/lizhitao/article/details/41778193

1、下面以一個Kafka集羣中4個Broker舉例,創建1個topic包含4個Partition,2 Replication;數據Producer流動如圖所示:

在這裏插入圖片描述
2、當集羣中新增2節點,Partition增加到6個,分佈情況如下

在這裏插入圖片描述

3、副本分配邏輯規則如下

在Kafka集羣中,每個Broker都有均等分配Partition的Leader機會。

上述圖Broker Partition中,箭頭指向爲副本,以Partition-0爲例:broker1中parition-0爲Leader,Broker2中Partition-0爲副本。

上述圖種每個Broker(按照BrokerId有序)依次分配主Partition,下一個Broker爲副本,如此循環迭代分配,多副本都遵循此規則。

4、副本分配算法如下:

將所有N Broker和待分配的i個Partition排序.

將第i個Partition分配到第(i mod n)個Broker上.

將第i個Partition的第j個副本分配到第((i + j) mod n)個Broker上.

3、partition中segment 文件存儲特點

由於生產者生產的消息會不斷追加到log文件末尾,爲防止log文件過大導致數據定位效率低下,Kafka採取了分片和索引機制,將每個partition分爲多個segment(邏輯概念,等於index+log文件)

在這裏插入圖片描述

每個partition(目錄)相當於一個巨型文件被平均分配到多個大小相等的segment(片段)數據文件中(每個segment文件中消息數量不一定相等),這種特性也方便old segment的刪除,即方便已被消費的消息的清理,提高磁盤的利用率。每個partition只需要支持順序讀寫就行,segment的文件生命週期由服務端配置參數(log.segment.bytes,log.roll.{ms,hours}等若干參數)決定。

每個segment對應三個文件

#索引文件,便於利用二分查找快速定位message位置
.index
#數據文件
.log
#0.8版本之後引入timeindex文件,標識具體時間日誌
.tiemindex

命令規則

從partition全局的第一個segment從0開始,後續每個segment文件名以當前segment的第一條消息的offset命名,數值大小爲64位,20位數字字符長度,沒有數字用0填充。

在partition中如何通過offset查找message

.index索引文件存儲大量的索引信息,.log數據文件存儲大量消息數據(Message),索引文件中的元數據指向對應數據文件中Message的物理偏移地址。

  • 第一步:需要定位到哪個segment file
    00000000000000000000.index表示最開始的文件,起始偏移量(offset)爲0;第二個文件00000000000000368770.index的起始偏移量爲368770,依次類推。以起始偏移量命名並排序這些文件,只要根據offset二分查找文件列表,就可以快速定位到具體文件。

    當offset=368776時,定位到00000000000000368770.index|log。

  • 第二步:通過Segment File 查找Message
    通過第一步定位到Segment File,當offset=368776時,依次定位到00000000000000368770.index的元數據物理位置和00000000000000368770.log的物理偏移地址,然後再通過00000000000000368770.log順序查找,直到offset=368776爲止。

    Segment Index File採取稀疏索引存儲方式,可以減少索引文件大小,通過Linux mmap接口可以直接進行內存操作。稀疏索引爲數據文件的每個對應Message設置一個元數據指針,它比稠密索引節省了更多的存儲空間,但查找起來需要消耗更多的時間。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章