Kafka工作流程-儲存訊息
1.儲存方式
物理上把topic分成一個或多個patition(對應 server.properties 中的num.partitions=3配置),每個patition物理上對應一個資料夾(該資料夾儲存該patition的所有訊息和索引檔案),如下:
[[email protected] logs]$ ls -l
drwxrwxr-x 2 luomk luomk 4096 7月 3 00:23 second-0
drwxrwxr-x 2 luomk luomk 4096 7月 3 00:23 second-1
[[email protected] logs]$ cd first-0/
[ [email protected] first-0]$ ls -l
總用量 8
-rw-rw-r-- 1 luomk luomk 10485760 7月 3 00:23 00000000000000000477.index
-rw-rw-r-- 1 luomk luomk 221 7月 3 00:32 00000000000000000477.log
-rw-rw-r-- 1 luomk luomk 10485756 7月 3 00:23 00000000000000000477.timeindex
-rw-rw-r-- 1 luomk luomk 11 7月 3 00:32 leader-epoch-checkpoint
[[email protected] first-0]$
2.儲存策略
無論訊息是否被消費,kafka都會保留所有訊息。有兩種策略可以刪除舊資料:
(1) 基於時間:log.retention.hours=168
(2) 基於大小:log.retention.bytes=1073741824
需要注意的是,因為Kafka讀取特定訊息的時間複雜度為O(1),即與檔案大小無關,所以這裡刪除過期檔案與提高 Kafka 效能無關。
producers可以一步的並行向kafka傳送訊息,但是通常producer在傳送完訊息之後會得到一個響應,返回的是offset值或者傳送過程中遇到的錯誤。這其中有個非常重要的引數“request.required.acks”,這個引數決定了producer要求leader partition收到確認的副本個數,如果acks設定為0,表示producer不會等待broker的相應,所以,producer無法知道訊息是否發生成功,這樣有可能導致資料丟失,但同時,acks值為0會得到最大的系統吞吐量。若acks設定為1,表示producer會在leader partition收到訊息時得到broker的一個確認,這樣會有更好的可靠性,因為客戶端會等待知道broker確認收到訊息。若設定為-1,producer會在所有備份的partition收到訊息時得到broker的確認,這個設定可以得到最高的可靠性保證。
3.Zookeeper 儲存結構
Zookeeper儲存結構如下圖:
注意:producer不在zk中註冊,消費者在zk中註冊。