柚子快報(bào)邀請(qǐng)碼778899分享:筆記 kafka 由淺入深
柚子快報(bào)邀請(qǐng)碼778899分享:筆記 kafka 由淺入深
目錄
一、什么是kafka?
1.使用消息隊(duì)列的好處?
2.典型應(yīng)用:日志系統(tǒng)架構(gòu)模型
二、架構(gòu)
1.Kafka的一些重要相關(guān)概念
2.工作流程
3.副本原理
4.生產(chǎn)者
4.1.為什么分區(qū)可以水平擴(kuò)展?
4.2.分區(qū)策略
1.輪詢(xún)策略(Round-robin)
2.隨機(jī)策略(Randomness)
3.按消息鍵保序策略(Key-ordering)
4.默認(rèn)分區(qū)策略
5.消費(fèi)者
5.1 消費(fèi)方式
5.2 分區(qū)分配策略
5.2.1 Range(默認(rèn)策略)
5.2.2 RoundRobin
6.數(shù)據(jù)可靠性保證
6.1 副本數(shù)據(jù)同步策略
6.2 ACK應(yīng)答機(jī)制
參考
一、什么是kafka?
? ? ? ? kafka本質(zhì)上是一個(gè)消息隊(duì)列MQ(Message Queue),用做數(shù)據(jù)流轉(zhuǎn)。
1.使用消息隊(duì)列的好處?
????????1.1、解耦:允許獨(dú)立擴(kuò)展或修改隊(duì)列兩頭的處理過(guò)程;
????????1.2、可恢復(fù)性:即使一個(gè)處理消息的進(jìn)程掛掉,加入隊(duì)列中的消息仍然可以在系統(tǒng)恢復(fù)后被處理;
????????1.3、緩沖:解決生產(chǎn)消息和消費(fèi)消息速度不一致的問(wèn)題;????????
????????1.4、靈活、峰值處理能力:不會(huì)因?yàn)橥话l(fā)的超負(fù)荷請(qǐng)求而完全崩潰,消息隊(duì)列能使關(guān)鍵組件頂住突發(fā)的訪問(wèn)壓力;
????????1.5、異步通信:允許用戶將消息放入隊(duì)列,但不立即處理它。
2.典型應(yīng)用:日志系統(tǒng)架構(gòu)模型
v1.日志系統(tǒng)架構(gòu)模型| ProcessOn免費(fèi)在線作圖,在線流程圖,在線思維導(dǎo)圖
????????Logstash是一個(gè)開(kāi)源數(shù)據(jù)收集引擎,具有實(shí)時(shí)管道功能。Logstash可以動(dòng)態(tài)地將來(lái)自不同數(shù)據(jù)源的數(shù)據(jù)統(tǒng)一起來(lái),并將數(shù)據(jù)標(biāo)準(zhǔn)化到你所選擇的目的地。
????????Elasticsearch 是一個(gè)分布式、RESTful 風(fēng)格的搜索和數(shù)據(jù)分析引擎,能夠解決不斷涌現(xiàn)出的各種用例。作為 Elastic Stack 的核心,它集中存儲(chǔ)您的數(shù)據(jù),幫助您發(fā)現(xiàn)意料之中以及意料之外的情況。
二、架構(gòu)
注意:因?yàn)槠?,沒(méi)有畫(huà)zookeeper,broker都是由zookeeper管理。?
????????Kafka 存儲(chǔ)的消息來(lái)自任意多被稱(chēng)為 Producer 生產(chǎn)者的進(jìn)程。數(shù)據(jù)從而可以被發(fā)布到不同的 Topic 主題下的不同 Partition 分區(qū)。 ????????在一個(gè)分區(qū)內(nèi),這些消息被索引并連同時(shí)間戳存儲(chǔ)在一起。其它被稱(chēng)為 Consumer 消費(fèi)者的進(jìn)程可以從分區(qū)訂閱消息。 ????????Kafka 運(yùn)行在一個(gè)由一臺(tái)或多臺(tái)服務(wù)器組成的集群上,并且分區(qū)可以跨集群結(jié)點(diǎn)分布。
1.Kafka的一些重要相關(guān)概念
????????Producer:消息生產(chǎn)者,向 Kafka Broker 發(fā)消息的客戶端。
????????Consumer:消息消費(fèi)者,從 Kafka Broker 取消息的客戶端。
????????Consumer Group:消費(fèi)者組(CG),消費(fèi)者組內(nèi)每個(gè)消費(fèi)者負(fù)責(zé)消費(fèi)不同分區(qū)的數(shù)據(jù),提高消費(fèi)能力。一個(gè)分區(qū)只能由組內(nèi)一個(gè)消費(fèi)者消費(fèi),消費(fèi)者組之間互不影響。所有的消費(fèi)者都屬于某個(gè)消費(fèi)者組,即消費(fèi)者組是邏輯上的一個(gè)訂閱者。
????????Broker:一臺(tái) Kafka 機(jī)器就是一個(gè) Broker。一個(gè)集群(kafka cluster)由多個(gè) Broker 組成。一個(gè)Broker 可以容納多個(gè) Topic。
????????Topic:可以理解為一個(gè)隊(duì)列,Topic 將消息分類(lèi),生產(chǎn)者和消費(fèi)者面向的是同一個(gè) Topic。
????????Partition:為了實(shí)現(xiàn)擴(kuò)展性,提高并發(fā)能力,一個(gè)非常大的 Topic 可以分布到多個(gè) Broker (即服務(wù)器)上,一個(gè) Topic 可以分為多個(gè) Partition,同一個(gè)topic在不同的分區(qū)的數(shù)據(jù)是不重復(fù)的,每個(gè) Partition 是一個(gè)有序的隊(duì)列,其表現(xiàn)形式就是一個(gè)一個(gè)的文件夾。
????????Replication:每一個(gè)分區(qū)都有多個(gè)副本,副本的作用是做備胎。當(dāng)主分區(qū)(Leader)故障的時(shí)候會(huì)選擇一個(gè)備胎(Follower)上位,成為L(zhǎng)eader。在kafka中默認(rèn)副本的最大數(shù)量是10個(gè),且副本的數(shù)量不能大于Broker的數(shù)量,follower和leader絕對(duì)是在不同的機(jī)器,同一機(jī)器對(duì)同一個(gè)分區(qū)也只可能存放一個(gè)副本(包括自己)。
????????Message:消息,每一條發(fā)送的消息主體。
????????Leader:每個(gè)分區(qū)多個(gè)副本的“主”副本,生產(chǎn)者發(fā)送數(shù)據(jù)的對(duì)象,以及消費(fèi)者消費(fèi)數(shù)據(jù)的對(duì)象,都是 Leader。
????????Follower:每個(gè)分區(qū)多個(gè)副本的“從”副本,實(shí)時(shí)從 Leader 中同步數(shù)據(jù),保持和 Leader 數(shù)據(jù)的同步。Leader 發(fā)生故障時(shí),某個(gè) Follower 還會(huì)成為新的 Leader。
????????Offset:消費(fèi)者消費(fèi)的位置信息,監(jiān)控?cái)?shù)據(jù)消費(fèi)到什么位置,當(dāng)消費(fèi)者掛掉再重新恢復(fù)的時(shí)候,可
以從消費(fèi)位置繼續(xù)消費(fèi)。
????????ZooKeeper:Kafka 集群能夠正常工作,需要依賴(lài)于 ZooKeeper,ZooKeeper 幫助 Kafka 存儲(chǔ)和管理集群信息
2.工作流程
不同的partition的offset是獨(dú)立的。
????????Kafka 中消息是以 Topic 進(jìn)行分類(lèi)的,生產(chǎn)者生產(chǎn)消息,消費(fèi)者消費(fèi)消息,面向的都是同一個(gè) Topic。
????????Topic 是邏輯上的概念,而 Partition 是物理上的概念,每個(gè) Partition 對(duì)應(yīng)于一個(gè) log 文件,該 log 文件中存儲(chǔ)的就是 Producer 生產(chǎn)的數(shù)據(jù)。
????????Producer 生產(chǎn)的數(shù)據(jù)會(huì)不斷追加到該 log 文件末端,且每條數(shù)據(jù)都有自己的 Offset。
????????消費(fèi)者組中的每個(gè)消費(fèi)者,都會(huì)實(shí)時(shí)記錄自己消費(fèi)到了哪個(gè) Offset,以便出錯(cuò)恢復(fù)時(shí),從上次的位置繼續(xù)消費(fèi)。
日志默認(rèn)在:/tmp/kafka-logs
3.副本原理
????????副本機(jī)制(Replication),也可以稱(chēng)之為備份機(jī)制,通常是指分布式系統(tǒng)在多臺(tái)網(wǎng)絡(luò)互聯(lián)的機(jī)器上保存有相同的數(shù)據(jù)拷貝。副本機(jī)制的好處在于: ????????1.提供數(shù)據(jù)冗余。在一部分節(jié)點(diǎn)宕機(jī)的時(shí)候,系統(tǒng)仍能繼續(xù)工作(即提高可用性)
????????2.提供高伸縮性。支持?jǐn)U大機(jī)器數(shù)量,從而可以支撐更高的讀請(qǐng)求量,比如fastdfs、mongodb。kafka是否支持通過(guò)副本機(jī)制提高讀的請(qǐng)求量?-> 不支持這樣的機(jī)制
????????3.改善數(shù)據(jù)局部性。允許將數(shù)據(jù)放入與用戶地理位置相近的地方,從而降低系統(tǒng)延時(shí)。 kafka也不支持。
目前Kafka只實(shí)現(xiàn)了副本機(jī)制帶來(lái)的第 1 個(gè)好處,即是提供數(shù)據(jù)冗余實(shí)現(xiàn)高可用性和高持久性。
????????在kafka生產(chǎn)環(huán)境中,每臺(tái) Broker 都可能保存有各個(gè)主題下不同分區(qū)的不同副本,因此,單個(gè) Broker上存有成百上千個(gè)副本的現(xiàn)象是非常正常的。
????????下圖展示了一個(gè)有 3 臺(tái) Broker 的 Kafka 集群上的副本分布情況。從圖中可以看到,主題 1 分區(qū) 0 的 3個(gè)副本分散在 3 臺(tái) Broker 上,其他主題分區(qū)的副本也都散落在不同的 Broker 上,從而實(shí)現(xiàn)數(shù)據(jù)冗余。
基于領(lǐng)導(dǎo)者的副本機(jī)制:
????????1. 在 Kafka 中,副本分成兩類(lèi):領(lǐng)導(dǎo)者副本(Leader Replica)和追隨者副本(FollowerReplica)。每個(gè)分區(qū)在創(chuàng)建時(shí)都要選舉一個(gè)副本,稱(chēng)為領(lǐng)導(dǎo)者副本,其余的副本自動(dòng)稱(chēng)為追隨者副本。
????????2. Kafka 副本機(jī)制中的追隨者副本是不對(duì)外提供服務(wù)的,不同于Fastdfs、MongdoDB等。
????????3.當(dāng)領(lǐng)導(dǎo)者副本掛掉了,或領(lǐng)導(dǎo)者副本所在的 Broker 宕機(jī)時(shí),Kafka 依托于 ZooKeeper 提供的監(jiān)控功能能夠?qū)崟r(shí)感知到,并立即開(kāi)啟新一輪的領(lǐng)導(dǎo)者選舉,從追隨者副本中選一個(gè)作為新的領(lǐng)導(dǎo)者。老 Leader 副本重啟回來(lái)后,只能作為追隨者副本加入到集群中。
4.生產(chǎn)者
????????producer就是生產(chǎn)者,是數(shù)據(jù)的入口。Producer在寫(xiě)入數(shù)據(jù)的時(shí)候永遠(yuǎn)的找leader,不會(huì)直接將數(shù)據(jù)寫(xiě)入follower。
4.1.為什么分區(qū)可以水平擴(kuò)展?
?????????Kafka 的消息組織方式實(shí)際上是三級(jí)結(jié)構(gòu):主題 - 分區(qū) - 消息。主題下的每條消息只會(huì)保存在某一個(gè)分區(qū)中,而不會(huì)在多個(gè)分區(qū)中被保存多份。如下所示:
????????分區(qū)的作用主要提供負(fù)載均衡的能力,能夠?qū)崿F(xiàn)系統(tǒng)的高伸縮性(Scalability)。不同的分區(qū)能夠被放置到不同節(jié)點(diǎn)的機(jī)器上,而數(shù)據(jù)的讀寫(xiě)操作也都是針對(duì)分區(qū)這個(gè)粒度而進(jìn)行的,這樣每個(gè)節(jié)點(diǎn)的機(jī)器都能獨(dú)立地執(zhí)行各自分區(qū)的讀寫(xiě)請(qǐng)求處理。這樣,當(dāng)性能不足的時(shí)候可以通過(guò)添加新的節(jié)點(diǎn)機(jī)器來(lái)增加整體系統(tǒng)的吞吐量。
????????分區(qū)原則:我們需要將 Producer 發(fā)送的數(shù)據(jù)封裝成一個(gè) ProducerRecord 對(duì)象。該對(duì)象需要指定一些參數(shù):????????topic:string 類(lèi)型,NotNull。
????????partition:int 類(lèi)型,可選。
????????timestamp:long 類(lèi)型,可選。
????????key:string 類(lèi)型,可選。
????????value:string 類(lèi)型,可選。
????????headers:array 類(lèi)型,Nullable
4.2.分區(qū)策略
????????分區(qū)策略是決定生產(chǎn)者將消息發(fā)送到哪個(gè)分區(qū)的算法。
1.輪詢(xún)策略(Round-robin)
????????即順序分配。比如一個(gè)主題下有 3 個(gè)分區(qū),那么第一條消息被發(fā)送到分區(qū) 0,第二條被發(fā)送到分區(qū) 1,第三條被發(fā)送到分區(qū) 2,以此類(lèi)推。當(dāng)生產(chǎn)第 4 條消息時(shí)又會(huì)重新開(kāi)始,即將其分配到分區(qū) 0。
????????輪詢(xún)策略有非常優(yōu)秀的負(fù)載均衡表現(xiàn),它總是能保證消息最大限度地被平均分配到所有分區(qū)上,故默認(rèn)情況下它是最合理的分區(qū)策略,也是我們最常用的分區(qū)策略之一。
2.隨機(jī)策略(Randomness)
????????隨機(jī)就是隨意地將消息放置到任意一個(gè)分區(qū)上,如下面這張圖所示。
3.按消息鍵保序策略(Key-ordering)
????????Kafka 允許為每條消息定義消息鍵,簡(jiǎn)稱(chēng)為 Key。這個(gè) Key 的作用非常大,它可以是一個(gè)有著明確業(yè)務(wù)含義的字符串,比如客戶代碼、部門(mén)編號(hào)或是業(yè)務(wù) ID 等;也可以用來(lái)表征消息元數(shù)據(jù)。特別是在 Kafka不支持時(shí)間戳的年代,在一些場(chǎng)景中,工程師們都是直接將消息創(chuàng)建時(shí)間封裝進(jìn) Key 里面的。一旦消息被定義了 Key,那么你就可以保證同一個(gè) Key 的所有消息都進(jìn)入到相同的分區(qū)里面,由于每個(gè)分區(qū)下的消息處理都是有順序的,故這個(gè)策略被稱(chēng)為按消息鍵保序策略。
4.默認(rèn)分區(qū)策略
????????1. 指明 Partition 的情況下,直接將給定的 Value 作為 Partition 的值。
????????2. 沒(méi)有指明 Partition 但有 Key 的情況下,將 Key 的 Hash 值與分區(qū)數(shù)取余得到 Partition 值。
????????3. 既沒(méi)有 Partition 有沒(méi)有 Key 的情況下,第一次調(diào)用時(shí)隨機(jī)生成一個(gè)整數(shù)(后面每次調(diào)用都在這個(gè)整數(shù)上自增),將這個(gè)值與可用的分區(qū)數(shù)取余,得到 Partition 值,也就是常說(shuō)的 Round-Robin輪詢(xún)算法。
消息是按照三種策略進(jìn)入分區(qū):
????????1、如果指定的partition,那么直接進(jìn)入該partition;
????????2、如果沒(méi)有指定partition,但是指定了key,使用key的hash值選擇partition;
????????3、如果既沒(méi)有指定partition,也沒(méi)有指定key,使用輪詢(xún)的方式進(jìn)入partition。
5.消費(fèi)者
????????傳統(tǒng)的消息隊(duì)列模型的缺陷在于消息一旦被消費(fèi),就會(huì)從隊(duì)列中被刪除,而且只能被下游的一個(gè)Consumer 消費(fèi)。嚴(yán)格來(lái)說(shuō),這一點(diǎn)不算是缺陷,只能算是它的一個(gè)特性。但很顯然,這種模型的伸縮性(scalability)很差,因?yàn)橄掠蔚亩鄠€(gè) Consumer 都要“搶”這個(gè)共享消息隊(duì)列的消息。發(fā)布 / 訂閱模型倒是允許消息被多個(gè) Consumer 消費(fèi),但它的問(wèn)題也是伸縮性不高,因?yàn)槊總€(gè)訂閱者都必須要訂閱主題的所有分區(qū)。這種全量訂閱的方式既不靈活,也會(huì)影響消息的真實(shí)投遞效果。
????????當(dāng) Consumer Group 訂閱了多個(gè)主題后,組內(nèi)的每個(gè)實(shí)例不要求一定要訂閱主題的所有分區(qū),它只會(huì)消費(fèi)部分分區(qū)中的消息。Consumer Group 之間彼此獨(dú)立,互不影響,它們能夠訂閱相同的一組主題而互不干涉。再加上 Broker 端的消息留存機(jī)制,Kafka 的 Consumer Group 完美地規(guī)避了上面提到的伸縮性差的問(wèn)題??梢赃@么說(shuō),Kafka 僅僅使用 Consumer Group 這一種機(jī)制,卻同時(shí)實(shí)現(xiàn)了傳統(tǒng)消息引擎系統(tǒng)的兩大模型:如果所有實(shí)例都屬于同一個(gè) Group,那么它實(shí)現(xiàn)的就是消息隊(duì)列模型;如果所有實(shí)例分別屬于不同的 Group,那么它實(shí)現(xiàn)的就是發(fā)布 / 訂閱模型。
5.1 消費(fèi)方式
????????Consumer 采用 Pull(拉?。┠J綇?Broker 中讀取數(shù)據(jù)。
????????Pull 模式則可以根據(jù) Consumer 的消費(fèi)能力以適當(dāng)?shù)乃俾氏M(fèi)消息。Pull 模式不足之處是,如果 Kafka沒(méi)有數(shù)據(jù),消費(fèi)者可能會(huì)陷入循環(huán)中,一直返回空數(shù)據(jù)。
????????因?yàn)橄M(fèi)者從 Broker 主動(dòng)拉取數(shù)據(jù),需要維護(hù)一個(gè)長(zhǎng)輪詢(xún),針對(duì)這一點(diǎn), Kafka 的消費(fèi)者在消費(fèi)數(shù)據(jù)時(shí)會(huì)傳入一個(gè)時(shí)長(zhǎng)參數(shù) timeout。如果當(dāng)前沒(méi)有數(shù)據(jù)可供消費(fèi),Consumer 會(huì)等待一段時(shí)間之后再返回,這段時(shí)長(zhǎng)即為 timeout。
5.2 分區(qū)分配策略
????????一個(gè) Consumer Group 中有多個(gè) Consumer,一個(gè) Topic 有多個(gè) Partition,所以必然會(huì)涉及到Partition 的分配問(wèn)題,即確定哪個(gè) Partition 由哪個(gè) Consumer 來(lái)消費(fèi)。
????????Kafka 有三種分配策略:
????????????????1. RoundRobin
????????????????2. Range,默認(rèn)為Range
????????????????3. Sticky
????????當(dāng)消費(fèi)者組內(nèi)消費(fèi)者發(fā)生變化時(shí),會(huì)觸發(fā)分區(qū)分配策略(方法重新分配)。這里主要講Range、RoundRobin。
5.2.1 Range(默認(rèn)策略)
????????Range 方式是按照主題來(lái)分的,不會(huì)產(chǎn)生輪詢(xún)方式的消費(fèi)混亂問(wèn)題。
????????假設(shè)我們有10個(gè)分區(qū),3個(gè)消費(fèi)者,排完序的分區(qū)將會(huì)是0,1,2,3,4,5,6,7,8,9;消費(fèi)者線程排完序?qū)?huì)是C1-0,C2-0,C3-0。然后將partitions的個(gè)數(shù)除于消費(fèi)者線程的總數(shù)來(lái)決定每個(gè)消費(fèi)者線程消費(fèi)幾個(gè)分區(qū)。如果除不盡,那么前面幾個(gè)消費(fèi)者線程將會(huì)多消費(fèi)一個(gè)分區(qū)。
????????在我們的例子里面,我們有10個(gè)分區(qū),3個(gè)消費(fèi)者線程,10/3 = 3,而且除不盡,那么消費(fèi)者線程 C1-0將會(huì)多消費(fèi)一個(gè)分區(qū),結(jié)果看起來(lái)是這樣的:
????????????????C1-0將消費(fèi) 0, 1, 2, 3 分區(qū)
????????????????C2-0將消費(fèi) 4,5,6分區(qū)
????????????????C3-0將消費(fèi) 7,8,9分區(qū)
????????假如我們有2個(gè)主題(T1和T2),分別有10個(gè)分區(qū),那么最后分區(qū)分配的結(jié)果看起來(lái)是這樣的:
????????????????C1-0 將消費(fèi) T1主題的 0, 1, 2, 3 分區(qū)以及T2主題的 0, 1, 2, 3分區(qū)
????????????????C2-0將消費(fèi) T1主題的 4,5,6分區(qū)以及T2主題的 4,5,6分區(qū)
????????????????C3-0將消費(fèi) T1主題的 7,8,9分區(qū)以及T2主題的 7,8,9分區(qū)
????????可以看出,C1-0 消費(fèi)者線程比其他消費(fèi)者線程多消費(fèi)了2個(gè)分區(qū),這就是Range strategy的一個(gè)很明顯的弊端,如下圖所示,Consumer0、Consumer1 同時(shí)訂閱了主題 A 和 B,可能造成消息分配不對(duì)等問(wèn)題,當(dāng)消費(fèi)者組內(nèi)訂閱的主題越多,分區(qū)分配可能越不均衡。
5.2.2 RoundRobin
????????RoundRobin 輪詢(xún)方式將分區(qū)所有作為一個(gè)整體進(jìn)行 Hash 排序,消費(fèi)者組內(nèi)分配分區(qū)個(gè)數(shù)最大差別為1,是按照組來(lái)分的,可以解決多個(gè)消費(fèi)者消費(fèi)數(shù)據(jù)不均衡的問(wèn)題。
????????輪詢(xún)分區(qū)策略是把所有partition和所有consumer線程都列出來(lái),然后按照hashcode進(jìn)行排序。最后通過(guò)輪詢(xún)算法分配partition給消費(fèi)線程。如果所有consumer實(shí)例的訂閱是相同的,那么partition會(huì)均勻分布。
?????????假如按照 hashCode排序完的topic-partitions組依次為T(mén)1-5, T1-3, T1-0, T1-8, T1- 2, T1-1, T1-4, T1-7, T1-6, T1-9,我們的消費(fèi)者線程排序?yàn)镃1-0,C1-1,C2-0,C2-1,最后分區(qū)分配的結(jié)果為:
????????C1-0將消費(fèi) T1-5,T1-2,T1-6分區(qū);
????????C1-1將消費(fèi) T1-3,T1-1,T1-9分區(qū);
????????C2-0將消費(fèi) T1-0,T1-4分區(qū);
????????C2-1將消費(fèi) T1-8,T1-7分區(qū);
?????????但是,當(dāng)消費(fèi)者組內(nèi)訂閱不同主題時(shí),可能造成消費(fèi)混亂,如下圖所示,Consumer0 訂閱主題 A, Consumer1 訂閱主題 B。
?????????將 A、B 主題的分區(qū)排序后分配給消費(fèi)者組,TopicB 分區(qū)中的數(shù)據(jù)可能分配到 Consumer0 中。使用輪詢(xún)分區(qū)策略必須滿足兩個(gè)條件
????????1. 每個(gè)主題的消費(fèi)者實(shí)例具有相同數(shù)量的流
????????2. 每個(gè)消費(fèi)者訂閱的主題必須是相同的
6.數(shù)據(jù)可靠性保證
????????為保證 Producer 發(fā)送的數(shù)據(jù),能可靠地發(fā)送到指定的 Topic,Topic 的每個(gè) Partition 收到 Producer發(fā)送的數(shù)據(jù)后,都需要向 Producer 發(fā)送 ACK(ACKnowledge 確認(rèn)收到)。如果 Producer 收到 ACK,就會(huì)進(jìn)行下一輪的發(fā)送,否則重新發(fā)送數(shù)據(jù)。
6.1 副本數(shù)據(jù)同步策略
????????何時(shí)發(fā)送 ACK?確保有 Follower 與 Leader 同步完成,Leader 再發(fā)送 ACK,這樣才能保證 Leader 掛掉之后,能在 Follower 中選舉出新的 Leader 而不丟數(shù)據(jù)。
????????多少個(gè) Follower 同步完成后發(fā)送 ACK?全部 Follower 同步完成,再發(fā)送 ACK。
????????所有 Follower 完成同步,Producer 才能繼續(xù)發(fā)送數(shù)據(jù),設(shè)想有一個(gè) Follower 因?yàn)槟撤N原因出現(xiàn)故障,那 Leader 就要一直等到它完成同步。這個(gè)問(wèn)題怎么解決?
????????1. Leader 維護(hù)了一個(gè)動(dòng)態(tài)的?in-sync replica set(ISR):和 Leader 保持同步的 Follower 集合。
????????2. 當(dāng) ISR 集合中的 Follower 完成數(shù)據(jù)的同步之后,Leader 就會(huì)給 Follower 發(fā)送 ACK。
????????3. 如果 Follower 長(zhǎng)時(shí)間未向 Leader 同步數(shù)據(jù),則該 Follower 將被踢出 ISR 集合,該時(shí)間閾值由replica.lag.time.max.ms 參數(shù)設(shè)定。Leader 發(fā)生故障后,就會(huì)從 ISR 中選舉出新的 Leader。
6.2 ACK應(yīng)答機(jī)制
????????對(duì)于某些不太重要的數(shù)據(jù),對(duì)數(shù)據(jù)的可靠性要求不是很高,能夠容忍數(shù)據(jù)的少量丟失,所以沒(méi)必要等 ISR 中的 Follower 全部接受成功。
????????所以 Kafka 為用戶提供了三種可靠性級(jí)別,用戶根據(jù)可靠性和延遲的要求進(jìn)行權(quán)衡,選擇以下的配置。
?ACK 參數(shù)配置:
????????0:Producer 不等待 Broker 的 ACK,這提供了最低延遲,Broker 一收到數(shù)據(jù)還沒(méi)有寫(xiě)入磁盤(pán)就已經(jīng)返回,當(dāng) Broker 故障時(shí)有可能丟失數(shù)據(jù)。
????????1:Producer 等待 Broker 的 ACK,Partition 的 Leader 落盤(pán)成功后返回 ACK,如果在 Follower 同步成功之前 Leader 故障,那么將會(huì)丟失數(shù)據(jù)。
????????-1(all):Producer 等待 Broker 的 ACK,Partition 的 Leader 和 Follower 全部落盤(pán)成功后才返回 ACK。但是在 Broker 發(fā)送 ACK 時(shí),Leader 發(fā)生故障,則會(huì)造成數(shù)據(jù)重復(fù)。
參考
2 萬(wàn)字長(zhǎng)文深入詳解 Kafka,從源碼到架構(gòu)全部講透關(guān)于Kafka,研究透這一篇就基本夠用了。https://mp.weixin.qq.com/s/dOiNT0a_dRytwatzdrJNCg
柚子快報(bào)邀請(qǐng)碼778899分享:筆記 kafka 由淺入深
文章來(lái)源
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。