Kafka架構探險(二)——一文帶你了解Kafka

上篇博文已經講解了如何安裝Kafka的集群環(huán)境凭豪,今天我們就來一本帶大家了解下Kafka,了解kafka的特點以及基本概念

kafka的特點

Kafka設計的初衷是為了解決互聯(lián)網公司超大量級數據的實時傳輸娄蔼,為了實現這個目標,需要考慮以下四個方面的問題

  • 吞吐量/延時
  • 消息持久化
  • 負載均衡和故障轉移
  • 伸縮性
  1. 吞吐量是Kafka每秒能夠處理的消息數,那么很顯然撒遣,我們都希望系統(tǒng)的吞吐量越大越好喳逛,與此同時瞧捌,還有個客戶端發(fā)送指令,kafka服務端接受指令然后反饋給客戶端的時間润文,這個時間就是延時姐呐,那么對于一個系統(tǒng)而言,延時時間間隔越短越好典蝌。而kafka是一個高吞吐量和低延時的系統(tǒng)曙砂,那么他是如何實現的呢?
  • 大量使用操作系統(tǒng)頁緩存骏掀,內存的操作速度快且命中率高

由于大量使用也緩存鸠澈,故讀取消息時大部分消息很有可能依然保存在頁緩存中,因此可以直接命中緩存截驮,不用“穿透”到底層的物理磁盤上獲取消息笑陈,從而極大的提升了讀取的吞吐量

  • kafka不直接參與物理I/O操作,而是交由最擅長此事的操作系統(tǒng)來完成
  • 采用追加寫入方式葵袭,摒棄了緩慢的磁盤隨機I/O操作

kafka在設計時采用了追加寫入消息的方式涵妥,即只能在日志文件末尾追加寫入新的消息,且不允許修改已經寫入的消息坡锡,因此他屬于典型的磁盤順序訪問型操作蓬网,這種類型的操作訪問速度堪比內存的讀寫速度,性能是非常高的

  • 使用sendfile為代表的零拷貝技術加強網絡間的數據傳輸效率

kafka在讀取消息時鹉勒,會首先從OS的頁緩存中讀取拳缠,如果命中便把消息經頁緩存直接發(fā)送到網絡的Socket上,這個過程就是零拷貝技術

  1. 消息引擎都必須要具有持久化的機制贸弥,持久化的機制有如下的好處:
  • 讓消息的生產和消費解耦

消息生產者只需要將消息發(fā)送給kafka即可窟坐,不必關系消息是被誰消費的,何時消費的

  • 靈活的消息處理

消息保存在kafka中绵疲,方便實現消息重演這樣的需求哲鸳,可以很方便的處理消息

  • 減少內存的使用

將消息持久化到kafka中,給內存釋放出更多的空間盔憨,方便kafka使用頁面緩存技術來提升系統(tǒng)的性能

  1. kafka是一個分布式流處理平臺徙菠,所以kafka具有分布式系統(tǒng)的兩個重要的特性——負載均衡和故障轉移
  • 負載均衡就是讓系統(tǒng)的負載根據一定的規(guī)則均衡的分配到所有參與工作的機器上似芝,從而最大限度的提升整體系統(tǒng)的運行效率酪耳,kafka的負載均衡實際上是通過partition以及l(fā)eader來實現的姐军,后面再詳細介紹
  • 當分布式系統(tǒng)的一個節(jié)點出現了問題器净,無法發(fā)送心跳或者會話,則master服務器認為備份服務器已經無法工作 萍摊,將會根據一系列的算法來計算新的節(jié)點挤茄,實現了系統(tǒng)的高可用性
  1. 伸縮性,所謂的伸縮性表示向分布方式中額外的增加計算資源時吞吐量提升的能力冰木,通俗點來講穷劈,就是如何通過增加節(jié)點來擴展kafka集群環(huán)境的系統(tǒng),這點kafka是通過將服務器的狀態(tài)的相關的參數交給zookeeper來管理

kafka的基本概念

  1. 消息

消息是每一個消息引擎的重中之重踊沸,好的消息的結構設計能極大的優(yōu)化系統(tǒng)的性能歇终,這里kafka處理的非常好,我們也有必要理解下kafka的消息的組成以及為什么

首先消息是由:消息頭部逼龟、Key和Value組成评凝,其中消息頭部還包括:CRC、版本號腺律、屬性奕短、時間戳和鍵長度。

image

這里主要說明4個字段的含義:

  • 消息鍵:對消息做partition時使用疾渣,即決定消息被保存在某個topic下的哪個partition
  • 消息體:保存實際的消息數據
  • 時間戳:消息發(fā)送的時間戳篡诽,主要用于流式處理以及其他依賴時間的處理語義,默認是當前時間
  • 屬性:kafka使用一個字節(jié)來保存消息的壓縮屬性榴捡,當前只支持4中壓縮屬性:0——無壓縮 1——GZIP壓縮 2——Snappy壓縮 3——LZ4壓縮

Kafka使用二進制字節(jié)數組來保存消息杈女,這個和RabbitMQ是一樣的,為什么要這樣設計呢吊圾? 試想一下达椰,如果我們使用Java的類來實現,如果存儲成String字符串格式 项乒,那么對于Java內存模型啰劲,對象保存的開銷是很大的,隨著堆里面的數據量越來越大檀何,GC的也就越頻繁蝇裤,那么系統(tǒng)的性能也就越差,其他Java的操作系統(tǒng)通常默認是開啟頁緩存機制的频鉴,也就是說堆上保存的對象可能在頁緩存中還保留一份栓辜,這也造成了極大的資源浪費

因此,kafka在消息設計時垛孔,直接使用緊湊二進制字節(jié)數據藕甩,這樣我們就能有更多的內存使用

  1. topic和partition

準確來說,topic是一個邏輯上的概念周荐,一般我們用來作為業(yè)務上的一個區(qū)分的尺度狭莱,代表一類消息僵娃,比如說A發(fā)送消息到topicA中,B發(fā)送消息到topicB中腋妙,一個topic可能被多個消費者來消費默怨,為了提供系統(tǒng)的吞吐量,kafka提出了partition的概念辉阶,我們可以認為一個topic是由多個partition組成的

image

kafka中的partition是不可修改的有序消息隊列先壕,每個partition有自己專屬的partition號瘩扼,通常是從0開始的谆甜,用戶對partition唯一能做的就是在消息隊列的尾部追加寫入消息,每個消息隊列中都有一個序號集绰,這個序號就是接下里要說的 offset

  1. offset

partition中的每個消息隊列都是固定的规辱,并且從0開始遞增

綜合之前所說的topicpartition以及offset我們可以確定一條消息

  1. replica

我們知道partition是有序的消息隊列,那么一定不是保存在一個地方的栽燕,否則一旦kafka掛了罕袋,其上保存的消息也就丟失了,分布式要實現高可用性碍岔,這里kafka采用了冗余機制——備份多個日志浴讯,這些日志在kafka中就被稱為replica副本,他存在的唯一目的就是防止數據丟失

replica分為: leader replicafollower replica,follower replica唯一的用途就是leader replica所在的broker宕機了蔼啦,不能對外提供服務了榆纽,則kafka就會從剩余的replica中選舉新的leader來提供服務

  1. leader和follower

上面我們說過什么是leaderfollower,在kafka中,leader對外提供服務捏肢,follower只能被動的追隨leader的狀態(tài)奈籽,保持與leader同步,follower唯一存在的目的就是當leader宕機了鸵赫,被選舉稱為新的leader來繼續(xù)提供服務

kafka保證統(tǒng)一個partition的多個replica一定不會分配在同一臺broker上衣屏,畢竟如果同一個broker上有同一個partition的多個replica,那么將無法實現備份冗余的效果

  1. ISR

ISR(in-sync replica)在kafka中是一個重要的概念, 翻譯過來就是與 leader replica保持同步的replica集合辩棒, kafka為partition動態(tài)維護一個replica集合狼忱,該集合中的所有的replica保存的消息日志都與leader replica保持同步狀態(tài),只有這個集合中的replica才能被選為leader,也只有該集合中的replica都同時接收到同一條消息一睁,kafka才會將該消息置為“已提交”狀態(tài)钻弄,即認為該條消息發(fā)送成功

這里需要注意兩點:

  • ISR中至少需要一個“活著”的replica
  • “已提交”消息
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市卖局,隨后出現的幾起案子斧蜕,更是在濱河造成了極大的恐慌,老刑警劉巖砚偶,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件批销,死亡現場離奇詭異洒闸,居然都是意外死亡,警方通過查閱死者的電腦和手機均芽,發(fā)現死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門丘逸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人掀宋,你說我怎么就攤上這事深纲。” “怎么了劲妙?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵湃鹊,是天一觀的道長。 經常有香客問我镣奋,道長币呵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任侨颈,我火速辦了婚禮余赢,結果婚禮上,老公的妹妹穿的比我還像新娘哈垢。我一直安慰自己妻柒,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布耘分。 她就那樣靜靜地躺著举塔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪陶贼。 梳的紋絲不亂的頭發(fā)上啤贩,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音拜秧,去河邊找鬼痹屹。 笑死,一個胖子當著我的面吹牛枉氮,可吹牛的內容都是我干的志衍。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼聊替,長吁一口氣:“原來是場噩夢啊……” “哼楼肪!你這毒婦竟也來了?” 一聲冷哼從身側響起惹悄,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤春叫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體暂殖,經...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡价匠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了呛每。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片踩窖。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖晨横,靈堂內的尸體忽然破棺而出洋腮,到底是詐尸還是另有隱情,我是刑警寧澤手形,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布啥供,位于F島的核電站,受9級特大地震影響叁幢,放射性物質發(fā)生泄漏滤灯。R本人自食惡果不足惜坪稽,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一曼玩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧窒百,春花似錦黍判、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至渤滞,卻和暖如春贬墩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背妄呕。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工陶舞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绪励。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓肿孵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親疏魏。 傳聞我的和親對象是個殘疾皇子停做,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內容

  • Kafka系列一- Kafka背景及架構介紹 Kafka簡介 Kafka是一種分布式的,基于發(fā)布/訂閱的消息系統(tǒng)大莫。...
    raincoffee閱讀 2,195評論 0 22
  • Kafka設計解析(六)- Kafka高性能架構之道 原創(chuàng)文章蛉腌,轉載請務必將下面這段話置于文章開頭處。本文轉發(fā)自技...
    小小少年Boy閱讀 2,716評論 0 13
  • Kafka 是一個java開發(fā)的mq中間件,依賴于zookeper烙丛,有高可用贯吓,高吞吐量等特點。 優(yōu)勢 可靠性:pa...
    何笙閱讀 14,894評論 1 9
  • 大致可以通過上述情況進行排除 1.kafka服務器問題 查看日志是否有報錯蜀变,網絡訪問問題等悄谐。 2. kafka p...
    生活的探路者閱讀 7,575評論 0 10
  • 一、為什么需要消息系統(tǒng) 1.解耦:允許你獨立的擴展或修改兩邊的處理過程库北,只要確保它們遵守同樣的接口約束爬舰。 2.冗余...
    為你變乖_09e6閱讀 859評論 0 8