轉(zhuǎn)載:面試官:請談?wù)剬懭胂⒅虚g件的數(shù)據(jù)恰矩,如何保證不丟失?

轉(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)坤按?

59毯欣、面試官:消息中間件如何實(shí)現(xiàn)每秒幾十萬的高并發(fā)寫入?

60臭脓、【非廣告酗钞,純干貨】三四十歲大齡程序員,該如何保持職場競爭力?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末算吩,一起剝皮案震驚了整個濱河市留凭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌偎巢,老刑警劉巖蔼夜,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異压昼,居然都是意外死亡求冷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門窍霞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來匠题,“玉大人,你說我怎么就攤上這事但金【律剑” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵冷溃,是天一觀的道長钱磅。 經(jīng)常有香客問我,道長似枕,這世上最難降的妖魔是什么盖淡? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮凿歼,結(jié)果婚禮上褪迟,老公的妹妹穿的比我還像新娘。我一直安慰自己答憔,他們只是感情好味赃,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著虐拓,像睡著了一般洁桌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上侯嘀,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天另凌,我揣著相機(jī)與錄音,去河邊找鬼戒幔。 笑死吠谢,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的诗茎。 我是一名探鬼主播工坊,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼献汗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了王污?” 一聲冷哼從身側(cè)響起罢吃,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎昭齐,沒想到半個月后尿招,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡阱驾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年就谜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片里覆。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡丧荐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出喧枷,到底是詐尸還是另有隱情虹统,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布隧甚,位于F島的核電站车荔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏呻逆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一菩帝、第九天 我趴在偏房一處隱蔽的房頂上張望咖城。 院中可真熱鬧,春花似錦呼奢、人聲如沸宜雀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辐董。三九已至,卻和暖如春禀综,著一層夾襖步出監(jiān)牢的瞬間简烘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工定枷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留孤澎,地道東北人华畏。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓沈堡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親钉蒲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容