Kafka~特殊技術細節設計:分區機制、重平衡機制、Leader選舉機制、高水位HW機制

分區機制

Kafka 的分區機制是其實現高吞吐和可擴展性的重要特性之一。

Kafka 中的數據具有三層結構,即主題(topic)-> 分區(partition)-> 消息(message)。一個 Kafka 主題可以包含多個分區,而每個分區又可以包含多條消息。

Topic和Partition是kafka中比較重要的概念。

  • 主題:Topic是Kafka中承載消息的邏輯容器。可以理解為一個消息隊列。生產者將消息發送到特定的Topic,消費者從Topic中讀取消息。Topic可以被認為是邏輯上的消息流。在實際使用中多用來區分具體的業務。
  • 分區:Partition。是Topic的物理分區。一個Topic可以被分成多個Partition,每個Partition是一個有序且持久化存儲的日志文件。每個Partition都存儲了一部分消息,并且有一個唯一的標識符(稱為Partition ID)。

好處:

  1. 提升吞吐量:通過將一個Topic分成多個Partition,可以實現消息息的并行處理。每個Partition可以由不同的消費者組進行獨立消費,這樣就可以提高整個系統的吞吐量。
  2. 負載均衡:Partition的數量通常比消費者組的數量多,這樣可以使每個消費者組中的消費者均勻地消費消息。當有新的消費者加入或離開消費者組時,可以通過重新分配Partition的方式進行負載均衡。
  3. 擴展性:通過增加Partition的數量,可以實現Kafka集群的廣展性。更多的Partition可以提供更高的并發處理能力和更大的存儲容量。

重平衡機制

Kafka的重平衡機制是指在消費者組中新增或刪除消費者時,Kafka集群會重新分配主題分區給各個消費者,以保證每個消費者消費的分區數量盡可能均衡。

重平衡機制的目的是實現消費者的負載均衡和高可用性,以確保每個消費者都能夠按照預期的方式消費到消息。
在這里插入圖片描述
重平衡的3個觸發條件:

  1. 消費者組成員數量發生變化。
  2. 消費者組成員訂閱主題數量發生變化。
  3. 訂閱主題的分區數發生變化。

平衡機制步驟:

  1. 暫停消費:在重平衡開始之前,Kafka會暫停所有消費者的拉取操作,以確保不會出現重平衡期間的消息丟失或重復消費。
  2. 計算分區分配方案:kafka集群會根據當前消費者組的消費者數量和主題分區數量,計算出每個消費者應該分配的分區列表,以實現分區的負載均衡。
  3. 通知消費者:一旦分區分配方案確定,Kafka集群會將分配方案發送給每個消費者,告訴它們需要消費的分區列表,并請求它們重新加入消費者組。
  4. 重新分配分區:在消費者重新加入消費者組后,Kafka集群會將分區分配方案應用到實際的分區分配中,重新分配主題分區給各個消費者。
  5. 恢復消費:最后,Kafka會恢復所有消費者的拉取操作,允許它們消費分配給自己的分區。

Kafka的重平衡機制能夠有效地實現消費者的負載均衡和高可用性,提高消息的處理能力和可靠性。但是,由于重平衡會帶來一定的性能開銷和不確定性,例如:消息亂序、重復消費等問題,因此在設計應用時需要考慮到重平衡的影響,并采取一些措施來降低重平衡的頻率和影響。

在重平衡過程中,所有Consumer實例都會停止消費。等待重平衡完成。但是目前并沒有什么好的辦法來解決重平衡帶來的STW,只能盡量避免它的發生。

Consumer實例五種狀態

  • Empty:組內沒有任何成員,但是消費者可能存在已提交的位移數據,而且這些位移尚未過期。
  • Dead:同樣是組內沒有任何成員,但是組的元數據信息已經被協調者端移除,協調者保存著當前向他注冊過的所有組信息。
  • Preparing Rebalance:費者組準備開啟重平衡,此時所有成員都需要重新加入消肖費者組
  • Completing Rebalance:消費者組下所有成員已經加入,各個成員中等待分配方案
  • Stable:消費者組的穩定狀態,該狀態表明重平衡已經完成,組內成員能夠正常消費數據

Leader選舉機制

Partition Leader 選舉

Kafka中的每個Partition都有一個Leader,負責處理該Parttition的讀寫請求。在正常情況下。Leader和ISR集合中的所有副本保持同步,Leader接收到的消息也會被ISF集合中的副本所接收。當leader副本宕機或者無法正常工作時,需要選舉新的leader副本來接管分區的工作。

Leader選舉的過程如下:

  1. 每個參與選舉的副本會嘗試向ZooKeeper上寫入一個臨時節點,表示它們正在參與Leader選舉
  2. 所有寫入成功的副本會在ZooKeeper上創建一個序列號節點,并將自己的節點序列號寫入該節點
  3. 節點序列號最小的副本會被選為新的Leader,并將自己的節點名稱寫入ZooKeeper上的/broker/…/leader節點中。

Controller選舉

Kafka集群中只能有一個Controller節點,用于管理分區的副本分配、leader選舉等任務。當一個Broker變成Controller后,會在Zookeeper的/controller節點中記錄下來。然后其他的Broker會實時監聽這個節點,主要就是避免當這個controller宕機的話,就需要進行重新選舉。

Controller選舉的過程如下:

  1. 所有可用的Broker向ZooKeeper注冊自己的ID。并監聽Zookeeper中/controller節點的變化。
  2. 當Controller節點出現故障時,ZooKeeper會刪除/controller節點,這時所有的Broker都會監聽到該事件,并開始爭奪Controller的位置。為了避免出現多個Broker同時競選Controller的情況,Kafka設計了一種基于ZooKeeper的Master-Slave機制,其中一個Broker成為Master,其它Broker成為為Slave。Master負責選舉Controller,并將選舉結果寫入ZooKeeper中,而Slave則監聽/controller節點的變化,一旦發現Master發生故障,則開始爭奪Master的位置。
  3. 當一個Broker發現Controller失效時,它會向ZooKeeper寫入自自己的ID,并嘗試競選Controller的位置。如果他創建臨時節點成功,則該Broker成為新的Controller,并將選舉結果寫入ZooKeeper中。
  4. 其它的Broker會監聽到ZooKeeper中/controller節點的變化,一旦發現選舉結果發生變化,則更新自己的元數據信息,然后與新的Controller建立連接,進行后續的操作。

高水位HW機制

高水位(HW,HighWatermark)是Kafka中的一個重要的概念,主要是用于管理消費者的進度和保證數據的可靠性的。

高水位標識了一個特定的消息偏移量(offset),即一個分區中已提交(這里的已提交指的是ISR中的所有副本都記錄了這條消息)消息的最高偏移量(offset)消費者只能拉取到這個offset之前的消息。消費者可以通過跟蹤高水位來確定自己消費的位置。

在Kafka中,HW主要有兩個作用:

  1. 消費進度管理:消費者可以通過記錄上一次消費的偏移量,然后將其與分區的高水位進行比較,來確定自己的消費進度。消費者可以在和高水位對比之后繼續消費新的消息,確保不會錯過任何已提交的消息。這樣,消費者可以按照自己的節奏進行消費,不受其他消費者的響。
  2. 數據的可靠性:高水位還用于確保數據的可靠性。在Kafka中,只有消息被寫入主副本(Leader Replica)并被所有的同步副本(In-Sync Replicas,ISR)確認后,才被認為是是已提交的消息。高水位表示已經被提交的消息的邊界。只有高水位之前的消息才能被認為是已經被確認的,其他的消息可能會因為副本故障或其他原因而丟失。當消費者消費消息,可以使用高水位作為參考點,只消費高水位之前的消息,以確保消費的是已經被確認的消息,從而保證數據的可靠性。
    在這里插入圖片描述

還有一個概念,叫做LEO,即LogEnd Offset,,他是日志最后消息的偏移量。它標識當前日志文件中下一條待寫入消息的offset

它有以下特點和作用:

  • 用于表示副本寫入下一條消息的位置。
  • 每個副本(包括 leader 副本和 follower 副本)都有自己的 LEO。
  • LEO 的值會隨著消息的寫入而增加,每當有新消息寫入底層日志成功時,相應副本的 LEO 就會加 1。
  • LEO 主要用于跟蹤副本的同步進度。

需要注意的是,在 0.11.0.0 版本之前,HW 的更新可能存在一些問題,例如在特定情況下可能導致消息丟失。0.11.0.0 及之后的版本使用 leader epoch,與 HW 值結合,從而更好地保證了數據的一致性和順序性

  • 每個分區都有一個初始的LeaderEpoch,通常為0。
  • 當Leader副本發生故障或需要進行切換時,Kafka會觸發副本切換過程。
  • 副本切換過程中,Kafka會從ISR(In-Sync Replicas,同步副本)中選擇一個新的Follower副本作為新的Leader副本。
  • 新的Leader副本會增加自己的Leader Epoch,使其大于之前的Leader Epoch。這表示進入了一個新的任期。
  • 新的Leader副本會驗證舊Leader副本的狀態以確保數據的一致性。它會檢查舊Leader副本的Leader Epoch和高水位。
  • 如果舊Leader副本的Leader Epoch小于等于新Leader副本的Leadder Epoch,并且舊Leader副本的高水位小于等于新Leader副本的高水位,則驗證通過。
  • 一旦驗證通過,新的Leader副本會開始從ISR中的一部分副本中尋找最大的LEO副本進行復制數據,以確保新Leader上的數據與舊Leader-致
  • 一旦新的Leader副本復制了舊Leader副本的所有數據,并達到了與舊Leader副本相同的高水位,副本切換過程就完成了。

通過使用Leader Epoch、高水位、LEO的驗證,Kafka可以避免新的Leader副本接受舊Leader副本之后的消息,從而避免數據回滾和丟失。Leader Epoch 為 Kafka 提供了一種更可靠和一致的副本管理機制,確保了在 Leader 副本切換等情況下數據的完整性和正確性。

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

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

相關文章

3-linux命令行與基本命令

目錄 什么是shell linux命令 命令組成 幾個簡單的命令 linux文件系統導航 什么是shell linux學習路徑:學習shell→配置和環境→見任務和主要工具→編寫shell腳本 shell是一個接收由鍵盤輸入的命令,并將其傳遞給操作系統來執行的程序。幾乎所有…

C++學習全教程(Day2)

一、數組 在程序中為了處理方便,常常需要把具有相同類型的數據對象按有序的形式排列起來,形成“一組”數據,這就是“數組”(array) 數組中的數據,在內存中是連續存放的,每個元素占據相同大小的空間,就像排…

【Spring】DAO 和 Repository 的區別

DAO 和 Repository 的區別 1.概述2.DAO 模式2.1 User2.2 UserDao2.3 UserDaoImpl 3.Repository 模式3.1 UserRepository3.2 UserRepositoryImpl 4.具有多個 DAO 的 Repository 模式4.1 Tweet4.2 TweetDao 和 TweetDaoImpl4.3 增強 User 域4.4 UserRepositoryImpl 5.比較兩種模式…

ISO 19110操作要求類中的/req/operation/formal-definition詳細解釋

/req/operation/formal-definition 要求: 每個要素操作實體必須具有一個形式定義(formal definition),該定義應明確描述操作的行為和影響。 具體解釋 定義 要素操作實體(feature operation entity):這…

深度學習基準模型Mamba

深度學習基準模型Mamba Mamba(英文直譯:眼鏡蛇)具有選擇性狀態空間的線性時間序列建模,是一種先進的狀態空間模型 (SSM),專為高效處理復雜的數據密集型序列而設計。 Mamba是一種深度學習基準模型,專為處理長序列數據而設計&…

【鴻蒙學習筆記】位置設置

官方文檔:位置設置 目錄標題 align:子元素的對齊方式direction:官方文檔沒懂,看圖理解吧 align:子元素的對齊方式 Stack() {Text(TopStart)}.width(90%).height(50).backgroundColor(0xFFE4C4).align(Alignment.TopS…

<Python><ffmpeg>基于python使用PyQt5構建GUI實例:音頻格式轉換程序(MP3/aac/wma/flac)(優化版2)

前言 本文是基于python語言使用pyqt5來構建的GUI,功能是使用ffmpeg來對音頻文件進行格式轉換,如mp3、aac、wma、flac等音樂格式。 UI示例: 環境配置 系統:windows 平臺:visual studio code 語言:python 庫:pyqt5、ffmpeg 概述 本文是建立在之前的博文的基礎上的優化版…

在線教育項目(一):如何防止一個賬號多個地方登陸

使用jwt做驗證,使用賬號作為redis中的key,登錄的時候生成token放到redis中,每次申請資源的時候去看token 有沒有變,因為token每次登錄都會去覆蓋,只要第二次登錄token就不一樣了

Day7:.翻轉字符串里的單詞 151 卡碼網:55.右旋轉字符串

題目 151. 反轉字符串中的單詞 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:// 移除多余空格void moveSpace(string& s) {// 定義快慢指針int slow 0;int fast 0;// 刪除前導空格while (s.size() > 0 && fast < s.size() &&…

【算法——雙指針前綴和】

例題&#xff1a; 奇偶排序數組&#xff08;與下標對應&#xff09; 奇數偶數個數相等 922. 按奇偶排序數組 II #include<iostream> #include<vector> #include<algorithm> using namespace std;int main() {vector<int>nums { 4,2,5,7 };//指針x…

==和equals的區別(面試題)

和equals有什么區別 對于基本數據類型&#xff0c;比較的是值是否相等&#xff0c;對于引用類型則是比較的地址是否相等&#xff1b;對于equals來說&#xff0c;基本數據類型沒有equals方法&#xff0c;對于引用類型equals比較的是引用對象是否相同 那針對以上結論&#xff0c…

西點領導力:卓越是怎樣練成的

今天剛看了一個美國西點軍校第50任校長&#xff1a;羅伯克卡斯倫的《為什么跟西點軍校學領導力培養》這個演講。從中受益良多&#xff0c;于是我就去了解了一下這位校長以及西點軍校。 西點軍校 西點軍校&#xff08;United States Military Academy, USMA&#xff09;&#…

Android常用加解密算法總結

Android開發中對于數據的傳輸和保存一定會使用加密技術&#xff0c;加密算法是最普遍的安保手段&#xff0c;多數情況數據加密后在需要使用源數據時需要再進行解密&#xff0c;但凡是都有例外。下面從可逆加密、不可逆、不純粹加密三種方式記錄一下常見的加解密算法。 加密技術…

【使用sudo apt-get出現報錯】——無法獲得鎖 /var/lib/dpkg/lock-open(11:資 源暫時不可用) ,是否有其他進程正占用它?

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、ubuntu中進程正在被占用1. 問題描述2. 原因分析3. 解決 總結 前言 一、ubuntu中進程正在被占用 1. 問題描述 在Ubuntu中&#xff0c;使用終端時輸入帶有…

C++函數不完整聲明報錯

擋在c中聲明如下的函數代碼段時&#xff0c;不會進行隱式的轉換。 double add(); int main(){double s add(1,2);return 0; } double add(double a,double b){return ab; } 在調用add時&#xff0c;main中為它提供了兩個參數&#xff0c;看起來可以被轉換成double類型。然而…

昇思25天學習打卡營第7天之二 | 模型保存與加載

1. 保存與加載 在訓練網絡模型的過程中&#xff0c;實際上我們希望保存中間和最后的結果&#xff0c;用于微調&#xff08;fine-tune&#xff09;和后續的模型推理與部署&#xff0c;本章節我們將介紹如何保存與加載模型。 1.1 導入依賴 # 導入numpy庫&#xff0c;并將其重命…

六月,允許自己做自己,別人做別人

今天結束后&#xff0c;2024 就過去一半了。 年初的規劃完成一半了嗎&#xff1f;如果沒有也沒關系&#xff0c;做你自己繼續前進。 家人來北京旅游&#xff0c;我累趴了 六月初&#xff0c;我搬家了&#xff0c;這次租了一整套房&#xff0c;是一個小倆居、還帶一個小閣樓。…

速盾:視頻cdn和網站cdn的相同點與不同點

CDN&#xff08;Content Delivery Network&#xff09;是一種分布式網絡架構&#xff0c;旨在為用戶提供高效、高質量的內容傳送服務。CDN主要通過將內容分發到全球各地的邊緣節點&#xff0c;并根據用戶的地理位置選擇最近的節點來提供內容&#xff0c;從而加速內容的傳輸并降…

【高考志愿】儀器科學與技術

目錄 一、專業介紹 1.1 專業概述 1.2 專業方向 1.3 主要課程 二、專業技能與素質培養 三、就業前景 四、個人發展規劃建議 五、儀器科學與技術專業排名 六、總結 一、專業介紹 1.1 專業概述 儀器科學與技術專業是一門綜合性極強的學科&#xff0c;它融合了測量、控制…

數學學習與研究雜志社《數學學習與研究》雜志社2024年第6期目錄

課改前沿 基于核心素養的高中數學課堂教學研究——以“直線與圓、圓與圓的位置關系”為例 張亞紅; 2-4 核心素養視角下初中生數學閱讀能力的培養策略探究 賈象虎; 5-7 初中數學大單元教學實踐策略探索 耿忠義; 8-10《數學學習與研究》投稿&#xff1a;cn7kantougao…