2023-05-08 09:32:55 來源 : 一燈架構(gòu)
Apache Kafka 是一種高吞吐、分布式的流處理平臺,由 LinkedIn 開發(fā)并于 2011 年開源。它具有高伸縮性、高可靠性和低延遲等特點(diǎn),因此在大型數(shù)據(jù)處理場景中備受青睞。Kafka 可以處理多種類型的數(shù)據(jù),如事件、日志、指標(biāo)等,廣泛應(yīng)用于實(shí)時數(shù)據(jù)流處理、日志收集、監(jiān)控和分析等領(lǐng)域。
【資料圖】
通常用作消息隊(duì)列和流處理,作為消息隊(duì)列的時候,競品有RabbitMQ、ActiveMQ、RocketMQ、Apache Pulsar等。
2. Kafka架構(gòu)下面介紹一下Kafka架構(gòu)中最重要的三個參與者:
Producer(生產(chǎn)者):生產(chǎn)者負(fù)責(zé)將消息發(fā)送到 Kafka 集群。Consumer(消費(fèi)者):消費(fèi)者負(fù)責(zé)從 Kafka 集群中拉取并消費(fèi)消息。Broker(代理節(jié)點(diǎn)):Broker 是 Kafka 集群中的一個服務(wù)代理節(jié)點(diǎn),可以看作是一臺服務(wù)器。Kafka 集群通常由多個 Broker 組成,以實(shí)現(xiàn)負(fù)載均衡和容錯。3. 分區(qū)與副本Kafka為了對消息進(jìn)行分類,引入了Topic(主題)的概念。生產(chǎn)者在發(fā)送消息的時候,需要指定發(fā)送到某個Topic,然后消息者訂閱這個Topic并進(jìn)行消費(fèi)消息。
Kafka為了提升性能,又在Topic的基礎(chǔ)上,引入了Partition(分區(qū))的概念。Topic是邏輯概念,而Partition是物理分組。一個Topic可以包含多個Partition,生產(chǎn)者在發(fā)送消息的時候,需要指定發(fā)送到某個Topic的某個Partition,然后消息者訂閱這個Topic并消費(fèi)這個Partition中的消息。
Kafka為了提高系統(tǒng)的吞吐量和可擴(kuò)展性,把一個Topic的不同Partition放到多個Broker節(jié)點(diǎn)上,充分利用機(jī)器資源,也便于擴(kuò)展Partition。
Kafka為了保證數(shù)據(jù)的安全性和服務(wù)的高可用,又在Partition的基礎(chǔ)上,引入Replica(副本)的概念。一個Partition包含多個Replica,Replica之間是一主多從的關(guān)系,有兩種類型Leader Replica(領(lǐng)導(dǎo)者副本)和Follower Replica(跟隨者副本),Replica分布在不同的Broker節(jié)點(diǎn)上。
Leader Replica負(fù)責(zé)讀寫請求,F(xiàn)ollower Replica只負(fù)責(zé)同步Leader Replica數(shù)據(jù),不對外提供服務(wù)。當(dāng)Leader Replica發(fā)生故障,就從Follower Replica選舉出一個新的Leader Replica繼續(xù)對外提供服務(wù),實(shí)現(xiàn)了故障自動轉(zhuǎn)移。
下圖展示的是,同一個Topic的不同Partition在Broker節(jié)點(diǎn)的分布情況:
Kafka為了提升Replica的同步效率和數(shù)據(jù)寫入效率,又對Replica進(jìn)行分類。針對一個Partition的所有Replica集合統(tǒng)稱為AR(Assigned Replicas,已分配的副本),包含Leader Replica和Follower Replica。與Leader Replica保持同步的Replica集合稱為ISR(In-Sync Replicas,同步副本),與Leader Replica保持失去同步的Replica集合稱為OSR(Out-of-Sync Replicas,失去同步的副本),AR = ISR + OSR。
Leader Replica將消息寫入磁盤前,需要等ISR中的所有副本同步完成。如果ISR中某個Follower Replica同步數(shù)據(jù)落后Leader Replica過多,會被轉(zhuǎn)移到OSR中。如果OSR中的某個Follower Replica同步數(shù)據(jù)追上了Leader Replica,會被轉(zhuǎn)移到ISR中。當(dāng)Leader Replica發(fā)生故障的時候,只會從ISR中選舉出新的Leader Replica。
4. 偏移量Kafka為了記錄副本的同步狀態(tài),以及控制消費(fèi)者消費(fèi)消息的范圍,于是引入了LEO(Log End Offset,日志結(jié)束偏移量)和HW(High Watermark,高水位)。
LEO表示分區(qū)中的下一個被寫入消息的偏移量,也是分區(qū)中的最大偏移量。LEO用于記錄Leader Replica和Follower Replica之間的數(shù)據(jù)同步進(jìn)度,每個副本中各有一份。
HW表示所有副本(Leader和Follower)都已成功復(fù)制的最小偏移量,是所有副本共享的數(shù)據(jù)值。換句話說,HW之前的消息都被視為已提交,消費(fèi)者可以消費(fèi)這些消息。用于確保消息的一致性和只讀一次。
下面演示一下LEO和HW的更新流程:
初始狀態(tài),三個副本中各有0和1兩條消息,LEO都是2,位置2是空的,表示是即將被寫入消息的位置。HW也都是2,表示Leader Replica中的所有消息已經(jīng)全部同步到Follower Replica中,消費(fèi)者可以消費(fèi)0和1兩條消息。生產(chǎn)者往Leader Replica中發(fā)送兩條消息,此時Leader Replica的LEO的值增加2,變成4。由于還沒有開始往Follower Replica同步消息,所以HW值和Follower Replica中LEO值都沒有變。由于消費(fèi)者只能消費(fèi)HW之前的消息,也就是0和1兩條消息。Leader Replica開始向Follower Replica同步消息,同步速率不同,F(xiàn)ollower1的兩條消息2和3已經(jīng)同步完成,而Follower2只同步了一條消息2。此時,Leader和Follower1的LEO都是4,而Follower2的LEO是3,HW表示已成功同步的最小偏移量,值是3,表示此時消費(fèi)者只能讀到0、1、2,三條消息。所有消息都同步完成,三個副本的LEO都是4,HW也是4,消費(fèi)者可以讀到0、1、2、3,四條消息。5. 消費(fèi)者組Kafka為了提高消息的處理效率,引入了消費(fèi)者組的概念。一個消費(fèi)者組(Consumer Group)包含多個消費(fèi)者,一個消費(fèi)者組可以同時訂閱多個Topic,一個Topic也可以同時被多個消費(fèi)者組訂閱。
為了保證同一個Partition的消息被順序處理,針對一個消費(fèi)者組,一個Partition的消息只會交給這個消息者組的一個消費(fèi)者處理。
6. 總結(jié)本文簡單介紹了Kafka架構(gòu),以及架構(gòu)中涉及到底的一些名詞概念,包括Producer(生產(chǎn)者)、Consumer(消費(fèi)者)、Broker(代理節(jié)點(diǎn))、Topic(主題)、Partition(分區(qū))、Leader Replica(領(lǐng)導(dǎo)者副本)、Follower Replica(跟隨者副本)、LEO(Log End Offset,日志結(jié)束偏移量)、HW(High Watermark,高水位)、Consumer Group(消費(fèi)者組)等。