Kafka的Topic、Partition和Message


Kafka的Topic和Partition

Topic

  • Topic是Kafka數據寫入操作的基本單元,可以指定副本
  1. 一個Topic包含一個或多個Partition,建Topic的時候可以手動指定Partition個數,個數與服務器個數相當
  2. 每條消息屬於且僅屬於一個Topic
  3. Producer發布數據時,必須指定將該消息發布到哪個Topic
  4. Consumer訂閱消息時,也必須指定訂閱哪個Topic的信息

 

 

 

 

 

 

 

Partition

  • 每個Partition只會在一個Broker上,物理上每個Partition對應的是一個文件夾
  • Kafka默認使用的是hash進行分區,所以會出現不同的分區數據不一樣的情況,但是partitioner是可以override的
  • Partition包含多個Segment,每個Segment對應一個文件,Segment可以手動指定大小,當Segment達到閾值時,將不再寫數據,每個Segment都是大小相同的
  • Segment由多個不可變的記錄組成,記錄只會被append到Segment中,不會被單獨刪除或者修改,每個Segment中的Message數量不一定相等

 

 

  • 清除過期日志時,支持刪除一個或多個Segment,默認保留7天的數據
  • Kafka實際是用先寫內存映射的文件,磁盤順序讀寫的技術來提高性能的。Producer生產的消息按照一定的分組策略被發送到broker中的partition中的時候,這些消息如果在內存中放不下了,就會放在partition目錄下的文件中,partition目錄名是topic的名稱加上一個序號。在這個目錄下有兩類文件,一類是以log為后綴的文件,另一類是以index為后綴的文件,每一個log文件和一個index文件相對應,這一對文件就是一個Segment File,其中的log文件就是數據文件,里面存放的就是Message,而index文件是索引文件。Index文件記錄了元數據信息,指向對應的數據文件中Message的物理偏移量。
  • LogSegment文件命名的規則是,partition全局的第一個Segment從0(20個0)開始,后續的每一個文件的文件名是上一個文件的最后一條消息的offset值,這樣命名的好處是什么呢?假如我們有一個Consumer已經消費到了offset=x,那么如果要繼續消費的話,就可以使用二分查找法來進行查找,對LogSegment文件進行查找,就可以定位到某個文件,然后拿x值去對應的index文件中去找第x條數據所在的位置。Consumer讀數據的時候,實際是讀Index的offset,並且會記錄上次讀到哪里。

 

 

 

  • 再詳細的分析一下Index文件,上圖的左半部分是Index文件,里面存儲的是n對key-value,其中key是Message在log文件中的編號,比如1,3,6,8.....,表示第1條、第3條、第6條、第8條消息等,但是因為Index文件中並沒有為數據文件中的每條消息都建立索引,而是采用了稀疏存儲的方式,每隔一定字節的數據建立一條索引。這樣避免了索引文件占用過多的空間,從而可以將索引文件保留在內存中,但缺點是沒有建立索引的Message不能一次定位到其在log文件中的位置,這種情況下就需要做一次順序掃描,不過這次順序掃描的范圍就會很小了。value值表示該消息的物理偏移地址。

 

  • 雖然Kafka是順序寫入數據的,但是難以保證全局的消費是有序的。當有多個partition的時候,message在分組存到partition中的時候就已經是無序了,比如0-10這部分消息存到partition1,11-20被存到partition2等。唯一能保證的是,針對一個topic里的數據,在partition的內部消息消費的有序性,全局有序是做不到的。

 

 

 

 

一個Message由固定長度的header和一個變長的消息體body組成

8 byte offset在parition(分區)內的每條消息都有一個有序的id號,這個id號被稱為偏移(offset),它可以唯一確定每條消息在parition(分區)內的位置。即offset表示partiion的第多少message
4 byte message sizemessage大小
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表示實際消息數據。

 

 

參考
Kafka文件的存儲機制:https://www.cnblogs.com/jun1019/p/6256514.html
https://baijiahao.baidu.com/s?id=1608205621370302980&wfr=spider&for=pc

https://blog.csdn.net/lrxcmwy2/article/details/82853300

 

 

Kafka的生成者、消費者、broker的基本概念:https://blog.csdn.net/u010020099/article/details/82290403


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM