東莞企業(yè)網(wǎng)站推廣哪里好網(wǎng)絡(luò)游戲推廣員的真實(shí)經(jīng)歷
1、Kafka是什么?
Kafka是由Scala語(yǔ)言開(kāi)發(fā)的一個(gè)多分區(qū)、多副本,基于Zookeeper集群協(xié)調(diào)的系統(tǒng)。
那這個(gè)所謂的系統(tǒng)又是什么系統(tǒng)呢?
回答這個(gè)問(wèn)題要從發(fā)展的角度來(lái)看:起初Kafka的定位是分布式消息系統(tǒng)。但是目前它的定位是一個(gè)分布式流式處理平臺(tái),用于實(shí)時(shí)數(shù)據(jù)集成和流數(shù)據(jù)處理。
2、Kafka都可以扮演哪些“角色”?
基于Kafka的發(fā)展和特性,它可以在我們的實(shí)際工作當(dāng)中扮演以下幾個(gè)“角色”:
- 消息系統(tǒng)
- 存儲(chǔ)系統(tǒng):將消息持久化到磁盤(pán)上。
- 流式處理平臺(tái):可以集成多種流式處理框架(例如:SparkStream、Flink等),不但可以作為可靠的數(shù)據(jù)源,同時(shí)提供了一套完整的流處理類(lèi)庫(kù),例如:窗口、連接、交換和聚合等操作。
3、Kafka的體系架構(gòu)?
Kafka體系架構(gòu)包括:生產(chǎn)者(Producer)、消費(fèi)者(Consumer)、服務(wù)代理節(jié)點(diǎn)(Broker)、一個(gè)Zookeeper集群。
-
生產(chǎn)者(Producer)
作為消息的發(fā)送方。負(fù)責(zé)創(chuàng)建消息,并將消息發(fā)送給Broker。
-
消費(fèi)者(Consumer)
作為消息的接收方。負(fù)責(zé)連接Kafka并接收消息,進(jìn)而進(jìn)行相應(yīng)的邏輯處理。
-
代理服務(wù)節(jié)點(diǎn)(Broker)
可以看做一個(gè)Kafka實(shí)例,多個(gè)Broker組成一個(gè)Kafka集群。
-
Zookeeper集群
Zookeeper用來(lái)負(fù)責(zé)Kafka集群的元數(shù)據(jù)管理和控制器的選舉等操作。
讓我們進(jìn)一步來(lái)描述Producer、Consumer、Broker之間的關(guān)系以及作用:
Producer創(chuàng)建消息并將消息發(fā)送給Borker,Broker將接收到的消息存儲(chǔ)到本地的磁盤(pán)上,Consumer負(fù)責(zé)在Broker上訂閱并消費(fèi)消息。
4、主題、分區(qū)、副本
Kafka中有三個(gè)重要的概念,主題、分區(qū)和副本。它們之間的關(guān)系如下圖:
通過(guò)上圖我們可以得知:
1個(gè)主題對(duì)應(yīng)多個(gè)分區(qū);一個(gè)分區(qū)對(duì)應(yīng)多個(gè)副本;副本又分為一個(gè)leader副本和多個(gè)follower副本。
4.1、主題
- 主題是一個(gè)邏輯概念,我們可以把它當(dāng)做消息的分類(lèi)。
- Producer發(fā)送消息的時(shí)候會(huì)指明該消息所屬的主題(即可以理解為Producer是將消息發(fā)送給了主題),一個(gè)消息只屬于一個(gè)主題。
4.2、分區(qū)
- 一個(gè)主題下會(huì)細(xì)分為多個(gè)分區(qū),每個(gè)分區(qū)對(duì)應(yīng)一個(gè)主題。
- 消息在分區(qū)中的以offset(偏移量)作為唯一標(biāo)識(shí)。
- Kafka通過(guò)offset來(lái)保證消息在分區(qū)中的順序。
- offset不能跨區(qū),所以我們說(shuō)分區(qū)是有序的,而主題是無(wú)序。
- 分區(qū)可以分布在不同的broker上。
4.3、副本
-
一個(gè)分區(qū)會(huì)有多個(gè)副本,副本中的消息都是一致的(同一時(shí)刻可能會(huì)有不一致的情況)。
-
副本之間的關(guān)系是“一主多從”,即一個(gè)leader副本和多個(gè)follower副本。
- leader副本:負(fù)責(zé)消息的讀寫(xiě)。
- follower副本:負(fù)責(zé)同步leader副本。
-
副本被分布到不同的broker上,leader副本掛掉了,會(huì)從follower副本中重新選舉出一個(gè)新的leader副本。
-
我們將分區(qū)中所有副本統(tǒng)稱(chēng)為AR(Assigned Replicas)。其中一些與leader副本保持一定程度同步的副本(包括leader副本本身)統(tǒng)稱(chēng)為ISR(In-Sync Replicas)。而另外一些相較于leader副本滯后很多的副本統(tǒng)稱(chēng)為OSR(Out-of-Sync Replicas)。
由此可見(jiàn),AR = ISR + OSR。正常情況下,所有follower副本都要與leader版本保持一定程度的同步,即AR = ISR,而OSR集合為空。
-
默認(rèn)情況下,leader副本只能從ISR中的副本中選舉出來(lái)。但是我們可以通過(guò)參數(shù)配置使得OSR中的副本也有機(jī)會(huì)被選舉為leader副本。
-
leader副本還負(fù)責(zé)所有follower副本滯后狀態(tài)的維護(hù)和跟蹤,即當(dāng)follower副本滯后較多的時(shí)候會(huì)將它從ISR中移動(dòng)到OSR中,也會(huì)將OSR中追上leader副本的follower副本移動(dòng)到ISR中。
-
特定偏移量HW和LEO。
- 針對(duì)分區(qū)有一個(gè)概念為高水位(High Watermark,縮寫(xiě)HW),它是一個(gè)特定的消息偏移量(offset),消費(fèi)者只能接收到offset之前的消息
- ISR中的每個(gè)follower副本都維護(hù)一個(gè)自己的LEO(Log End Offset),它也是一個(gè)特定的消息偏移量(offset),即待寫(xiě)入消息的偏移量。
- HW與LEO之間的關(guān)系,如下圖:
通過(guò)上圖我們可以得知:分區(qū)的HW是通過(guò)ISR中最小的LEO得出的。
4.4、如何避免Consumer宕機(jī)重啟后的消息丟失?
Consumer是通過(guò)拉(Pull)模式從服務(wù)端拉取消息的,同時(shí)會(huì)在Consumer端記錄下消費(fèi)的具體位置,當(dāng)Consumer宕機(jī)重啟后會(huì)根據(jù)之前記錄的消費(fèi)位置重新拉取需要的信息進(jìn)行消費(fèi)。