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設置一個元數據指針,它比稠密索引節省了更多的存儲空間,但查找起來需要消耗更多的時間。