實際上能看到的就是topicname+partitionid這個檔案。
這個檔案下有兩個東西很重要。
.log結尾的檔案是真正儲存資料的。
.index是存放索引的。
先看看.log檔案:缺省會儲存7天。七天過了會把這些老的資料刪除掉。
再server.properties配置檔案種,還有乙個引數:儲存1g
這個log是這個
而不是它的日誌。
如果這個檔案超過了1g,就會再建立乙個檔案。而不會再往裡面放資料了。
超過1g之後,新建立乙個檔案,怎麼命名呢?
1g的檔案,儲存的都是訊息,怎麼快速從1g資料裡面定位到這個資料呢?
這個時候就有index檔案起作用了。
segment:片段。指的是當前這個分割槽裡面的乙個片段資料。裡面只儲存資料hello,atguigu等等。但是怎麼定位,就需要依賴index。
kafka的分片機制:分片的規則,按照1g進行分片,往log裡面只放資料。
這些東西就是偏移量,是當前log最小的偏移量,
.index檔案裡面儲存的東西:
假如某個分割槽裡面形成了兩個log檔案,
index索引對應的是log檔案的索引。
我們假設log檔案裡面有六台就儲存了1g。
所以對應的是
00000000000000.index
00000000000000.log
.log裡面只儲存資料,但是資料被序列化了,cat看不到。
.index裡面提供的是索引,儲存的是開始位置的偏移量。
因為.log檔案中儲存的是具體的6條訊息,所以index裡面提供的是當前log檔案對應訊息的索引。是開始位置的偏移量。
儲存的是當前6條訊息的起始偏移量。
這樣設計的方式可以怎麼定位資料呢?
首先,比較index字尾,需要找到這個訊息對應的index檔案。使用二分查詢法定位到index檔案。定位到檔案之後,就需要找到具體的訊息。這裡儲存的是訊息的起始偏移量。所以,index檔案裡面的每一條資料的大小都是一樣的,因為他們相當於元資料,儲存的是相同的內容。他們儲存的內容包括,對應訊息的起始偏移量和訊息的大小。
它們的大小一樣,所以可以快速的定位到某條訊息的起始偏移量
hdfsio流的分段讀取:seek()
比如,現在找到了訊息3這個起始偏移量而且這個訊息的大小是1000b,那我們就需要定位:756-1756這段資料拿出來,就找到了第三個訊息的內容。
1、通過二分查詢找到索引檔案
2、因為,在索引檔案中,每條資料大小一樣,掃瞄的話,就非常的快,就能很快地找到偏移量和對應訊息的大小,然後再去log中去查詢。
比我們直接去log裡面找,快得多。
所以,雖然kafka把資料儲存在磁碟中,但是讀寫速度還是很快的。
Kafka高階 工作機制與檔案儲存機制
producer向topic leader分類推送資料,每乙個佇列的主題都不同。topic leader向topic follower實時備份資料,防止topic leader突然掛掉。consumer消費topic leader中的資料,以offset為標誌,表示消費到的位置,以便出錯恢復時,從上...
Kafka檔案的儲存機制
同乙個topic下有多個不同的partition,每個partition為乙個目錄,partition命名的規則是topic的名稱加上乙個序號,序號從0開始。每乙個partition目錄下的檔案被平均切割成大小相等 預設乙個檔案是500兆,可以手動去設定 的資料檔案,每乙個資料檔案都被稱為乙個段 s...
Kafka檔案的儲存機制
同乙個topic下有多個不同的partition,每個partition為乙個目錄,partition命名的規則是topic的名稱加上乙個序號,序號從0開始。每乙個partition目錄下的檔案被平均切割成大小相等 預設乙個檔案是500兆,可以手動去設定 的資料檔案,每乙個資料檔案都被稱為乙個段 s...