轉(zhuǎn)載;面試官:請談?wù)剬懭胂⒅虚g件的數(shù)據(jù)憎蛤,如何保證不丟失外傅?
原創(chuàng)?石杉的架構(gòu)筆記?2019-03-06 08:30:00
歡迎關(guān)注頭條號:石杉的架構(gòu)筆記
周一至周五早八點(diǎn)半!精品技術(shù)文章準(zhǔn)時送上A┟省N取!
精品學(xué)習(xí)資料獲取通道棚辽,參見文末
目錄
1技竟、背景引入
2、Kafka分布式存儲架構(gòu)
3屈藐、Kafka高可用架構(gòu)
4榔组、畫圖復(fù)現(xiàn)Kafka的寫入數(shù)據(jù)丟失問題
5、Kafka的ISR機(jī)制是什么联逻?
6搓扯、Kafka寫入的數(shù)據(jù)如何保證不丟失?
7包归、總結(jié)
(1)背景引入
這篇文章擅编,給大家聊一下寫入Kafka的數(shù)據(jù)該如何保證其不丟失?
看過之前的文章面試官:消息中間件如何實(shí)現(xiàn)每秒幾十萬的高并發(fā)寫入箫踩?的同學(xué),應(yīng)該都知道寫入Kafka的數(shù)據(jù)是會落地寫入磁盤的谭贪。
我們暫且不考慮寫磁盤的具體過程境钟,先大致看看下面的圖,這代表了Kafka的核心架構(gòu)原理俭识。
(2)Kafka分布式存儲架構(gòu)
那么現(xiàn)在問題來了慨削,如果每天產(chǎn)生幾十TB的數(shù)據(jù),難道都寫一臺機(jī)器的磁盤上嗎?這明顯是不靠譜的案刻磁椒!
所以說,這里就得考慮數(shù)據(jù)的分布式存儲了玫芦,其實(shí)關(guān)于消息中間件的分布式存儲以及高可用架構(gòu)浆熔,之前的一篇文章面試一線互聯(lián)網(wǎng)大廠?那這道題目你必須得會桥帆!也分析過了医增,但是這里,我們結(jié)合Kafka的具體情況來說說老虫。
在Kafka里面叶骨,有一個核心的概念叫做“Topic”,這個topic你就姑且認(rèn)為是一個數(shù)據(jù)集合吧祈匙。
舉個例子忽刽,如果你現(xiàn)在有一份網(wǎng)站的用戶行為數(shù)據(jù)要寫入Kafka,你可以搞一個topic叫做“user_access_log_topic”夺欲,這里寫入的都是用戶行為數(shù)據(jù)跪帝。
然后如果你要把電商網(wǎng)站的訂單數(shù)據(jù)的增刪改變更記錄寫Kafka,那可以搞一個topic叫做“order_tb_topic”洁闰,這里寫入的都是訂單表的變更記錄歉甚。
然后假如說咱們舉個例子,就說這個用戶行為topic吧扑眉,里面如果每天寫入幾十TB的數(shù)據(jù)纸泄,你覺得都放一臺機(jī)器上靠譜嗎?
明顯不太靠譜腰素,所以Kafka有一個概念叫做Partition聘裁,就是把一個topic數(shù)據(jù)集合拆分為多個數(shù)據(jù)分區(qū),你可以認(rèn)為是多個數(shù)據(jù)分片弓千,每個Partition可以在不同的機(jī)器上衡便,儲存部分?jǐn)?shù)據(jù)。
這樣洋访,不就可以把一個超大的數(shù)據(jù)集合分布式存儲在多臺機(jī)器上了嗎镣陕?大家看下圖,一起來體會一下姻政。
(3)Kafka高可用架構(gòu)
但是這個時候呆抑,我們又會遇到一個問題,就是萬一某臺機(jī)器宕機(jī)了汁展,這臺機(jī)器上的那個partition管理的數(shù)據(jù)不就丟失了嗎鹊碍?
所以說厌殉,我們還得做多副本冗余,每個Partition都可以搞一個副本放在別的機(jī)器上侈咕,這樣某臺機(jī)器宕機(jī)公罕,只不過是Partition其中一個副本丟失。
如果某個Partition有多副本的話耀销,Kafka會選舉其中一個Parititon副本作為Leader楼眷,然后其他的Partition副本是Follower。
只有Leader Partition是對外提供讀寫操作的树姨,F(xiàn)ollower Partition就是從Leader Partition同步數(shù)據(jù)摩桶。
一旦Leader Partition宕機(jī)了,就會選舉其他的Follower Partition作為新的Leader Partition對外提供讀寫服務(wù)帽揪,這不就實(shí)現(xiàn)了高可用架構(gòu)了硝清?
大家看下面的圖,看看這個過程转晰。
(4)Kafka寫入數(shù)據(jù)丟失問題
現(xiàn)在我們來看看芦拿,什么情況下Kafka中寫入數(shù)據(jù)會丟失呢?
其實(shí)也很簡單查邢,大家都知道寫入數(shù)據(jù)都是往某個Partition的Leader寫入的蔗崎,然后那個Partition的Follower會從Leader同步數(shù)據(jù)。
但是萬一1條數(shù)據(jù)剛寫入Leader Partition扰藕,還沒來得及同步給Follower缓苛,此時Leader Partiton所在機(jī)器突然就宕機(jī)了呢?
大家看下圖:
如上圖邓深,這個時候有一條數(shù)據(jù)是沒同步到Partition0的Follower上去的未桥,然后Partition0的Leader所在機(jī)器宕機(jī)了。
此時就會選舉Partition0的Follower作為新的Leader對外提供服務(wù)芥备,然后用戶是不是就讀不到剛才寫入的那條數(shù)據(jù)了冬耿?
因?yàn)镻artition0的Follower上是沒有同步到最新的一條數(shù)據(jù)的。
這個時候就會造成數(shù)據(jù)丟失的問題萌壳。
(5)Kafka的ISR機(jī)制是什么亦镶?
現(xiàn)在我們先留著這個問題不說具體怎么解決,先回過頭來看一個Kafka的核心機(jī)制袱瓮,就是ISR機(jī)制缤骨。
這個機(jī)制簡單來說,就是會自動給每個Partition維護(hù)一個ISR列表尺借,這個列表里一定會有Leader绊起,然后還會包含跟Leader保持同步的Follower。
也就是說褐望,只要Leader的某個Follower一直跟他保持?jǐn)?shù)據(jù)同步勒庄,那么就會存在于ISR列表里。
但是如果Follower因?yàn)樽陨戆l(fā)生一些問題瘫里,導(dǎo)致不能及時的從Leader同步數(shù)據(jù)過去实蔽,那么這個Follower就會被認(rèn)為是“out-of-sync”,從ISR列表里踢出去谨读。
所以大家先得明白這個ISR是什么局装,說白了,就是Kafka自動維護(hù)和監(jiān)控哪些Follower及時的跟上了Leader的數(shù)據(jù)同步劳殖。
(6)Kafka寫入的數(shù)據(jù)如何保證不丟失铐尚?
所以如果要讓寫入Kafka的數(shù)據(jù)不丟失,你需要要求幾點(diǎn):
每個Partition都至少得有1個Follower在ISR列表里哆姻,跟上了Leader的數(shù)據(jù)同步
每次寫入數(shù)據(jù)的時候宣增,都要求至少寫入Partition Leader成功,同時還有至少一個ISR里的Follower也寫入成功矛缨,才算這個寫入是成功了
如果不滿足上述兩個條件爹脾,那就一直寫入失敗,讓生產(chǎn)系統(tǒng)不停的嘗試重試箕昭,直到滿足上述兩個條件灵妨,然后才能認(rèn)為寫入成功
按照上述思路去配置相應(yīng)的參數(shù),才能保證寫入Kafka的數(shù)據(jù)不會丟失
好落竹!現(xiàn)在咱們來分析一下上面幾點(diǎn)要求泌霍。
第一條,必須要求至少一個Follower在ISR列表里述召。
那必須的啊朱转,要是Leader沒有Follower了,或者是Follower都沒法及時同步Leader數(shù)據(jù)桨武,那么這個事兒肯定就沒法弄下去了肋拔。
第二條,每次寫入數(shù)據(jù)的時候呀酸,要求leader寫入成功以外凉蜂,至少一個ISR里的Follower也寫成功。
大家看下面的圖性誉,這個要求就是保證說窿吩,每次寫數(shù)據(jù),必須是leader和follower都寫成功了错览,才能算是寫成功纫雁,保證一條數(shù)據(jù)必須有兩個以上的副本。
這個時候萬一leader宕機(jī)倾哺,就可以切換到那個follower上去轧邪,那么Follower上是有剛寫入的數(shù)據(jù)的刽脖,此時數(shù)據(jù)就不會丟失了。
如上圖所示忌愚,假如現(xiàn)在leader沒有follower了曲管,或者是剛寫入leader,leader立馬就宕機(jī)硕糊,還沒來得及同步給follower院水。
在這種情況下,寫入就會失敗简十,然后你就讓生產(chǎn)者不停的重試檬某,直到kafka恢復(fù)正常滿足上述條件,才能繼續(xù)寫入螟蝙。
這樣就可以讓寫入kafka的數(shù)據(jù)不丟失恢恼。
(7)總結(jié)
最后總結(jié)一下,其實(shí)kafka的數(shù)據(jù)丟失問題胶逢,涉及到方方面面厅瞎。
譬如生產(chǎn)端的緩存問題,包括消費(fèi)端的問題初坠,同時kafka自己內(nèi)部的底層算法和機(jī)制也可能導(dǎo)致數(shù)據(jù)丟失和簸。
但是平時寫入數(shù)據(jù)遇到比較大的一個問題,就是leader切換時可能導(dǎo)致數(shù)據(jù)丟失碟刺。所以本文僅僅是針對這個問題說了一下生產(chǎn)環(huán)境解決這個問題的方案锁保。
End
(封面圖源網(wǎng)絡(luò),侵權(quán)刪除)
私信頭條號半沽,發(fā)送:“資料”爽柒,獲取更多“秘制” 精品學(xué)習(xí)資料
如有收獲,請幫忙轉(zhuǎn)發(fā)者填,您的鼓勵是作者最大的動力浩村,謝謝!
一大波微服務(wù)占哟、分布式心墅、高并發(fā)、高可用的原創(chuàng)系列文章正在路上,
歡迎關(guān)注頭條號:石杉的架構(gòu)筆記
周一至周五早八點(diǎn)半榨乎!精品技術(shù)文章準(zhǔn)時送上T踉铩!蜜暑!
十余年BAT架構(gòu)經(jīng)驗(yàn)傾囊相授
推薦閱讀
1铐姚、拜托!面試請不要再問我Spring Cloud底層原理肛捍!
2隐绵、微服務(wù)注冊中心如何承載大型系統(tǒng)的千萬級訪問之众?
3、「性能優(yōu)化之道」每秒上萬并發(fā)下的Spring Cloud參數(shù)優(yōu)化實(shí)戰(zhàn)
4依许、「“剁手黨”狂歡的背后」微服務(wù)架構(gòu)如何保障99.99%的高可用酝枢?
5、兄弟悍手,用大白話告訴你小白都能看懂的Hadoop架構(gòu)原理
6、大規(guī)模集群下Hadoop NameNode如何承載每秒上千次的高并發(fā)訪問
7袍患、「性能優(yōu)化的秘密」Hadoop如何將TB級大文件的上傳性能優(yōu)化上百倍
8坦康、拜托,面試請不要再問我TCC分布式事務(wù)的實(shí)現(xiàn)原理诡延!
9滞欠、最終一致性分布式事務(wù)如何保障實(shí)際生產(chǎn)中99.99%高可用?
10肆良、拜托筛璧,面試請不要再問我Redis分布式鎖的實(shí)現(xiàn)原理
11、Hadoop底層算法如何優(yōu)雅的將大規(guī)模集群性能提升10倍以上惹恃?
12夭谤、億級流量系統(tǒng)架構(gòu)之如何支撐百億級數(shù)據(jù)的存儲與計(jì)算
13、億級流量系統(tǒng)架構(gòu)之如何設(shè)計(jì)高容錯分布式計(jì)算系統(tǒng)
14巫糙、億級流量系統(tǒng)架構(gòu)之如何設(shè)計(jì)承載百億流量的高性能架構(gòu)
15朗儒、億級流量系統(tǒng)架構(gòu)之如何設(shè)計(jì)每秒十萬查詢的高并發(fā)架構(gòu)
16、億級流量系統(tǒng)架構(gòu)之如何設(shè)計(jì)全鏈路99.99%高可用架構(gòu)
17参淹、七張圖徹底講清楚ZooKeeper分布式鎖的實(shí)現(xiàn)原理
18醉锄、大白話聊聊Java并發(fā)面試問題之volatile到底是什么?
19浙值、大白話聊聊Java并發(fā)面試問題之Java 8如何優(yōu)化CAS性能恳不?
20、大白話聊聊Java并發(fā)面試問題之談?wù)勀銓QS的理解开呐?
21烟勋、大白話聊聊Java并發(fā)面試問題之微服務(wù)注冊中心的讀寫鎖優(yōu)化
22、互聯(lián)網(wǎng)公司的面試官是如何360°無死角考察候選人的负蚊?(上篇)
23神妹、互聯(lián)網(wǎng)公司面試官是如何360°無死角考察候選人的?(下篇)
24家妆、「Java進(jìn)階面試系列之一」你們系統(tǒng)架構(gòu)中為何要引入消息中間件鸵荠?
25、「Java進(jìn)階面試系列之二」系統(tǒng)架構(gòu)引入消息中間件有什么缺點(diǎn)
26伤极、「行走的Offer收割機(jī)」一位朋友斬獲BAT技術(shù)專家Offer的面試經(jīng)歷
27蛹找、「Java進(jìn)階面試系列之三」消息中間件在你們項(xiàng)目里是如何落地的姨伤?
28、扎心庸疾!線上服務(wù)宕機(jī)時乍楚,如何保證數(shù)據(jù)100%不丟失?
29届慈、?一次JVM FullGC的背后徒溪,竟隱藏著驚心動魄的線上生產(chǎn)事故!
30金顿、「高并發(fā)優(yōu)化實(shí)踐」10倍請求壓力來襲臊泌,你的系統(tǒng)會被擊垮嗎?
31揍拆、消息中間件集群崩潰渠概,如何保證百萬生產(chǎn)數(shù)據(jù)不丟失?
32嫂拴、億級流量系統(tǒng)架構(gòu)之如何在上萬并發(fā)場景下設(shè)計(jì)可擴(kuò)展架構(gòu)(上)播揪?
33、億級流量系統(tǒng)架構(gòu)之如何在上萬并發(fā)場景下設(shè)計(jì)可擴(kuò)展架構(gòu)(中)筒狠?
34猪狈、億級流量系統(tǒng)架構(gòu)之如何在上萬并發(fā)場景下設(shè)計(jì)可擴(kuò)展架構(gòu)(下)?
35辩恼、億級流量架構(gòu)第二彈:你的系統(tǒng)真的無懈可擊嗎罪裹?
36、億級流量系統(tǒng)架構(gòu)之如何保證百億流量下的數(shù)據(jù)一致性(上)
37运挫、億級流量系統(tǒng)架構(gòu)之如何保證百億流量下的數(shù)據(jù)一致性(中)状共?
38、億級流量系統(tǒng)架構(gòu)之如何保證百億流量下的數(shù)據(jù)一致性(下)谁帕?
39峡继、互聯(lián)網(wǎng)面試必殺:如何保證消息中間件全鏈路數(shù)據(jù)100%不丟失(1)
40、互聯(lián)網(wǎng)面試必殺:如何保證消息中間件全鏈路數(shù)據(jù)100%不丟失(2)
41匈挖、面試大殺器:消息中間件如何實(shí)現(xiàn)消費(fèi)吞吐量的百倍優(yōu)化碾牌?
42、兄弟儡循,用大白話給你講小白都能看懂的分布式系統(tǒng)容錯架構(gòu)
43舶吗、從團(tuán)隊(duì)自研的百萬并發(fā)中間件系統(tǒng)的內(nèi)核設(shè)計(jì)看Java并發(fā)性能優(yōu)化
44、如果20萬用戶同時訪問一個熱點(diǎn)緩存择膝,如何優(yōu)化你的緩存架構(gòu)誓琼?
45、「非廣告,純干貨」英語差的程序員如何才能無障礙閱讀官方文檔腹侣?
46叔收、面試最讓你手足無措的一個問題:你的系統(tǒng)如何支撐高并發(fā)?
47傲隶、Java進(jìn)階必備:優(yōu)雅的告訴面試官消息中間件該如何實(shí)現(xiàn)高可用架構(gòu)
48饺律、「非廣告,純干貨」中小公司的Java工程師應(yīng)該如何逆襲沖進(jìn)BAT跺株?
49复濒、拜托,面試請不要再問我分布式搜索引擎的架構(gòu)原理乒省!
50芝薇、互聯(lián)網(wǎng)大廠Java面試題:使用無界隊(duì)列的線程池會導(dǎo)致內(nèi)存飆升嗎?
51作儿、「碼農(nóng)打怪升級之路」行走江湖,你需要解鎖哪些技能包馋劈?
52攻锰、「來自一線的血淚總結(jié)」你的系統(tǒng)上線時是否踩過這些坑?
53妓雾、【offer收割機(jī)必備】我簡歷上的Java項(xiàng)目都好low娶吞,怎么辦?
54械姻、【offer去哪了】我一連面試了十個Java崗妒蛇,統(tǒng)統(tǒng)石沉大海!
55楷拳、支撐日活百萬用戶的高并發(fā)系統(tǒng)绣夺,應(yīng)該如何設(shè)計(jì)其數(shù)據(jù)庫架構(gòu)?
56欢揖、高階Java開發(fā)必備:分布式系統(tǒng)的唯一id生成算法你了解嗎陶耍?
57、尷尬了她混!Spring Cloud微服務(wù)注冊中心Eureka 2.x停止維護(hù)了咋辦烈钞?
58、【Java高階必備】如何優(yōu)化Spring Cloud微服務(wù)注冊中心架構(gòu)坤按?