Kafka文件存儲機制那些事

1. Kafka是什么

Kafka是最初由Linkedin公司開發(fā)谨垃,是一個分布式癣诱、分區(qū)的匿沛、多副本的、多訂閱者须板,基于zookeeper協(xié)調的分布式日志系統(tǒng)(也可以當做MQ系統(tǒng))碰镜,常見可以用于web/nginx日志、訪問日志习瑰,消息服務等等绪颖,Linkedin于2010年貢獻給了Apache基金會并成為頂級開源項目.

2.前言

一個商業(yè)化消息隊列的性能好壞,其文件存儲機制設計是衡量一個消息隊列服務技術水平和最關鍵指標之一甜奄。
下面將從Kafka文件存儲機制和物理結構角度柠横,分析Kafka是如何實現(xiàn)高效文件存儲,及實際應用效果课兄。

3. Kafka文件存儲機制

Kafka部分名詞解釋如下:
  • Broker:消息中間件處理結點牍氛,一個Kafka節(jié)點就是一個broker,多個broker可以組成一個Kafka集群烟阐。
  • Topic:一類消息搬俊,例如page
  • view日志、click日志等都可以以topic的形式存在蜒茄,Kafka集群能夠同時負責多個topic的分發(fā)唉擂。
  • Partition:topic物理上的分組,一個topic可以分為多個partition檀葛,每個partition是一個有序的隊列玩祟。
  • Segment:partition物理上由多個segment組成,下面2.2和2.3有詳細說明驻谆。
  • offset:每個partition都由一系列有序的卵凑、不可變的消息組成庆聘,這些消息被連續(xù)的追加到partition中胜臊。partition中的每個消息都有一個連續(xù)的序列號叫做offset,用于partition唯一標識一條消息.
分析過程分為以下4個步驟:
  • topic中partition存儲分布
  • partiton中文件存儲方式
  • partiton中segment文件存儲結構
  • 在partition中如何通過offset查找message

通過上述4過程詳細分析,我們就可以清楚認識到kafka文件存儲機制的奧秘伙判。

3.1 topic中partition存儲分布

假設實驗環(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


在Kafka文件存儲中谎势,同一個topic下有多個不同partition来颤,每個partition為一個目錄,partiton命名規(guī)則為topic名稱+有序序號抚吠,第一個partiton序號從0開始,序號最大值為partitions數(shù)量減1弟胀。

3.2 partition中文件存儲方式

下面示意圖形象說明了partition中文件存儲方式:


  • 每個partition(目錄)相當于一個巨型文件被平均分配到多個大小相等segment(段)數(shù)據(jù)文件中楷力。但每個段segment file消息數(shù)量不一定相等,這種特性方便old segment file快速被刪除孵户。
  • 每個partition只需要支持順序讀寫就行了萧朝,segment文件生命周期由服務端配置參數(shù)決定。

這樣做的好處就是能快速刪除無用文件夏哭,有效提高磁盤利用率检柬。

3.3 partition中segment文件存儲結構

讀者從3.2節(jié)了解到Kafka文件系統(tǒng)partition存儲方式,本節(jié)深入分析partition中segment file組成和物理結構竖配。

  • segment file組成:由2大部分組成何址,分別為index file和data file,此2個文件一一對應进胯,成對出現(xiàn)头朱,后綴”.index”和“.log”分別表示為segment索引文件、數(shù)據(jù)文件.
  • segment文件命名規(guī)則:partition全局的第一個segment從0開始龄减,后續(xù)每個segment文件名為上一個segment文件最后一條消息的offset值项钮。數(shù)值最大為64位long大小,19位數(shù)字字符長度希停,沒有數(shù)字用0填充烁巫。

下面文件列表是筆者在Kafka broker上做的一個實驗,創(chuàng)建一個topicXXX包含1 partition宠能,設置每個segment大小為500MB,并啟動producer向Kafka broker寫入大量數(shù)據(jù),如下圖2所示segment文件列表形象說明了上述2個規(guī)則:


以上述圖2中一對segment file文件為例亚隙,說明segment中index<—->data file對應關系物理結構如下:



上述圖3中索引文件存儲大量元數(shù)據(jù),數(shù)據(jù)文件存儲大量消息违崇,索引文件中元數(shù)據(jù)指向對應數(shù)據(jù)文件中message的物理偏移地址阿弃。

其中以索引文件中元數(shù)據(jù)3,497為例,依次在數(shù)據(jù)文件中表示第3個message(在全局partiton表示第368772個message)羞延、以及該消息的物理偏移地址為497渣淳。

從上述圖3了解到segment data file由許多message組成,下面詳細說明message物理結構如下:


參數(shù)說明


3.4 在partition中如何通過offset查找message

例如讀取offset=368776的message伴箩,需要通過下面2個步驟查找入愧。

  • 第一步查找segment file
    上述圖2為例,其中00000000000000000000.index表示最開始的文件,起始偏移量(offset)為0.第二個文件00000000000000368769.index的消息量起始偏移量為368770 = 368769 + 1.同樣棺蛛,第三個文件00000000000000737337.index的起始偏移量為737338=737337 + 1怔蚌,其他后續(xù)文件依次類推,以起始偏移量命名并排序這些文件旁赊,只要根據(jù)offset二分查找文件列表桦踊,就可以快速定位到具體文件。
    當offset=368776時定位到00000000000000368769.index|log

  • 第二步通過segment file查找message
    通過第一步定位到segment file终畅,當offset=368776時钞钙,依次定位到00000000000000368769.index的元數(shù)據(jù)物理位置和00000000000000368769.log的物理偏移地址,然后再通過00000000000000368769.log順序查找直到offset=368776為止声离。

從上述圖3可知這樣做的優(yōu)點芒炼,segment index file采取稀疏索引存儲方式,它減少索引文件大小术徊,通過mmap可以直接內存操作本刽,稀疏索引為數(shù)據(jù)文件的每個對應message設置一個元數(shù)據(jù)指針,它比稠密索引節(jié)省了更多的存儲空間,但查找起來需要消耗更多的時間赠涮。

4. Kafka文件存儲機制–實際運行效果

實驗環(huán)境:

  • Kafka集群:由2臺虛擬機組成
  • cpu:4核
  • 物理內存:8GB
  • 網(wǎng)卡:千兆網(wǎng)卡
  • jvm heap: 4GB

從上述圖5可以看出子寓,Kafka運行時很少有大量讀磁盤的操作,主要是定期批量寫磁盤操作笋除,因此操作磁盤很高效斜友。這跟Kafka文件存儲中讀寫message的設計是息息相關的。Kafka中讀寫message有如下特點:

寫message:

  • 消息從java堆轉入page cache(即物理內存)垃它。
  • 由異步線程刷盤,消息從page cache刷入磁盤鲜屏。

讀message:

  • 消息直接從page cache轉入socket發(fā)送出去。
  • 當從page cache沒有找到相應數(shù)據(jù)時国拇,此時會產(chǎn)生磁盤IO,從磁盤Load消息到page cache,然后直接從socket發(fā)出去

5. 總結

Kafka高效文件存儲設計特點:

  • Kafka把topic中一個parition大文件分成多個小文件段洛史,通過多個小文件段,就容易定期清除或刪除已經(jīng)消費完文件酱吝,減少磁盤占用也殖。
  • 通過索引信息可以快速定位message和確定response的最大大小。
  • 通過index元數(shù)據(jù)全部映射到memory务热,可以避免segment file的IO磁盤操作忆嗜。
  • 通過索引文件稀疏存儲,可以大幅降低index文件元數(shù)據(jù)占用空間大小崎岂。

注:本文轉至:http://tech.meituan.com/kafka-fs-design-theory.html

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末捆毫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子该镣,更是在濱河造成了極大的恐慌冻璃,老刑警劉巖响谓,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件损合,死亡現(xiàn)場離奇詭異省艳,居然都是意外死亡,警方通過查閱死者的電腦和手機嫁审,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門跋炕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人律适,你說我怎么就攤上這事辐烂。” “怎么了捂贿?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵纠修,是天一觀的道長。 經(jīng)常有香客問我厂僧,道長扣草,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任颜屠,我火速辦了婚禮辰妙,結果婚禮上,老公的妹妹穿的比我還像新娘甫窟。我一直安慰自己密浑,他們只是感情好,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布粗井。 她就那樣靜靜地躺著尔破,像睡著了一般。 火紅的嫁衣襯著肌膚如雪浇衬。 梳的紋絲不亂的頭發(fā)上呆瞻,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機與錄音径玖,去河邊找鬼痴脾。 笑死,一個胖子當著我的面吹牛梳星,可吹牛的內容都是我干的赞赖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼冤灾,長吁一口氣:“原來是場噩夢啊……” “哼前域!你這毒婦竟也來了?” 一聲冷哼從身側響起韵吨,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤匿垄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體椿疗,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡漏峰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了届榄。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浅乔。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖铝条,靈堂內的尸體忽然破棺而出靖苇,到底是詐尸還是另有隱情,我是刑警寧澤班缰,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布贤壁,位于F島的核電站,受9級特大地震影響埠忘,放射性物質發(fā)生泄漏脾拆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一给梅、第九天 我趴在偏房一處隱蔽的房頂上張望假丧。 院中可真熱鬧,春花似錦动羽、人聲如沸包帚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渴邦。三九已至,卻和暖如春拘哨,著一層夾襖步出監(jiān)牢的瞬間谋梭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工倦青, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瓮床,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓产镐,卻偏偏與公主長得像隘庄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子癣亚,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內容

  • 姓名:周小蓬 16019110037 轉載自:http://blog.csdn.net/YChenFeng/art...
    aeytifiw閱讀 34,722評論 13 425
  • Kafka是什么 Kafka是最初由Linkedin公司開發(fā)丑掺,是一個分布式、分區(qū)的述雾、多副本的街州、多訂閱者兼丰,基于zoo...
    Andone1cc閱讀 282評論 0 1
  • Kafka簡介 Kafka是一種分布式的,基于發(fā)布/訂閱的消息系統(tǒng)唆缴。主要設計目標如下: 以時間復雜度為O(1)的方...
    Alukar閱讀 3,083評論 0 43
  • 本文轉載自http://dataunion.org/?p=9307 背景介紹Kafka簡介Kafka是一種分布式的...
    Bottle丶Fish閱讀 5,469評論 0 34
  • 我最佩服的鳍征,大概就是看淡一切,包容一切甚至藐視一切的人琐谤。我總認為他們就是神仙蟆技,畢竟他們連最起碼的憎恨玩敏、討厭斗忌、埋怨都...
    莊莊日記本閱讀 480評論 0 1