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