1. 程式人生 > >Kafka工作流程-儲存訊息

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中註冊。