Kafka是什么
Kafka是最初由Linkedin公司開發(fā),是一個分布式、分區(qū)的、多副本的、多訂閱者,基于zookeeper協(xié)調(diào)的分布式日志系統(tǒng)(也可以當(dāng)做MQ系統(tǒng)),常見可以用于web/nginx日志、訪問日志,消息服務(wù)等等,Linkedin于2010年貢獻(xiàn)給了Apache基金會并成為頂級開源項(xiàng)目。
1.前言
一個商業(yè)化消息隊(duì)列的性能好壞,其文件存儲機(jī)制設(shè)計(jì)是衡量一個消息隊(duì)列服務(wù)技術(shù)水平和最關(guān)鍵指標(biāo)之一。
下面將從Kafka文件存儲機(jī)制和物理結(jié)構(gòu)角度,分析Kafka是如何實(shí)現(xiàn)高效文件存儲,及實(shí)際應(yīng)用效果。
2.Kafka文件存儲機(jī)制
Kafka部分名詞解釋如下:
Broker:消息中間件處理結(jié)點(diǎn),一個Kafka節(jié)點(diǎn)就是一個broker,多個broker可以組成一個Kafka集群。
Topic:一類消息,例如page view日志、click日志等都可以以topic的形式存在,Kafka集群能夠同時負(fù)責(zé)多個topic的分發(fā)。
Partition:topic物理上的分組,一個topic可以分為多個partition,每個partition是一個有序的隊(duì)列。
Segment:partition物理上由多個segment組成,下面2.2和2.3有詳細(xì)說明。
offset:每個partition都由一系列有序的、不可變的消息組成,這些消息被連續(xù)的追加到partition中。partition中的每個消息都有一個連續(xù)的序列號叫做offset,用于partition唯一標(biāo)識一條消息.
分析過程分為以下4個步驟:
topic中partition存儲分布
partiton中文件存儲方式
partiton中segment文件存儲結(jié)構(gòu)
在partition中如何通過offset查找message
通過上述4過程詳細(xì)分析,我們就可以清楚認(rèn)識到kafka文件存儲機(jī)制的奧秘。
2.1 topic中partition存儲分布
假設(shè)實(shí)驗(yàn)環(huán)境中Kafka集群只有一個broker,xxx/message-folder為數(shù)據(jù)文件存儲根目錄,在Kafka broker中server.properties文件配置(參數(shù)log.dirs=xxx/message-folder),例如創(chuàng)建2個topic名稱分別為report_push、launch_info, partitions數(shù)量都為partitions=4
存儲路徑和目錄規(guī)則為:
xxx/message-folder
|--report_push-0
|--report_push-1
|--report_push-2
|--report_push-3
|--launch_info-0
|--launch_info-1
|--launch_info-2
|--launch_info-3
在Kafka文件存儲中,同一個topic下有多個不同partition,每個partition為一個目錄,partiton命名規(guī)則為topic名稱+有序序號,第一個partiton序號從0開始,序號最大值為partitions數(shù)量減1。
如果是多broker分布情況,請參考 kafka集群partition分布原理分析
2.2 partiton中文件存儲方式
下面示意圖形象說明了partition中文件存儲方式:

圖1
每個partion(目錄)相當(dāng)于一個巨型文件被平均分配到多個大小相等segment(段)數(shù)據(jù)文件中。但每個段segment file消息數(shù)量不一定相等,這種特性方便old segment file快速被刪除。
每個partiton只需要支持順序讀寫就行了,segment文件生命周期由服務(wù)端配置參數(shù)決定。
這樣做的好處就是能快速刪除無用文件,有效提高磁盤利用率。
2.3 partiton中segment文件存儲結(jié)構(gòu)
讀者從2.2節(jié)了解到Kafka文件系統(tǒng)partition存儲方式,本節(jié)深入分析partion中segment file組成和物理結(jié)構(gòu)。
segment file組成:由2大部分組成,分別為index file和data file,此2個文件一一對應(yīng),成對出現(xiàn),后綴”.index”和“.log”分別表示為segment索引文件、數(shù)據(jù)文件.
segment文件命名規(guī)則:partion全局的第一個segment從0開始,后續(xù)每個segment文件名為上一個segment文件最后一條消息的offset值。數(shù)值最大為64位long大小,19位數(shù)字字符長度,沒有數(shù)字用0填充。
下面文件列表是筆者在Kafka broker上做的一個實(shí)驗(yàn),創(chuàng)建一個topicXXX包含1 partition,設(shè)置每個segment大小為500MB,并啟動producer向Kafka broker寫入大量數(shù)據(jù),如下圖2所示segment文件列表形象說明了上述2個規(guī)則:

圖2
以上述圖2中一對segment file文件為例,說明segment中index<—->data file對應(yīng)關(guān)系物理結(jié)構(gòu)如下:
