Kafka工作流程
- Kafka 中消息是以 topic 進行分類的,生產者生產消息,消費者消費消息,都是面向 topic 的。
- topic 是邏輯上的概念,而 partition 是物理上的概念。
- 每個partition都有對應的.log文件,該 log 文件中存儲的就是 producer 生產的數據。
- producer生產的數據會發送給topic的每個partition,並追加到partition的.log文件中。
- 消費者組中的每個消費者,都會實時記錄自己消費到了哪個offset,以便出錯恢復時,從上次的位置繼續消費。
- producer發送數據和消費者消費數據的對象都是partition中的leader,其他follower會實時從leader中同步數據,和leader中的數據保持一致。
- 每個partition中的數據是有序的。
Kafka文件存儲機制
- 每個topic可以分爲多個partition。
- Kafka 採取了分片和索引機制,將每個 partition 分爲多個 segment。
- 每個partition可以分爲多個segment。
- 每個segment大小是相同的,且都對應若一個.log和.index文件。
- .log和.index文件成對存在,.log文件記錄的是producer生產的數據,.index文件記錄的是.log文件中每條數據的物理偏移量。
- 每個partition的數據都位於同一個目錄下,並以"topic名稱_partition號"的格式命名。
- partition數據的全局存放路徑可以在Kafka下bin/config/server.properties中配置,配置參數爲:log.dirs=xxx/xxx/xxx
index文件和log文件
- index文件和log文件都以該segment的第一個消息的offset命名。數值最大爲64位long大小,19位數字字符長度,沒有數字用0填充。
- .index文件存儲大量的索引信息,.log文件存儲大量的數據,索引文件中的元數據指向對應數據文件中 message的物理偏移地址。
- 示例:查找offset爲368722的數據
- 首先根據偏移量通過二分查找法快速定位到368722對應的.index文件和.log文件分別爲:00000000000000368739.index和00000000000000368739.log;
- .index文件中每條索引數據的大小也是固定的,因此可以通過offset快速定位到所要查找索引的位置爲:3,497。3表示:該索引對應的消息是該segment中的第三條數據,497表示:該索引對應的數據在00000000000000368739.log中的物理偏移量是497;
- 查找到了368722在00000000000000368739.log中的物理偏移量,也就找到了索要查找到的數據。
message物理結構
參數說明
關鍵字 | 解釋 |
---|---|
8 byte offset | 在parition(分區)內的每條消息都有一個有序的id號,這個id號被稱爲偏移(offset),它可以唯一確定每條消息在parition(分區)內的位置。即offset表示partiion的第多少message |
4 byte message size | message大小 |
4 byte CRC32 | 用crc32校驗message |
1 byte “magic” | 表示本次發佈Kafka服務程序協議版本號 |
1 byte “attributes” | 表示爲獨立版本、或標識壓縮類型、或編碼類型 |
4 byte key length | 表示key的長度,當key爲-1時,K byte key字段不填 |
K byte key | 可選 |
value bytes payload | 表示實際消息數據 |
文章部分內容參考自:https://tech.meituan.com/2015/01/13/kafka-fs-design-theory.html