Kafka 三高架構(gòu)設(shè)計(jì)剖析
Kafka 核心問(wèn)題
- 簡(jiǎn)單講下 Kafka 的架構(gòu)?
- Kafka 是推模式還是拉模式,推拉的區(qū)別是什么?
- Kafka 如何廣播消息?
- Kafka 的消息是否是有序的?
- Kafka 是否支持讀寫(xiě)分離?
- Kafka 如何保證數(shù)據(jù)高可用?
- Kafka 中 zookeeper 的作用?
- 是否支持事務(wù)?
- 分區(qū)數(shù)是否可以減少?
Kafka 架構(gòu)中的一般概念:
架構(gòu)
- Producer:生產(chǎn)者,也就是發(fā)送消息的一方。生產(chǎn)者負(fù)責(zé)創(chuàng)建消息,然后將其發(fā)送到 Kafka。
- Consumer:消費(fèi)者,也就是接受消息的一方。消費(fèi)者連接到 Kafka 上并接收消息,進(jìn)而進(jìn)行相應(yīng)的業(yè)務(wù)邏輯處理。
- Consumer Group:一個(gè)消費(fèi)者組可以包含一個(gè)或多個(gè)消費(fèi)者。使用多分區(qū) + 多消費(fèi)者方式可以極大提高數(shù)據(jù)下游的處理速度,同一消費(fèi)組中的消費(fèi)者不會(huì)重復(fù)消費(fèi)消息,同樣的,不同消費(fèi)組中的消費(fèi)者消息消息時(shí)互不影響。Kafka 就是通過(guò)消費(fèi)組的方式來(lái)實(shí)現(xiàn)消息 P2P 模式和廣播模式。
- Broker:服務(wù)代理節(jié)點(diǎn)。Broker 是 Kafka 的服務(wù)節(jié)點(diǎn),即 Kafka 的服務(wù)器。
- Topic:Kafka 中的消息以 Topic 為單位進(jìn)行劃分,生產(chǎn)者將消息發(fā)送到特定的 Topic,而消費(fèi)者負(fù)責(zé)訂閱 Topic 的消息并進(jìn)行消費(fèi)。
- Partition:Topic 是一個(gè)邏輯的概念,它可以細(xì)分為多個(gè)分區(qū),每個(gè)分區(qū)只屬于單個(gè)主題。同一個(gè)主題下不同分區(qū)包含的消息是不同的,分區(qū)在存儲(chǔ)層面可以看作一個(gè)可追加的日志(Log)文件,消息在被追加到分區(qū)日志文件的時(shí)候都會(huì)分配一個(gè)特定的偏移量(offset)。
- Offset:offset 是消息在分區(qū)中的唯一標(biāo)識(shí),Kafka 通過(guò)它來(lái)保證消息在分區(qū)內(nèi)的順序性,不過(guò) offset 并不跨越分區(qū),也就是說(shuō),Kafka 保證的是分區(qū)有序性而不是主題有序性。
- Replication:副本,是 Kafka 保證數(shù)據(jù)高可用的方式,Kafka 同一 Partition 的數(shù)據(jù)可以在多 Broker 上存在多個(gè)副本,通常只有主副本對(duì)外提供讀寫(xiě)服務(wù),當(dāng)主副本所在 broker 崩潰或發(fā)生網(wǎng)絡(luò)一場(chǎng),Kafka 會(huì)在 Controller 的管理下會(huì)重新選擇新的 Leader 副本對(duì)外提供讀寫(xiě)服務(wù)。
- Record:實(shí)際寫(xiě)入 Kafka 中并可以被讀取的消息記錄。每個(gè) record 包含了 key、value 和 timestamp。
Kafka Topic Partitions Layout
主題
Kafka 將 Topic 進(jìn)行分區(qū),分區(qū)可以并發(fā)讀寫(xiě)。
Kafka Consumer Offset
consumer offset
Zookeeper
zookeeper
- Broker 注冊(cè):Broker 是分布式部署并且之間相互獨(dú)立,Zookeeper 用來(lái)管理注冊(cè)到集群的所有 Broker 節(jié)點(diǎn)。
- Topic 注冊(cè):在 Kafka 中,同一個(gè) Topic 的消息會(huì)被分成多個(gè)分區(qū)并將其分布在多個(gè) Broker 上,這些分區(qū)信息及與 Broker 的對(duì)應(yīng)關(guān)系也都是由 Zookeeper 在維護(hù)。
- 生產(chǎn)者負(fù)載均衡:由于同一個(gè) Topic 消息會(huì)被分區(qū)并將其分布在多個(gè) Broker 上,因此,生產(chǎn)者需要將消息合理地發(fā)送到這些分布式的 Broker 上。
- 消費(fèi)者負(fù)載均衡:與生產(chǎn)者類(lèi)似,Kafka 中的消費(fèi)者同樣需要進(jìn)行負(fù)載均衡來(lái)實(shí)現(xiàn)多個(gè)消費(fèi)者合理地從對(duì)應(yīng)的 Broker 服務(wù)器上接收消息,每個(gè)消費(fèi)者分組包含若干消費(fèi)者,每條消息都只會(huì)發(fā)送給分組中的一個(gè)消費(fèi)者,不同的消費(fèi)者分組消費(fèi)自己特定的 Topic 下面的消息,互不干擾。
答案
簡(jiǎn)單講下 Kafka 的架構(gòu)?
Producer、Consumer、Consumer Group、Topic、Partition。
Kafka 是推模式還是拉模式,推拉的區(qū)別是什么?
Kafka Producer 向 Broker 發(fā)送消息使用 Push 模式,Consumer 消費(fèi)采用的 Pull 模式。拉取模式,讓 consumer 自己管理 offset,可以提供讀取性能。
Kafka 如何廣播消息?
Consumer group。
Kafka 的消息是否是有序的?
Topic 級(jí)別無(wú)序,Partition 有序。
Kafka 是否支持讀寫(xiě)分離?
不支持,只有 Leader 對(duì)外提供讀寫(xiě)服務(wù)。
Kafka 如何保證數(shù)據(jù)高可用?
副本,ack,HW。
Kafka 中 zookeeper 的作用?
集群管理,元數(shù)據(jù)管理。
是否支持事務(wù)?
0.11 后支持事務(wù),可以實(shí)現(xiàn)”exactly once“。
分區(qū)數(shù)是否可以減少?
不可以,會(huì)丟失數(shù)據(jù)。