Kafka學習筆記

1.Kafka簡介

Kafka是一個分布式的基于發(fā)布訂閱模式的消息隊列,主要針對大規(guī)模數(shù)據(jù)處理場景。

1.1 消息隊列(Message Queue)的好處:

a.解耦
生產(chǎn)者和消費者可以獨立發(fā)布服務枉证,不會導致線上異常和數(shù)據(jù)丟失占调;
b.可恢復性
MQ通常具有重試機制返帕,而且分組消費甲棍,數(shù)據(jù)存儲到磁盤(支持副本),使數(shù)據(jù)不會丟失拔妥;
c.緩沖
避免生產(chǎn)者和消費者處理速度不一致帶來的問題忿危,如數(shù)據(jù)丟失,調用異常和超時等没龙;
d.削峰
使用MQ可以一定程度上解決突發(fā)高流量的情況铺厨,將短時間內的流量,擴大到更長時間的維度兜畸,避免系統(tǒng)超負荷運行努释,甚至系統(tǒng)奔潰碘梢;
e. 異步通信
消費者可以不立即處理MQ中的消息咬摇,讓MQ作為一種臨時的數(shù)據(jù)存儲方式(Kafka默認保存數(shù)據(jù)7天),等在需要的時候在進行消費處理煞躬。
f. 數(shù)據(jù)分發(fā)
當業(yè)務M需要調用多方(如A,B,C)時肛鹏,普通的調用需要逐個調用逸邦,當增加D或者減少C時,當前業(yè)務需要修改代碼以及重新上線等在扰;但是使用MQ之后缕减,當前業(yè)務M只需要將消息發(fā)送到MQ中,不用關心到底是誰消費了消息芒珠,消費者的增加和刪除不影響業(yè)務M桥狡。

1.2 消息隊列(Message Queue)的缺點:

a.系統(tǒng)可用性減低
加入MQ之后,服務就會依賴MQ皱卓,MQ宕機裹芝,那么服務也就不可用了。
b.系統(tǒng)復雜性增加:
同步改成異步之后娜汁,MQ消息的丟失嫂易,重復,順序性等都需要考慮掐禁。
c.數(shù)據(jù)一致性問題:
在不同的分組消費MQ時怜械,有的分組消費成功,有的消費失敗傅事,會導致各系統(tǒng)之間的數(shù)據(jù)不一致缕允。

2.Kafka的架構:

2.1 消息隊列的兩種模式:

Producer A是發(fā)布訂閱模式(一對多,數(shù)據(jù)消費后不會刪除)蹭越;
Producer B是點對點模式(一對一灼芭,一個消息只會有一個消費者消費,數(shù)據(jù)消費后會被刪除)般又;

kafka.jpg

2.2 架構說明:

1)Producer:

生產(chǎn)者向broker發(fā)送消息

2)Consumer:

消費Broker的消息彼绷,

3)Consumer Group:

一個group由多個consumer組成,消費者組內每個消費者負責消費不同的分區(qū)數(shù)據(jù)茴迁,一個分區(qū)只能由一個組內消費者消費寄悯,消費者組之間互不影響;

4)Broker:

一臺Kafka機器就是一個Broker堕义,一個Kafka集群由多個Broker組成猜旬,一個Broker可以容納多個topic;

5)Topic:

主題隊列,Producer和Consumer都是面向topic隊列的倦卖;

6)Partition:

一個topic可以分成多個Partition洒擦,Partition分不到不同的Broker上,每個Partition是有序的隊列怕膛;

7)Replica:

副本保證集群中一個節(jié)點發(fā)生故障時熟嫩,該節(jié)點的partition不會丟失,保證Kafka仍然能夠繼續(xù)工作褐捻,一個leader partition對應多個follower掸茅;

8)leader:

主分區(qū)椅邓,生產(chǎn)者發(fā)送數(shù)據(jù)和消費者消費數(shù)據(jù)都是這對leader partition的;

9)follower:

從分區(qū)昧狮,從分區(qū)實時從leader主分區(qū)同步數(shù)據(jù)景馁,當leader發(fā)生故障時,某一個從分區(qū)成為leader逗鸣。

2.3 Kafka數(shù)據(jù)的保存:

Kafka中合住,topic是邏輯概念,partition是物理概念撒璧,每個partition對應一個log文件聊疲,log保存producer的產(chǎn)生的數(shù)據(jù),producer的數(shù)據(jù)會被不斷的添加到該log文件的末尾沪悲,且每條數(shù)據(jù)都有自己的offset,消費者組中的每個消費者殿如,實時記錄自己消費到那個offset了贡珊,以便出現(xiàn)錯誤時涉馁,恢復到上次消費的位置繼續(xù)消費烤送。

image.png

log文件采取了分片和索引機制妻往,防止log文件過大導致讀取性能問題讯泣;
每個partition由多個segment阅悍,partition對應的文件名是“topic名字+分區(qū)號”文件夾好渠,一個segment對應兩個文件,.index文件和.log文件(以當前文件segment的第一條消息的offset命名)节视,.index保存大量的索引信息拳锚,.log文件保存數(shù)據(jù),.index的索引value對應.log中message的物理偏移量寻行。
如offset=150霍掺,根據(jù)offset獲得對應的segment中.index文件(通過文件名字),然后獲得對應.log中message中的物理地址,最后通過物理地址獲取message抗楔。

2.4 Kafka的高效讀寫:

a.順序寫磁盤

Producer寫的時候,一直是追加到文件的末尾拦坠,這樣避免大量的磁盤尋址時間连躏。如普通的機械磁盤,順序寫能夠達到600M/s贞滨,而隨機寫只有100K/s入热。

b.零拷貝
image.png

零拷貝避免了數(shù)據(jù)讀入到應用程序空間的過程,直接由操作系統(tǒng)的kernel完成讀寫晓铆,極大地提高的效率勺良。

c.分布式并發(fā)

kafka采取分布式方式,每個topic數(shù)據(jù)可以有多個partition骄噪,每個partition在不同的broker上尚困,一個partition由一個group中的消費者消費,很大程度上提高了并行度链蕊。

3.Kafka的Producer:

3.1 Producer消息的分區(qū)選擇方式:

1)直接指定partition事甜;
2)沒有指明partition時,通過key計算hash值滔韵,然后通過partition總個數(shù)取模逻谦,得到對應的partition值;
3)沒有key時陪蜻,第一次調用時邦马,生成一個隨機整數(shù)R,然后通過partition總個數(shù)取模宴卖,得到對應的partition值滋将。以后再次調用時根據(jù)R自增。

3.2 Producer消息的可靠性保證:

Producer消息采用acks應答機制症昏,其中l(wèi)eader partition會維護一個ISR(in sync replica set耕渴,即和leader partition保持同步的follower partition集合),當ISR中的follower完成數(shù)據(jù)同步之后齿兔,follower向leader發(fā)送ack橱脸,如果leader 長時間(replica.lag.time.max.ms參數(shù)設定)未收到follower的ack應答,那么該follower會被leader踢出ISR分苇;如果leader發(fā)生故障添诉,那么會從ISR中選舉新的leader。

配置:
Kafka提供三種acks應答機制級別医寿,對數(shù)據(jù)可靠性進行保證:

1)acks=0:

producer不等待broker的ack栏赴,直接返回成功,這樣延遲最低靖秩,但是當broker還沒有寫入到磁盤時须眷,broker故障竖瘾,會導致數(shù)據(jù)丟失;

2)acks=1:

producer等待broker的ack花颗,leader partition落盤成功之后即返回ack捕传,如果follower還沒有同步完成,此時leader故障扩劝,會導致數(shù)據(jù)丟失庸论;

3)acks=-1/all:

producer等待broker的ack,leader partition和follower partition都落盤成功之后即返回ack棒呛;如果follower完成同步聂示,broker發(fā)送ack之前,broker故障簇秒,會導致數(shù)據(jù)重復鱼喉。

3.3 Exactly Once:

針對acks=-1會出現(xiàn)重復數(shù)據(jù)的問題,Kafka 0.11版本引入了冪等性趋观,即不論Producer向kafka集群發(fā)布了多少次重復數(shù)據(jù)蒲凶,kafka集群只會持久化一條數(shù)據(jù)。

Exactly Once原理:

Producer在初始化的時候回分配一個PID拆内,發(fā)往partition的消息會附帶一個Sequence Number旋圆,Broker會對<PID,Partition麸恍,SequenceNumber>做緩存灵巧,保證只會持久化一條,原理更像關系型數(shù)據(jù)的主鍵約束抹沪。

問題:

PID重啟會發(fā)生變化刻肄,不同的partition有不同的主鍵,所以冪等性無法保證跨分區(qū)會話的Exactly Once融欧。

3.4 partition中的高水位:

image.png

follower故障恢復:

當follower故障后敏弃,會被踢出ISR中,當follower恢復之后噪馏,讀取自己的舊的高水位HW麦到,將舊高水位HW之后的數(shù)據(jù)截取掉,從舊HW從leader同步數(shù)據(jù)欠肾,當follower將LEO同步到操作新HW的時候瓶颠,即該故障恢復的follower的LEO追上leader之后,該follower可以重新加入到ISR中刺桃。

leader故障恢復:

當leader partition故障之后粹淋,會從ISR中選出一個新的leader,這時候其余的follower要將各自的高水位HW之后的數(shù)據(jù)截取掉,然后從新的leader同步數(shù)據(jù)桃移。

4.Kafka的Consumer:

Consumer采取pull(拉)的方式從broker讀取數(shù)據(jù)屋匕,比push(推)更適合不同性能的consumer機器,避免consumer機器的性能故障問題借杰。

針對pull的時候过吻,沒有數(shù)據(jù)的時候,會陷入循環(huán)第步。這時候可以采用長輪詢的方式疮装,即通過設置超時時間缘琅,consumer會等待一段時間之后才返回粘都。同RocketMQ.

Consumer的分區(qū)分配策略:

即決定哪個partition由哪個consumer消費。
1.Range(默認):
...
1.RoundRobin:
...

Consumer的offset的保存:

Kafka 0.9版本之前刷袍,consumer默認將offset保存到Zookeeper中翩隧,Kafka 0.9版本開始,默認將offset保存在Kafka的內置的topic中呻纹,該topic中為__consumer_offset堆生。

Zookeeper的作用:

Kafka集群中有一個broker中會被選舉為controller,負責broker的上下線雷酪,topic的分區(qū)副本分配和leader的選舉過程淑仆。這些管理工作需要Zookeeper的輔助。

備注:Kafka 2.8已經(jīng)放棄使用Zookeeper哥力。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末蔗怠,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子吩跋,更是在濱河造成了極大的恐慌寞射,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锌钮,死亡現(xiàn)場離奇詭異桥温,居然都是意外死亡,警方通過查閱死者的電腦和手機梁丘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門侵浸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人氛谜,你說我怎么就攤上這事通惫。” “怎么了混蔼?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵履腋,是天一觀的道長。 經(jīng)常有香客問我,道長遵湖,這世上最難降的妖魔是什么悔政? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮延旧,結果婚禮上谋国,老公的妹妹穿的比我還像新娘。我一直安慰自己迁沫,他們只是感情好芦瘾,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著集畅,像睡著了一般近弟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上挺智,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天祷愉,我揣著相機與錄音,去河邊找鬼赦颇。 笑死二鳄,一個胖子當著我的面吹牛,可吹牛的內容都是我干的媒怯。 我是一名探鬼主播订讼,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼扇苞!你這毒婦竟也來了欺殿?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤杨拐,失蹤者是張志新(化名)和其女友劉穎祈餐,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哄陶,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡帆阳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了屋吨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜒谤。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖至扰,靈堂內的尸體忽然破棺而出鳍徽,到底是詐尸還是另有隱情,我是刑警寧澤敢课,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布阶祭,位于F島的核電站绷杜,受9級特大地震影響,放射性物質發(fā)生泄漏濒募。R本人自食惡果不足惜鞭盟,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瑰剃。 院中可真熱鬧齿诉,春花似錦、人聲如沸晌姚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挥唠。三九已至抵恋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間猛遍,已是汗流浹背馋记。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工号坡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留懊烤,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓宽堆,卻偏偏與公主長得像腌紧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子畜隶,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內容

  • 一壁肋、前言,所謂消息隊列 一個消息系統(tǒng)負責將數(shù)據(jù)從一個應用傳遞到另外一個應用籽慢,應用只需關注于數(shù)據(jù)浸遗,無需關注數(shù)據(jù)在兩個...
    Megahorn閱讀 891評論 0 0
  • 我們在學習一個東西的時候跛锌,往往只有真正了解它背后的含義,才能一步一步的掌握它届惋,直到運籌帷幄髓帽。對于Kafka來說,我...
    三分青年閱讀 925評論 0 4
  • 一必盖、為什么需要消息系統(tǒng) 1.解耦: 允許你獨立的擴展或修改兩邊的處理過程拌牲,只要確保它們遵守同樣的接口約束。 2.冗...
    java成功之路閱讀 1,464評論 0 3
  • 一歌粥、Kafka簡介 Kafka (科技術語)们拙。Kafka是一種高吞吐量的分布式發(fā)布訂閱消息系統(tǒng),它可以處理消費者規(guī)...
    邊學邊記閱讀 1,716評論 0 14
  • 消息中間件一般用于各個模塊阁吝、系統(tǒng)之間的異步通信砚婆,降低各個模塊之間的耦合性。 Kafka作為一個分布式的流平臺突勇,這到...
    奮斗的小鳥GO閱讀 345評論 0 3