Topic在邏輯上可以被認為是一個在的queue,每條消費都必須指定它的topic,可以簡單了解為必須指明把這條消息放進哪個queue裡。 為了使得Kafka的吞吐率可以水準擴充,實體上把topic分成一個或多個partition,每個partition在實體上對應一個檔案夾,該檔案 夾下存儲這個partition的所有消息和索引檔案。
每個日志檔案都是“log entries”序列,每一個<code>log entry</code>包含一個4位元組整型數(值為N),其後跟N個位元組的消息體。每條消息都有一個目前partition下唯一的64位元組的offset,它指明了這條消息的起始位置。磁盤上存儲的消費格式如下:
message length : 4 bytes (value: 1+4+n)
“magic” value : 1 byte
crc : 4 bytes
payload : n bytes
這個“log entries”并非由一個檔案構成,而是分成多個segment,每個segment名為該segment第一條消息的offset和“.kafka”組成。另外會有一個索引檔案,它标明了每個segment下包含的<code>log entry</code>的offset範圍,如下圖所示。
因為每條消息都被append到該partition中,是順序寫磁盤,是以效率非常高(經驗證,順序寫磁盤效率比随機寫記憶體還要高,這是Kafka高吞吐率的一個很重要的保證)。
每一條消息被發送到broker時,會根據paritition規則選擇被存儲到哪一個partition。如果partition規則設定的合理,所有 消息可以均勻分布到不同的partition裡,這樣就實作了水準擴充。(如果一個topic對應一個檔案,那這個檔案所在的機器I/O将會成為這個 topic的性能瓶頸,而partition解決了這個問題)。在建立topic時可以在<code>$KAFKA_HOME/config/server.properties</code>中指定這個partition的數量(如下所示),當然也可以在topic建立之後去修改parition數量。
# The default number of log partitions per topic. More partitions allow greater
# parallelism for consumption, but this will also result in more files across
# the brokers.
num.partitions=3
在發送一條消息時,可以指定這條消息的key,producer根據這個key和partition機制來判斷将這條消息發送到哪個parition。
對于傳統的message queue而言,一般會删除已經被消費的消息,而Kafka叢集會保留所有的消息,無論其被消費與否。當然,因為磁盤限制,不可能永久保留所有資料(實際 上也沒必要),是以Kafka提供兩種政策去删除舊資料。一是基于時間,二是基于partition檔案大小。例如可以通過配置<code>$KAFKA_HOME/config/server.properties</code>,讓Kafka删除一周前的資料,也可通過配置讓Kafka在partition檔案超過1GB時删除舊資料.
摘自:http://lxw1234.com/archives/2015/09/504.htm
本文轉自張昺華-sky部落格園部落格,原文連結:http://www.cnblogs.com/bonelee/p/6892788.html,如需轉載請自行聯系原作者