Kafka的存儲機制以及可靠性

来源:https://www.cnblogs.com/linjunwei2017/archive/2018/07/20/9342213.html
-Advertisement-
Play Games

Kafka的存儲機制以及可靠性 一、kafka的存儲機制 1、segment 1..log 2..index 3.命名規則 2、讀取數據 二、可靠性保證 1、AR 1.ISR 2.OSR 3.LEO 4.HW 5.HW截斷機制 2、生產者可靠性級別 3、leader選舉 4、kafka可靠性的保證 ...


Kafka的存儲機制以及可靠性

一、kafka的存儲機制

kafka通過topic來分主題存放數據,主題內有分區,分區可以有多個副本,分區的內部還細分為若幹個segment。

所謂的分區其實就是在kafka對應存儲目錄下創建的文件夾,文件夾的名字是主題名加上分區編號,編號從0開始。

1、segment

所謂的segment其實就是在分區對應的文件夾下產生的文件。

一個分區會被劃分成大小相等的若幹segment,這樣一方面保證了分區的數據被劃分到多個文件中保證不會產生體積過大的文件;另一方面可以基於這些segment文件進行歷史數據的刪除,提高效率。

一個segment又由一個.log和一個.index文件組成。

1..log

.log文件為數據文件用來存放數據分段數據。

2..index

.index為索引文件保存對對應的.log文件的索引信息。

在.index文件中,保存了對對應.log文件的索引信息,通過查找.index文件可以獲知每個存儲在當前segment中的offset在.log文件中的開始位置,而每條日誌有其固定格式,保存了包括offset編號、日誌長度、key的長度等相關信息,通過這個固定格式中的數據可以確定出當前offset的結束位置,從而對數據進行讀取。

3.命名規則

這兩個文件的命名規則為:

partition全局的第一個segment從0開始,後續每個segment文件名為上一個segment文件最後一條消息的offset值,數值大小為64位,20位數字字元長度,沒有數字用0填充。

2、讀取數據

開始讀取指定分區中某個offset對應的數據時,先根據offset和當前分區的所有segment的名稱做比較,確定出數據在哪個segment中,再查找該segment的索引文件,確定當前offset在數據文件中的開始位置,最後從該位置開始讀取數據文件,在根據數據格式判斷結果,獲取完整數據。

二、可靠性保證

1、AR

在Kafka中維護了一個AR列表,包括所有的分區的副本。AR又分為ISR和OSR。

AR = ISR + OSR。

AR、ISR、OSR、LEO、HW這些信息都被保存在Zookeeper中。

1.ISR

ISR中的副本都要同步leader中的數據,只有都同步完成了數據才認為是成功提交了,成功提交之後才能供外界訪問。

在這個同步的過程中,數據即使已經寫入也不能被外界訪問,這個過程是通過LEO-HW機制來實現的。

2.OSR

OSR內的副本是否同步了leader的數據,不影響數據的提交,OSR內的follower儘力的去同步leader,可能數據版本會落後。

最開始所有的副本都在ISR中,在kafka工作的過程中,如果某個副本同步速度慢於replica.lag.time.max.ms指定的閾值,則被踢出ISR存入OSR,如果後續速度恢復可以回到ISR中。

3.LEO

LogEndOffset:分區的最新的數據的offset,當數據寫入leader後,LEO就立即執行該最新數據。相當於最新數據標識位。

4.HW

HighWatermark:只有寫入的數據被同步到所有的ISR中的副本後,數據才認為已提交,HW更新到該位置,HW之前的數據才可以被消費者訪問,保證沒有同步完成的數據不會被消費者訪問到。相當於所有副本同步數據標識位。

在leader宕機後,只能從ISR列表中選取新的leader,無論ISR中哪個副本被選為新的leader,它都知道HW之前的數據,可以保證在切換了leader後,消費者可以繼續看到HW之前已經提交的數據。

所以LEO代表已經寫入的最新數據位置,而HW表示已經同步完成的數據,只有HW之前的數據才能被外界訪問。

5.HW截斷機制

如果leader宕機,選出了新的leader,而新的leader並不能保證已經完全同步了之前leader的所有數據,只能保證HW之前的數據是同步過的,此時所有的follower都要將數據截斷到HW的位置,再和新的leader同步數據,來保證數據一致。

當宕機的leader恢復,發現新的leader中的數據和自己持有的數據不一致,此時宕機的leader會將自己的數據截斷到宕機之前的hw位置,然後同步新leader的數據。宕機的leader活過來也像follower一樣同步數據,來保證數據的一致性。

2、生產者可靠性級別

通過以上的講解,已經可以保證kafka集群內部的可靠性,但是在生產者向kafka集群發送時,數據經過網路傳輸,也是不可靠的,可能因為網路延遲、閃斷等原因造成數據的丟失。

kafka為生產者提供瞭如下的三種可靠性級別,通過不同策略保證不同的可靠性保障。

其實此策略配置的就是leader將成功接收消息信息響應給客戶端的時機。

通過request.required.acks參數配置:

1:生產者發送數據給leader,leader收到數據後發送成功信息,生產者收到後認為發送數據成功,如果一直收不到成功消息,則生產者認為發送數據失敗會自動重發數據。

當leader宕機時,可能丟失數據。

0:生產者不停向leader發送數據,而不需要leader反饋成功消息。

這種模式效率最高,可靠性最低。可能在發送過程中丟失數據,也可能在leader宕機時丟失數據。

-1:生產者發送數據給leader,leader收到數據後要等到ISR列表中的所有副本都同步數據完成後,才向生產者發送成功消息,如果一隻收不到成功消息,則認為發送數據失敗會自動重發數據。

這種模式下可靠性很高,但是當ISR列表中只剩下leader時,當leader宕機讓然有可能丟數據。

此時可以配置min.insync.replicas指定要求觀察ISR中至少要有指定數量的副本,預設該值為1,需要改為大於等於2的值

這樣當生產者發送數據給leader但是發現ISR中只有leader自己時,會收到異常表明數據寫入失敗,此時無法寫入數據,保證了數據絕對不丟。

雖然不丟但是可能會產生冗餘數據,例如生產者發送數據給leader,leader同步數據給ISR中的follower,同步到一半leader宕機,此時選出新的leader,可能具有部分此次提交的數據,而生產者收到失敗消息重發數據,新的leader接受數據則數據重覆了。

3、leader選舉

當leader宕機時會選擇ISR中的一個follower成為新的leader,如果ISR中的所有副本都宕機,怎麼辦?

有如下配置可以解決此問題:

unclean.leader.election.enable=false

策略1:必須等待ISR列表中的副本活過來才選擇其成為leader繼續工作。

unclean.leader.election.enable=true

策略2:選擇任何一個活過來的副本,成為leader繼續工作,此follower可能不在ISR中。

策略1,可靠性有保證,但是可用性低,只有最後掛了leader活過來kafka才能恢復。

策略2,可用性高,可靠性沒有保證,任何一個副本活過來就可以繼續工作,但是有可能存在數據不一致的情況。

4、kafka可靠性的保證

At most once:消息可能會丟,但絕不會重覆傳輸。

At least once:消息絕不會丟,但可能會重覆傳輸。

Exactly once:每條消息肯定會被傳輸一次且僅傳輸一次。

kafka最多保證At least once,可以保證不丟,但是可能會重覆,為瞭解決重覆需要引入唯一標識和去重機制,kafka提供了GUID實現了唯一標識,但是並沒有提供自帶的去重機制,需要開發人員基於業務規則自己去重。

推薦閱讀:https://www.roncoo.com/course/view/a398edee6308413f904f9c82b1dfc122

文章來源:https://my.oschina.net/u/3754001/blog/1805161


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • /:根目錄,一般只存放目錄,不存放文件 /bin -> /usr/bin:可執行二進位文件的目錄,也是常用命令目錄,如常用的命令ls,cat,mv 等 /boot:該目錄中存放系統的內核文件,系統引導時使用的各種文件 /dev:設備(device)文件目錄,存放linux系統下的設備文件,訪問該目錄 ...
  • 1.目錄結構 /bin 二進位文件 命令 /sbin 超級命令 只有root用戶可以使用 /boot 引導文件 系統內核 /dev 設備文件 光碟 硬碟分區 /ect 系統配置文件 /home 普通用戶的家目錄 /root 用戶的家目錄 /lib lib庫文件 /lib64 lib庫文件 /lost ...
  • 1、首先安裝VMware tools。 2、然後根據這篇經驗操作 https://jingyan.baidu.com/article/7c6fb42828806480652c9062.html 3、在此網址中下載usb驅動,https://downloadcenter.intel.com/downl ...
  • 1.用戶部分 1.1 創建新用戶 1.2 設置密碼 切換用戶 2.sed命令替換 涉及命令find+sed 要求 將oldboy目錄下的已.sh結尾的文件里的 oldboy全部替換為oldgirl 2.1 創建環境 2.2 使用find查找 2.3 嘗試替換一個文件的內容 2.4 替換所有的內容 3 ...
  • 占座 ...
  • 1 通過handler_read 查看索引使用情況 如果索引經常被用到 那麼handler_read_key的值將很高,這個值代表了一個行被索引值讀的次數, 很低的值表明增加索引得到的性能改善不高,索引並不經常使用。 handler_read_rnd_next 的值高 則意味著查詢運行低效,應該建立 ...
  • 資源列表: 關係資料庫管理系統(RDBMS) 框架 分散式編程 分散式文件系統 文件數據模型 Key -Map 數據模型 鍵-值數據模型 圖形數據模型 NewSQL資料庫 列式資料庫 時間序列資料庫 類SQL處理 數據攝取 服務編程 調度 機器學習 基準測試 安全性 系統部署 應用程式 搜索引擎與框 ...
  • 轉自:http://www.maomao365.com/?p=4390 一、coalesce函數簡介coalesce 系統函數,比ISNULL更強大,更方便的系統函數,coalesce可以接收多個參數,返回最左邊不為NULL的參數,當所有參數都為空時,則返回NULLcoalesce是最優isnull ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...