歡迎關注我的公衆號:石杉的架構筆記(ID:shishan100)程序員
週一至週五早8點半!精品技術文章準時送上!面試
精品學習資料獲取通道,參見文末算法
一、背景引入數據庫
二、Kafka分佈式存儲架構緩存
三、Kafka高可用架構性能優化
四、畫圖復現Kafka的寫入數據丟失問題網絡
五、Kafka的ISR機制是什麼?架構
六、Kafka寫入的數據如何保證不丟失?併發
七、總結分佈式
這篇文章,給你們聊一下寫入Kafka的數據該如何保證其不丟失?
看過以前的文章面試官:消息中間件如何實現每秒幾十萬的高併發寫入?的同窗,應該都知道寫入Kafka的數據是會落地寫入磁盤的。
咱們暫且不考慮寫磁盤的具體過程,先大體看看下面的圖,這表明了Kafka的核心架構原理。
那麼如今問題來了,若是天天產生幾十TB的數據,難道都寫一臺機器的磁盤上嗎?這明顯是不靠譜的啊!
因此說,這裏就得考慮數據的分佈式存儲了,其實關於消息中間件的分佈式存儲以及高可用架構,以前的一篇文章面試一線互聯網大廠?那這道題目你必須得會!也分析過了,可是這裏,咱們結合Kafka的具體狀況來講說。
在Kafka裏面,有一個核心的概念叫作「Topic」,這個topic你就姑且認爲是一個數據集合吧。
舉個例子,若是你如今有一份網站的用戶行爲數據要寫入Kafka,你能夠搞一個topic叫作「user_access_log_topic」,這裏寫入的都是用戶行爲數據。
而後若是你要把電商網站的訂單數據的增刪改變動記錄寫Kafka,那能夠搞一個topic叫作「order_tb_topic」,這裏寫入的都是訂單表的變動記錄。
而後假如說我們舉個例子,就說這個用戶行爲topic吧,裏面若是天天寫入幾十TB的數據,你以爲都放一臺機器上靠譜嗎?
明顯不太靠譜,因此Kafka有一個概念叫作Partition,就是把一個topic數據集合拆分爲多個數據分區,你能夠認爲是多個數據分片,每一個Partition能夠在不一樣的機器上,儲存部分數據。
這樣,不就能夠把一個超大的數據集合分佈式存儲在多臺機器上了嗎?你們看下圖,一塊兒來體會一下。
可是這個時候,咱們又會遇到一個問題,就是萬一某臺機器宕機了,這臺機器上的那個partition管理的數據不就丟失了嗎?
因此說,咱們還得作多副本冗餘,每一個Partition均可以搞一個副本放在別的機器上,這樣某臺機器宕機,只不過是Partition其中一個副本丟失。
若是某個Partition有多副本的話,Kafka會選舉其中一個Parititon副本做爲Leader,而後其餘的Partition副本是Follower。
只有Leader Partition是對外提供讀寫操做的,Follower Partition就是從Leader Partition同步數據。
一旦Leader Partition宕機了,就會選舉其餘的Follower Partition做爲新的Leader Partition對外提供讀寫服務,這不就實現了高可用架構了?
你們看下面的圖,看看這個過程。
如今咱們來看看,什麼狀況下Kafka中寫入數據會丟失呢?
其實也很簡單,你們都知道寫入數據都是往某個Partition的Leader寫入的,而後那個Partition的Follower會從Leader同步數據。
可是萬一1條數據剛寫入Leader Partition,還沒來得及同步給Follower,此時Leader Partiton所在機器忽然就宕機了呢?
你們看下圖:
如上圖,這個時候有一條數據是沒同步到Partition0的Follower上去的,而後Partition0的Leader所在機器宕機了。
此時就會選舉Partition0的Follower做爲新的Leader對外提供服務,而後用戶是否是就讀不到剛纔寫入的那條數據了?
由於Partition0的Follower上是沒有同步到最新的一條數據的。
這個時候就會形成數據丟失的問題。
如今咱們先留着這個問題不說具體怎麼解決,先回過頭來看一個Kafka的核心機制,就是ISR機制。
這個機制簡單來講,就是會自動給每一個Partition維護一個ISR列表,這個列表裏必定會有Leader,而後還會包含跟Leader保持同步的Follower。
也就是說,只要Leader的某個Follower一直跟他保持數據同步,那麼就會存在於ISR列表裏。
可是若是Follower由於自身發生一些問題,致使不能及時的從Leader同步數據過去,那麼這個Follower就會被認爲是「out-of-sync」,從ISR列表裏踢出去。
因此你們先得明白這個ISR是什麼,說白了,就是Kafka自動維護和監控哪些Follower及時的跟上了Leader的數據同步。
因此若是要讓寫入Kafka的數據不丟失,你須要要求幾點:
好!如今我們來分析一下上面幾點要求。
第一條,必需要求至少一個Follower在ISR列表裏。
那必須的啊,要是Leader沒有Follower了,或者是Follower都無法及時同步Leader數據,那麼這個事兒確定就無法弄下去了。
第二條,每次寫入數據的時候,要求leader寫入成功之外,至少一個ISR裏的Follower也寫成功。
你們看下面的圖,這個要求就是保證說,每次寫數據,必須是leader和follower都寫成功了,才能算是寫成功,保證一條數據必須有兩個以上的副本。
這個時候萬一leader宕機,就能夠切換到那個follower上去,那麼Follower上是有剛寫入的數據的,此時數據就不會丟失了。
如上圖所示,假如如今leader沒有follower了,或者是剛寫入leader,leader立馬就宕機,還沒來得及同步給follower。
在這種狀況下,寫入就會失敗,而後你就讓生產者不停的重試,直到kafka恢復正常知足上述條件,才能繼續寫入。
這樣就可讓寫入kafka的數據不丟失。
最後總結一下,其實kafka的數據丟失問題,涉及到方方面面。
譬如生產端的緩存問題,包括消費端的問題,同時kafka本身內部的底層算法和機制也可能致使數據丟失。
可是平時寫入數據遇到比較大的一個問題,就是leader切換時可能致使數據丟失。因此本文僅僅是針對這個問題說了一下生產環境解決這個問題的方案。
End
(封面,圖源網絡,侵權刪除)
掃描下方二維碼,備註:「資料」,獲取更多「祕製」 精品學習資料
一大波微服務、分佈式、高併發、高可用的原創系列文章正在路上
歡迎掃描下方二維碼,持續關注:
石杉的架構筆記(id:shishan100)
十餘年BAT架構經驗傾囊相授
推薦閱讀:
二、【雙11狂歡的背後】微服務註冊中心如何承載大型系統的千萬級訪問?
三、【性能優化之道】每秒上萬併發下的Spring Cloud參數優化實戰
六、大規模集羣下Hadoop NameNode如何承載每秒上千次的高併發訪問
七、【性能優化的祕密】Hadoop如何將TB級大文件的上傳性能優化上百倍
九、【坑爹呀!】最終一致性分佈式事務如何保障實際生產中99.99%高可用?
十一、【眼前一亮!】看Hadoop底層算法如何優雅的將大規模集羣性能提高10倍以上?
1六、億級流量系統架構之如何設計全鏈路99.99%高可用架構
1八、大白話聊聊Java併發面試問題之volatile究竟是什麼?
1九、大白話聊聊Java併發面試問題之Java 8如何優化CAS性能?
20、大白話聊聊Java併發面試問題之談談你對AQS的理解?
2一、大白話聊聊Java併發面試問題之公平鎖與非公平鎖是啥?
2二、大白話聊聊Java併發面試問題之微服務註冊中心的讀寫鎖優化
2三、互聯網公司的面試官是如何360°無死角考察候選人的?(上篇)
2四、互聯網公司面試官是如何360°無死角考察候選人的?(下篇)
2五、Java進階面試系列之一:哥們,大家的系統架構中爲何要引入消息中間件?
2六、【Java進階面試系列之二】:哥們,那你說說系統架構引入消息中間件有什麼缺點?
2七、【行走的Offer收割機】記一位朋友斬獲BAT技術專家Offer的面試經歷
2八、【Java進階面試系列之三】哥們,消息中間件在大家項目裏是如何落地的?
2九、【Java進階面試系列之四】扎心!線上服務宕機時,如何保證數據100%不丟失?
30、一次JVM FullGC的背後,竟隱藏着驚心動魄的線上生產事故!
3一、【高併發優化實踐】10倍請求壓力來襲,你的系統會被擊垮嗎?
3二、【Java進階面試系列之五】消息中間件集羣崩潰,如何保證百萬生產數據不丟失?
3三、億級流量系統架構之如何在上萬併發場景下設計可擴展架構(上)?
3四、億級流量系統架構之如何在上萬併發場景下設計可擴展架構(中)?
3五、億級流量系統架構之如何在上萬併發場景下設計可擴展架構(下)?
3七、億級流量系統架構之如何保證百億流量下的數據一致性(上)
3八、億級流量系統架構之如何保證百億流量下的數據一致性(中)?
3九、億級流量系統架構之如何保證百億流量下的數據一致性(下)?
40、互聯網面試必殺:如何保證消息中間件全鏈路數據100%不丟失(1)
4一、互聯網面試必殺:如何保證消息中間件全鏈路數據100%不丟失(2)
4三、高併發場景下,如何保證生產者投遞到消息中間件的消息不丟失?
4五、從團隊自研的百萬併發中間件系統的內核設計看Java併發性能優化
4六、【非廣告,純乾貨】英語差的程序員如何才能無障礙閱讀官方文檔?
4七、若是20萬用戶同時訪問一個熱點緩存,如何優化你的緩存架構?
4八、【非廣告,純乾貨】中小公司的Java工程師應該如何逆襲衝進BAT?
50、【金三銀四跳槽季】Java工程師如何在1個月內作好面試準備?
5一、【offer收割機必備】我簡歷上的Java項目都好low,怎麼辦?
5二、【offer去哪了】我一連面試了十個Java崗,通通石沉大海!
5三、高階Java開發必備:分佈式系統的惟一id生成算法你瞭解嗎?
5四、支撐日活百萬用戶的高併發系統,應該如何設計其數據庫架構?
5五、尷尬了!Spring Cloud微服務註冊中心Eureka 2.x中止維護了咋辦?