Kafka的Topic和Partition
Topic
- Topic是Kafka數據寫入操作的基本單元,可以指定副本
- 一個Topic包含一個或多個Partition,建Topic的時候可以手動指定Partition個數,個數與服務器個數相當
- 每條消息屬於且僅屬於一個Topic
- Producer發布數據時,必須指定將該消息發布到哪個Topic
- 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