您好,登錄后才能下訂單哦!
這篇文章主要介紹“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 的可能。
這里介紹的數(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í)用的文章!
免責(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)容。