溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Kafka的高可靠性是怎么實(shí)現(xiàn)的

發(fā)布時(shí)間:2021-11-22 10:04:21 來(lái)源:億速云 閱讀:125 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要介紹“Kafka的高可靠性是怎么實(shí)現(xiàn)的”,在日常操作中,相信很多人在Kafka的高可靠性是怎么實(shí)現(xiàn)的問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Kafka的高可靠性是怎么實(shí)現(xiàn)的”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

Topic分區(qū)副本

在 Kafka 0.8.0 之前,Kafka 是沒有副本的概念的,那時(shí)候人們只會(huì)用 Kafka 存儲(chǔ)一些不重要的數(shù)據(jù),因?yàn)闆]有副本,數(shù)據(jù)很可能會(huì)丟失。但是隨著業(yè)務(wù)的發(fā)展,支持副本的功能越來(lái)越強(qiáng)烈,所以為了保證數(shù)據(jù)的可靠性,Kafka 從 0.8.0 版本開始引入了分區(qū)副本(詳情請(qǐng)參見 KAFKA-50)。也就是說(shuō)每個(gè)分區(qū)可以人為的配置幾個(gè)副本(比如創(chuàng)建主題的時(shí)候指定 replication-factor,也可以在 Broker 級(jí)別進(jìn)行配置 default.replication.factor),一般會(huì)設(shè)置為3。

Kafka 可以保證單個(gè)分區(qū)里的事件是有序的,分區(qū)可以在線(可用),也可以離線(不可用)。在眾多的分區(qū)副本里面有一個(gè)副本是 Leader,其余的副本是 follower,所有的讀寫操作都是經(jīng)過 Leader 進(jìn)行的,同時(shí) follower 會(huì)定期地去 leader 上的復(fù)制數(shù)據(jù)。當(dāng) Leader 掛了的時(shí)候,其中一個(gè) follower 會(huì)重新成為新的 Leader。通過分區(qū)副本,引入了數(shù)據(jù)冗余,同時(shí)也提供了 Kafka 的數(shù)據(jù)可靠性。

Kafka 的分區(qū)多副本架構(gòu)是 Kafka 可靠性保證的核心,把消息寫入多個(gè)副本可以使 Kafka 在發(fā)生崩潰時(shí)仍能保證消息的持久性。

Producer 往 Broker 發(fā)送消息

如果我們要往 Kafka 對(duì)應(yīng)的主題發(fā)送消息,我們需要通過 Producer 完成。前面我們講過 Kafka 主題對(duì)應(yīng)了多個(gè)分區(qū),每個(gè)分區(qū)下面又對(duì)應(yīng)了多個(gè)副本;為了讓用戶設(shè)置數(shù)據(jù)可靠性, Kafka 在 Producer 里面提供了消息確認(rèn)機(jī)制。也就是說(shuō)我們可以通過配置來(lái)決定消息發(fā)送到對(duì)應(yīng)分區(qū)的幾個(gè)副本才算消息發(fā)送成功。可以在定義 Producer 時(shí)通過 acks 參數(shù)指定(在 0.8.2.X 版本之前是通過 request.required.acks 參數(shù)設(shè)置的)。

這個(gè)參數(shù)支持以下三種值:

acks = 0:意味著如果生產(chǎn)者能夠通過網(wǎng)絡(luò)把消息發(fā)送出去,那么就認(rèn)為消息已成功寫入Kafka。在這種情況下還是有可能發(fā)生錯(cuò)誤,比如發(fā)送的對(duì)象無(wú)能被序列化或者網(wǎng)卡發(fā)生故障,但如果是分區(qū)離線或整個(gè)集群長(zhǎng)時(shí)間不可用,那就不會(huì)收到任何錯(cuò)誤。在 acks=0 模式下的運(yùn)行速度是非??斓模ㄟ@就是為什么很多基準(zhǔn)測(cè)試都是基于這個(gè)模式),你可以得到驚人的吞吐量和帶寬利用率,不過如果選擇了這種模式, 一定會(huì)丟失一些消息。

acks = 1:意味若 Leader 在收到消息并把它寫入到分區(qū)數(shù)據(jù)文件(不一定同步到磁盤上)時(shí)會(huì)返回確認(rèn)或錯(cuò)誤響應(yīng)。在這個(gè)模式下,如果發(fā)生正常的 Leader 選舉,生產(chǎn)者會(huì)在選舉時(shí)收到一個(gè) LeaderNotAvailableException 異常,如果生產(chǎn)者能恰當(dāng)?shù)靥幚磉@個(gè)錯(cuò)誤,它會(huì)重試發(fā)送悄息,最終消息會(huì)安全到達(dá)新的 Leader 那里。不過在這個(gè)模式下仍然有可能丟失數(shù)據(jù),比如消息已經(jīng)成功寫入 Leader,但在消息被復(fù)制到 follower 副本之前 Leader發(fā)生崩潰。

acks = all(這個(gè)和 request.required.acks = -1 含義一樣):意味著 Leader 在返回確認(rèn)或錯(cuò)誤響應(yīng)之前,會(huì)等待所有同步副本都收到悄息。如果和 min.insync.replicas 參數(shù)結(jié)合起來(lái),就可以決定在返回確認(rèn)前至少有多少個(gè)副本能夠收到悄息,生產(chǎn)者會(huì)一直重試直到消息被成功提交。不過這也是最慢的做法,因?yàn)樯a(chǎn)者在繼續(xù)發(fā)送其他消息之前需要等待所有副本都收到當(dāng)前的消息。

根據(jù)實(shí)際的應(yīng)用場(chǎng)景,我們?cè)O(shè)置不同的 acks,以此保證數(shù)據(jù)的可靠性。

另外,Producer 發(fā)送消息還可以選擇同步(默認(rèn),通過 producer.type=sync 配置) 或者異步(producer.type=async)模式。如果設(shè)置成異步,雖然會(huì)極大的提高消息發(fā)送的性能,但是這樣會(huì)增加丟失數(shù)據(jù)的風(fēng)險(xiǎn)。如果需要確保消息的可靠性,必須將 producer.type 設(shè)置為 sync。

Leader 選舉

在介紹 Leader 選舉之前,讓我們先來(lái)了解一下 ISR(in-sync replicas)列表。每個(gè)分區(qū)的 leader 會(huì)維護(hù)一個(gè) ISR 列表,ISR 列表里面就是 follower 副本的 Borker 編號(hào),只有跟得上 Leader 的 follower 副本才能加入到 ISR 里面,這個(gè)是通過 replica.lag.time.max.ms 參數(shù)配置的。只有 ISR 里的成員才有被選為 leader 的可能。

2)數(shù)據(jù)一致性

這里介紹的數(shù)據(jù)一致性主要是說(shuō)不論是老的 Leader 還是新選舉的 Leader,Consumer 都能讀到一樣的數(shù)據(jù)。那么 Kafka 是如何實(shí)現(xiàn)的呢?

假設(shè)分區(qū)的副本為3,其中副本0是 Leader,副本1和副本2是 follower,并且在 ISR 列表里面。雖然副本0已經(jīng)寫入了 Message4,但是 Consumer 只能讀取到 Message2。因?yàn)樗械?ISR 都同步了 Message2,只有 High Water Mark 以上的消息才支持 Consumer 讀取,而 High Water Mark 取決于 ISR 列表里面偏移量最小的分區(qū),對(duì)應(yīng)于上圖的副本2,這個(gè)很類似于木桶原理。

這樣做的原因是還沒有被足夠多副本復(fù)制的消息被認(rèn)為是“不安全”的,如果 Leader 發(fā)生崩潰,另一個(gè)副本成為新 Leader,那么這些消息很可能丟失了。如果我們?cè)试S消費(fèi)者讀取這些消息,可能就會(huì)破壞一致性。試想,一個(gè)消費(fèi)者從當(dāng)前 Leader(副本0) 讀取并處理了 Message4,這個(gè)時(shí)候 Leader 掛掉了,選舉了副本1為新的 Leader,這時(shí)候另一個(gè)消費(fèi)者再去從新的 Leader 讀取消息,發(fā)現(xiàn)這個(gè)消息其實(shí)并不存在,這就導(dǎo)致了數(shù)據(jù)不一致性問題。

當(dāng)然,引入了 High Water Mark 機(jī)制,會(huì)導(dǎo)致 Broker 間的消息復(fù)制因?yàn)槟承┰蜃兟?,那么消息到達(dá)消費(fèi)者的時(shí)間也會(huì)隨之變長(zhǎng)(因?yàn)槲覀儠?huì)先等待消息復(fù)制完畢)。延遲時(shí)間可以通過參數(shù) replica.lag.time.max.ms 參數(shù)配置,它指定了副本在復(fù)制消息時(shí)可被允許的最大延遲時(shí)間。

到此,關(guān)于“Kafka的高可靠性是怎么實(shí)現(xiàn)的”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI