我們一起聊聊Kafka核心概念,你學(xué)會(huì)了嗎?
一、Producer
生產(chǎn)者創(chuàng)建消息。
該角色將消息發(fā)布到Kafka的topic中。broker接收到生產(chǎn)者發(fā)送的消息后,broker將該消息追加到 當(dāng)前用于追加數(shù)據(jù)的 segment 文件中。
一般情況下,一個(gè)消息會(huì)被發(fā)布到一個(gè)特定的主題上。
1. 默認(rèn)情況下通過輪詢把消息均衡地分布到主題的所有分區(qū)上。
2. 在某些情況下,生產(chǎn)者會(huì)把消息直接寫到指定的分區(qū)。這通常是通過消息鍵和分區(qū)器來(lái)實(shí)現(xiàn) 的,分區(qū)器為鍵生成一個(gè)散列值,并將其映射到指定的分區(qū)上。這樣可以保證包含同一個(gè)鍵的 消息會(huì)被寫到同一個(gè)分區(qū)上。
3. 生產(chǎn)者也可以使用自定義的分區(qū)器,根據(jù)不同的業(yè)務(wù)規(guī)則將消息映射到分區(qū)。
二、Consumer
消費(fèi)者讀取消息。
1. 消費(fèi)者訂閱一個(gè)或多個(gè)主題,并按照消息生成的順序讀取它們。
2. 消費(fèi)者通過檢查消息的偏移量來(lái)區(qū)分已經(jīng)讀取過的消息。偏移量是另一種元數(shù)據(jù),它是一個(gè)不 斷遞增的整數(shù)值,在創(chuàng)建消息時(shí),Kafka 會(huì)把它添加到消息里。在給定的分區(qū)里,每個(gè)消息的 偏移量都是唯一的。消費(fèi)者把每個(gè)分區(qū)最后讀取的消息偏移量保存在Zookeeper 或Kafka 上,如果消費(fèi)者關(guān)閉或重啟,它的讀取狀態(tài)不會(huì)丟失。
3. 消費(fèi)者是消費(fèi)組的一部分。群組保證每個(gè)分區(qū)只能被一個(gè)消費(fèi)者使用。
4. 如果一個(gè)消費(fèi)者失效,消費(fèi)組里的其他消費(fèi)者可以接管失效消費(fèi)者的工作,再平衡,分區(qū)重新 分配。
三、Broker
一個(gè)獨(dú)立的Kafka 服務(wù)器被稱為broker。
broker 為消費(fèi)者提供服務(wù),對(duì)讀取分區(qū)的請(qǐng)求作出響應(yīng),返回已經(jīng)提交到磁盤上的消息。
1. 如果某topic有N個(gè)partition,集群有N個(gè)broker,那么每個(gè)broker存儲(chǔ)該topic的一個(gè) partition。
2. 如果某topic有N個(gè)partition,集群有(N+M)個(gè)broker,那么其中有N個(gè)broker存儲(chǔ)該topic的一 個(gè)partition,剩下的M個(gè)broker不存儲(chǔ)該topic的partition數(shù)據(jù)。
3. 如果某topic有N個(gè)partition,集群中broker數(shù)目少于N個(gè),那么一個(gè)broker存儲(chǔ)該topic的一 個(gè)或多個(gè)partition。在實(shí)際生產(chǎn)環(huán)境中,盡量避免這種情況的發(fā)生,這種情況容易導(dǎo)致Kafka 集群數(shù)據(jù)不均衡。
broker 是集群的組成部分。每個(gè)集群都有一個(gè)broker 同時(shí)充當(dāng)了集群控制器的角色(自動(dòng)從集群 的活躍成員中選舉出來(lái))。
控制器負(fù)責(zé)管理工作,包括將分區(qū)分配給broker 和監(jiān)控broker。
在集群中,一個(gè)分區(qū)從屬于一個(gè)broker,該broker 被稱為分區(qū)的首領(lǐng)。
四、Topic
每條發(fā)布到Kafka集群的消息都有一個(gè)類別,這個(gè)類別被稱為Topic。 物理上不同Topic的消息分開存儲(chǔ)。 主題就好比數(shù)據(jù)庫(kù)的表,尤其是分庫(kù)分表之后的邏輯表。
五、Partition
1. 主題可以被分為若干個(gè)分區(qū),一個(gè)分區(qū)就是一個(gè)提交日志。
2. 消息以追加的方式寫入分區(qū),然后以先入先出的順序讀取。
3. 無(wú)法在整個(gè)主題范圍內(nèi)保證消息的順序,但可以保證消息在單個(gè)分區(qū)內(nèi)的順序。
4. Kafka 通過分區(qū)來(lái)實(shí)現(xiàn)數(shù)據(jù)冗余和伸縮性。
5. 在需要嚴(yán)格保證消息的消費(fèi)順序的場(chǎng)景下,需要將partition數(shù)目設(shè)為1。
六、Replicas
Kafka 使用主題來(lái)組織數(shù)據(jù),每個(gè)主題被分為若干個(gè)分區(qū),每個(gè)分區(qū)有多個(gè)副本。那些副本被保存 在broker 上,每個(gè)broker 可以保存成百上千個(gè)屬于不同主題和分區(qū)的副本。 副本有以下兩種類型:
首領(lǐng)副本
每個(gè)分區(qū)都有一個(gè)首領(lǐng)副本。為了保證一致性,所有生產(chǎn)者請(qǐng)求和消費(fèi)者請(qǐng)求都會(huì)經(jīng)過這個(gè)副本。
跟隨者副本
首領(lǐng)以外的副本都是跟隨者副本。跟隨者副本不處理來(lái)自客戶端的請(qǐng)求,它們唯一的任務(wù)就是從首領(lǐng)那里復(fù)制消息,保持與首領(lǐng)一致的狀態(tài)。如果首領(lǐng)發(fā)生崩潰,其中的一個(gè)跟隨者會(huì)被提升為新首領(lǐng)。
七、Offset
生產(chǎn)者Offset
消息寫入的時(shí)候,每一個(gè)分區(qū)都有一個(gè)offset,這個(gè)offset就是生產(chǎn)者的offset,同時(shí)也是這個(gè)分區(qū) 的最新最大的offset。 有些時(shí)候沒有指定某一個(gè)分區(qū)的offset,這個(gè)工作kafka幫我們完成。
消費(fèi)者Offset
這是某一個(gè)分區(qū)的offset情況,生產(chǎn)者寫入的offset是最新最大的值是12,而當(dāng)Consumer A進(jìn)行消 費(fèi)時(shí),從0開始消費(fèi),一直消費(fèi)到了9,消費(fèi)者的offset就記錄在9,Consumer B就紀(jì)錄在了11。等下一 次他們?cè)賮?lái)消費(fèi)時(shí),他們可以選擇接著上一次的位置消費(fèi),當(dāng)然也可以選擇從頭消費(fèi),或者跳到最近的 記錄并從“現(xiàn)在”開始消費(fèi)。
八、 副本
Kafka通過副本保證高可用。副本分為首領(lǐng)副本(Leader)和跟隨者副本(Follower)。 跟隨者副本包括同步副本和不同步副本,在發(fā)生首領(lǐng)副本切換的時(shí)候,只有同步副本可以切換為首 領(lǐng)副本。
AR
分區(qū)中的所有副本統(tǒng)稱為AR(Assigned Repllicas)。 AR=ISR+OSR
ISR
所有與leader副本保持一定程度同步的副本(包括Leader)組成ISR(In-Sync Replicas),ISR集合 是AR集合中的一個(gè)子集。消息會(huì)先發(fā)送到leader副本,然后follower副本才能從leader副本中拉取消息 進(jìn)行同步,同步期間內(nèi)follower副本相對(duì)于leader副本而言會(huì)有一定程度的滯后。前面所說(shuō)的“一定程度” 是指可以忍受的滯后范圍,這個(gè)范圍可以通過參數(shù)進(jìn)行配置。
OSR
與leader副本同步滯后過多的副本(不包括leader)副本,組成OSR(Out-Sync Relipcas)。在正常 情況下,所有的follower副本都應(yīng)該與leader副本保持一定程度的同步,即AR=ISR,OSR集合為空。
HW
HW是High Watermak的縮寫, 俗稱高水位,它表示了一個(gè)特定消息的偏移量(offset),消費(fèi)之 只能拉取到這個(gè)offset之前的消息。
LEO
LEO是Log End Offset的縮寫,它表示了當(dāng)前日志文件中下一條待寫入消息的offset。