kafka如何保證不重復消費又不丟失數據_Kafka寫入的數據如何保證不丟失?

我們暫且不考慮寫磁盤的具體過程,先大致看看下面的圖,這代表了 Kafka 的核心架構原理。

33670f6ec88e654b48fc29e21eced6b8.png

Kafka 分布式存儲架構

那么現在問題來了,如果每天產生幾十 TB 的數據,難道都寫一臺機器的磁盤上嗎?這明顯是不靠譜的啊!所以說,這里就得考慮數據的分布式存儲了,我們結合 Kafka 的具體情況來說說。在 Kafka 里面,有一個核心的概念叫做“Topic”,這個 Topic 你就姑且認為是一個數據集合吧。舉個例子,如果你現在有一份網站的用戶行為數據要寫入 Kafka,你可以搞一個 Topic 叫做“user_access_log_topic”,這里寫入的都是用戶行為數據。然后如果你要把電商網站的訂單數據的增刪改變更記錄寫 Kafka,那可以搞一個 Topic 叫做“order_tb_topic”,這里寫入的都是訂單表的變更記錄。然后假如說咱們舉個例子,就說這個用戶行為 Topic 吧,里面如果每天寫入幾十 TB 的數據,你覺得都放一臺機器上靠譜嗎?明顯不太靠譜,所以 Kafka 有一個概念叫做 Partition,就是把一個 Topic 數據集合拆分為多個數據分區,你可以認為是多個數據分片,每個 Partition 可以在不同的機器上,儲存部分數據。這樣,不就可以把一個超大的數據集合分布式存儲在多臺機器上了嗎?大家看下圖,一起來體會一下。

209a1d56fe70700526296c48c0fc1ceb.png

Kafka 高可用架構

但是這個時候,我們又會遇到一個問題,就是萬一某臺機器宕機了,這臺機器上的那個 Partition 管理的數據不就丟失了嗎?

所以說,我們還得做多副本冗余,每個 Partition 都可以搞一個副本放在別的機器上,這樣某臺機器宕機,只不過是 Partition 其中一個副本丟失。如果某個 Partition 有多副本的話,Kafka 會選舉其中一個 Parititon 副本作為 Leader,然后其他的 Partition 副本是 Follower。只有 Leader Partition 是對外提供讀寫操作的,Follower Partition 就是從 Leader Partition 同步數據。一旦 Leader Partition 宕機了,就會選舉其他的 Follower Partition 作為新的 Leader Partition 對外提供讀寫服務,這不就實現了高可用架構了?

大家看下面的圖,看看這個過程:

825cda3ef24652e3495e08a06abd7bcd.png

Kafka 寫入數據丟失問題

現在我們來看看,什么情況下 Kafka 中寫入數據會丟失呢?其實也很簡單,大家都知道寫入數據都是往某個 Partition 的 Leader 寫入的,然后那個 Partition 的 Follower 會從 Leader 同步數據。但是萬一 1 條數據剛寫入 Leader Partition,還沒來得及同步給 Follower,此時 Leader Partiton 所在機器突然就宕機了呢?

大家看下圖:

5d37867b90b6b54a3987c979ba1ef002.png

如上圖,這個時候有一條數據是沒同步到 Partition0 的 Follower 上去的,然后 Partition0 的 Leader 所在機器宕機了。此時就會選舉 Partition0 的 Follower 作為新的 Leader 對外提供服務,然后用戶是不是就讀不到剛才寫入的那條數據了?因為 Partition0 的 Follower 上是沒有同步到最新的一條數據的。這個時候就會造成數據丟失的問題。

Kafka 的 ISR 機制是什么?

現在我們先留著這個問題不說具體怎么解決,先回過頭來看一個 Kafka 的核心機制,就是 ISR 機制。這個機制簡單來說,就是會自動給每個 Partition 維護一個 ISR 列表,這個列表里一定會有 Leader,然后還會包含跟 Leader 保持同步的 Follower。也就是說,只要 Leader 的某個 Follower 一直跟他保持數據同步,那么就會存在于 ISR 列表里。但是如果 Follower 因為自身發生一些問題,導致不能及時的從 Leader 同步數據過去,那么這個 Follower 就會被認為是“out-of-sync”,被從 ISR 列表里踢出去。所以大家先得明白這個 ISR 是什么,說白了,就是 Kafka 自動維護和監控哪些 Follower 及時的跟上了 Leader 的數據同步。

Kafka 寫入的數據如何保證不丟失?

所以如果要讓寫入 Kafka 的數據不丟失,你需要保證如下幾點:

每個 Partition 都至少得有 1 個 Follower 在 ISR 列表里,跟上了 Leader 的數據同步。

每次寫入數據的時候,都要求至少寫入 Partition Leader 成功,同時還有至少一個 ISR 里的 Follower 也寫入成功,才算這個寫入是成功了。

如果不滿足上述兩個條件,那就一直寫入失敗,讓生產系統不停的嘗試重試,直到滿足上述兩個條件,然后才能認為寫入成功。

按照上述思路去配置相應的參數,才能保證寫入 Kafka 的數據不會丟失。

好!現在咱們來分析一下上面幾點要求。

第一條,必須要求至少一個 Follower 在 ISR 列表里。

那必須的啊,要是 Leader 沒有 Follower 了,或者是 Follower 都沒法及時同步 Leader 數據,那么這個事兒肯定就沒法弄下去了。

第二條,每次寫入數據的時候,要求 Leader 寫入成功以外,至少一個 ISR 里的 Follower 也寫成功。

大家看下面的圖,這個要求就是保證說,每次寫數據,必須是 Leader 和 Follower 都寫成功了,才能算是寫成功,保證一條數據必須有兩個以上的副本。這個時候萬一 Leader 宕機,就可以切換到那個 Follower 上去,那么 Follower 上是有剛寫入的數據的,此時數據就不會丟失了。

98c19af929cbe1f5240f6afa1941d8c0.png

如上圖所示,假如現在 Leader 沒有 Follower 了,或者是剛寫入 Leader,Leader 立馬就宕機,還沒來得及同步給 Follower。在這種情況下,寫入就會失敗,然后你就讓生產者不停的重試,直到 Kafka 恢復正常滿足上述條件,才能繼續寫入。這樣就可以讓寫入 Kafka 的數據不丟失。

總結

最后總結一下,其實 Kafka 的數據丟失問題,涉及到方方面面。譬如生產端的緩存問題,包括消費端的問題,同時 Kafka 自己內部的底層算法和機制也可能導致數據丟失。但是平時寫入數據遇到比較大的一個問題,就是 Leader 切換時可能導致數據丟失。所以本文僅僅是針對這個問題說了一下生產環境解決這個問題的方案。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532073.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532073.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532073.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

不允許輸入特殊字符的正則表達式_JavaScript正則表達式常用技巧

正則表達式是用于匹配字符串中字符組合的模式。在 JavaScript 中,正則表達式也是對象。這些模式被用于 RegExp 的 exec 和 test 方法, 以及 String 的 match、matchAll、replace、search 和 split 方法。正則表達式的掌握程度能粗略地看出程序員的技術底子&#xff…

latex 算法_GitHub項目awesome-latex-drawing新增內容(四):繪制貝葉斯網絡

近期,我們整理和開源了一個基于LaTeX的科技繪圖項目,并將其取名為awesome-latex-drawing(GitHub網址為:https://github.com/xinychen/awesome-latex-drawing),案例包括貝葉斯網絡、圖模型、矩陣/張量示意圖…

python123動物重量排序_python進階

面向對象oopclass Student(object):def __init__(self,name,score)self.name nameself.score scoredef print_score(self)print(%s: %s % (self.name,self.score))給對象發消息實際上就是調用對象對應的關聯函數,我們稱之為對象的方法(Method)。面向對象的程序寫出…

mysql中的生日應該是什么類型_MySQL中的定點數類型

上一篇文章我們嘮叨了浮點數,知道了浮點數存儲小數是不精確的。本篇繼續嘮叨一下MySQL中的另一種存儲小數的方式 —— 定點數。浮點數文章閃現:什么, 0.3 - 0.2 ≠ 0.1 ? 什么鬼定點數類型正因為用浮點數表示小數可能會有不精確的情況,在一些…

python怎么制作圖像_python數字圖像處理(5):圖像的繪制

實際上前面我們就已經用到了圖像的繪制,如:io.imshow(img)這一行代碼的實質是利用matplotlib包對圖片進行繪制,繪制成功后,返回一個matplotlib類型的數據。因此,我們也可以這樣寫:importmatplotlib.pyplot …

axios代理跨域 cli4_vuecli 3.0之跨域請求代理配置及axios路徑配置 莫小龍

vue-cli 3.0之跨域請求代理配置及axios路徑配置問題:在前后端分離的跨域請求中,報跨域問題配置:vue.config.js:module.exports {runtimeCompiler: true,publicPath: /, // 設置打包文件相對路徑devServer: {// open: process.pla…

string轉為char數組_StringBuilder的區別是什么?String是不可變?一點課堂(多岸學院)...

String和StringBuffer、StringBuilder的區別可變性簡單的來說:String 類中使用 final 關鍵字字符數組保存字符串,private final char value[],所以 String 對象是不可變的。而StringBuilder 與 StringBuffer 都繼承自 AbstractStringBuild…

python去年軟件排行_2017年編程語言排行榜,Python位居榜首(C語言需求最大)

最近IEEE Spectrum 發布了編程語言交互式排行榜,為很多學習代碼的朋友們詳解各類代碼語言的需求和占有率。為學習代碼的朋友們能更加重視哪一種編程語言而有一個明確的方向。下面排行榜123網為你公布2017年編程語言排行榜,Python位居榜首(C語言需求最大)。2017年編程…

mysql test數據庫_mysql數據庫test

Re介紹一下CentOS下MySQL數據庫的安裝與配置方法MySQL數據庫配置的具體步驟:1、編輯MySQL的配置文件,使用vi /etc/my.cnf[rootsample ~]# vi /etc/my.cnf  ← 編輯MySQL的配置文件[mysqld]datadir/var/lib/mysqlsocket/var/lib/mysql/mysql.sock# Defau…

mysql 升級 openssl_【1分鐘教程】LNMP架構應用實戰 Openssl升級操作

由于實際生產環境需求,需要將LNMP環境中的openssl版本升級至目前最新版本openssl-1.1.0c,這玩意升級還真的不是一般的麻煩,由于它與系統各種服務都有相關的聯系,比如ssh服務等,因此,升級非常的繁瑣,所以今天…

miui秒解bl鎖_MIUI12解鎖bl篇(原諒我的過失,接上篇文章)

求原諒真心求原諒由于我的疏忽,上期教程不完整,對大家造成不便在這里給大家真誠道歉!對不起!請收下我的膝蓋!!!我的上個教程小米手機MIUI系統降級任意版本通用教程,MIUI12→MIUI9因為…

腐蝕rust服務器命令_【使用 Rust 寫 Parser】2. 解析Redis協議

系列所有文章https://zhuanlan.zhihu.com/p/115017849?zhuanlan.zhihu.comhttps://zhuanlan.zhihu.com/p/139387293?zhuanlan.zhihu.comhttps://zhuanlan.zhihu.com/p/146455601?zhuanlan.zhihu.comhttps://zhuanlan.zhihu.com/p/186217695?zhuanlan.zhihu.com在基本熟悉 n…

python中dic_python之dic {字典}(重要指數*****)

1. 什么是字典{name: 汪峰, age: 18} 鍵:值 別的語言鍵值對數據鍵: 必須是可哈希(不可變的數據類型),并且是唯一的值: 任意可以保存任意類型的數據字典是無序的python3.6版本以上,默認定義了順序,python3.5以下是隨機顯示不能進?切片?作. 它只能通過key來獲取dict中的數據字典…

python裝飾器帶參數函數二階導數公式_一文搞定Python裝飾器,看完面試不再慌

本文始發于個人公眾號:TechFlow,原創不易,求個關注今天是Python專題的第12篇文章,我們來看看Python裝飾器。一段囧事差不多五年前面試的時候,我就領教過它的重要性。那時候我Python剛剛初學乍練,看完了廖雪…

centos7源碼安裝mysql報錯_CentOS7 下源碼安裝MySQL數據庫 8.0.11

本文主要向大家介紹了CentOS7 下源碼安裝MySQL數據庫 8.0.11,通過具體的內容向大家展現,希望對大家學習MySQL數據庫有所幫助。CentOS7 下源碼安裝MySQL 8.0.11系統環境:CentOS7, 內核:Linux 3.10.0-862.el7.x86_64如果…

python全排列問題_Python基于回溯法子集樹模板解決全排列問題示例

本文實例講述了Python基于回溯法子集樹模板解決全排列問題。分享給大家供大家參考,具體如下:問題實現 a, b, c, d 四個元素的全排列。分析這個問題可以直接套用排列樹模板。不過本文使用子集樹模板。分析如下:一個解x就是n個元素的一種排列&a…

file js new 傳到后臺_js 圖片上傳傳給后臺的3種格式

$("#imgfile").change(function () {var formData new FormData();$.each($(#imgfile)[0].files, function (i, file) {formData.set(idcard, file); //idcard 字段 根據自己后端接口定});//processData: false, contentType: false,多用來處理異步上傳二進制文件。…

usbserialcontroller驅動安裝不了_win10-有NVIDIA獨顯提示未安裝控制面板的離線安裝方式...

最近越來越多的用戶反映NVIDIA顯卡驅動設置不了啦,找不到NVIDIA顯卡的控制面板。 也不知道NVIDIA在什么版本開始驅動安裝包就不自帶NVIDIA顯卡控制面板了。 全新安裝的顯卡驅動就沒有控制面板;或者Windows 10自帶更新了顯卡新版驅動后導致沒有。 每次帶N…

mysql 多實例 獨立配置文件_三、安裝配置多實例MYSQL5.6-多獨立配置文件方法

三、安裝配置多實例MYSQL5.6-多獨立配置文件方法1、準備工作檢查操作系統版本、內核版本、selinux是否關閉、防火墻策略、IP地址、主機名配置、host表配置、yum配置上傳cmake、mysql5.6軟件包具體步驟參考源碼安裝mysql-單實例配置文檔2、安裝cmake軟件2.1 安裝編譯軟件環境[[e…

python做什么模型_主題模型初學者指南[Python]

引言近年來涌現出越來越多的非結構化數據,我們很難直接利用傳統的分析方法從這些數據中獲得信息。但是新技術的出現使得我們可以從這些輕易地解析非結構化數據,并提取出重要信息。主題模型是處理非結構化數據的一種常用方法,從名字中就可以看…