數據存儲結構:
Kafka中的Message是以topic為基本單位組織的,不同的topic之間是相互獨立的。每個topic又可以分成幾個不同的partition(每個topic有幾個partition是在創建topic時指定的),每個partition存儲一部分Message。
partition是以文件的形式存儲在文件系統中,比如,創建了一個名為page_visits的topic,其有5個partition,那么在Kafka的數據目錄中(由配置文件中的log.dirs指定的)中就有這樣5個目錄: page_visits-0, page_visits-1,page_visits-2,page_visits-3,page_visits-4,其命名規則為<topic_name>-<partition_id>,里面存儲的分別就是這5個partition的數據。
Partition中的每條Message由offset來表示它在這個partition中的偏移量,這個offset不是該Message在partition數據文件中的實際存儲位置,而是邏輯上一個值,它唯一確定了partition中的一條Message。類似於下面的一個圖片,消息存儲在每個log文件中,index對應的是消息的索引信息,另外,為了讓消息消費的時候更快,又將文件分成很多段。
數據消費查詢:
我們要查詢 offset 為7的消息,那kafka就會快速定位到這個index文件,得知offset 為7的消息在6,9807后面,這時候就可以通過9807快速定位到數據文件,然后從位置為9807的那個地方開始順序掃描直到找到offset為7的那條Message。