【Kafka系列】第二篇| Kafka 的核心概念、架構設計、底層原理

在大數據和分布式系統飛速發展的今天,消息隊列作為高效的通信工具,在系統解耦、異步通信、流量削峰等方面作用顯著。

而 Kafka 這款高性能、高吞吐量的分布式消息隊列,在日志收集、數據傳輸、實時計算等場景中應用廣泛。

接下來,我就帶大家深入了解 Kafka 的概念、架構設計和底層原理。

一、Kafka 的核心概念

Kafka 是 Apache 軟件基金會開發的開源流處理平臺,本質上是個分布式、分區化、多副本的日志提交服務。簡單說,它就像個大消息容器,能接收多個生產者的消息,再分發給多個消費者。

下面這幾個核心概念得搞清楚:

  • 生產者(Producer):負責把消息發送到 Kafka 集群,還能按策略將消息發到指定分區,實現負載均衡或按業務分類存儲。

  • 消費者(Consumer):從 Kafka 集群讀取消息,可組成消費者組一起消費某個主題的消息,提高處理效率。

  • 主題(Topic):消息的分類標識,生產者往特定主題發消息,消費者從特定主題讀消息,相當于消息的集合。

  • 分區(Partition):為提升吞吐量和并行處理能力,一個主題可分成多個分區。每個分區是有序且不可變的消息序列,消息按發送順序存儲。

  • 副本(Replica):為保證數據可靠,每個分區可有多個副本。一個是領導者(Leader),處理生產者和消費者的請求;其他是追隨者(Follower),通過復制領導者數據保持同步,領導者故障后,追隨者會被選為新領導者。

  • Broker:Kafka 集群的服務器節點,每個 Broker 存儲部分主題的分區和副本,它們相互通信協調,維持集群穩定運行。

二、Kafka 的架構設計

Kafka 采用分布式架構,由生產者、消費者、主題、分區、副本和 Broker 等組件構成,各組件協同工作,實現高效消息傳遞。

(一)整體架構

Kafka 集群由多個 Broker 組成,每個都有唯一標識。主題分成多個分區,分布在不同 Broker 上,每個分區有多個副本,一個是領導者,其余是追隨者。生產者把消息發到指定主題的分區領導者,追隨者復制領導者數據保持一致。消費者從分區領導者讀消息,還能組成消費者組,組內消費者分別消費不同分區消息,實現并行處理。ZooKeeper 和各個 Broker 通信,管理集群元數據。
在這里插入圖片描述

(二)ZooKeeper 在傳統架構中的作用

早期 Kafka 架構里,ZooKeeper 作用關鍵:

  1. 元數據存儲:存著集群的各類元數據,像 Topic 的分區數量、副本分布,Broker 的 IP、端口等。不過從 Kafka 0.9.0.0 版本起,消費者組的偏移量就存在 Kafka 內部的__consumer_offsets 主題,不再存在 ZooKeeper 了。這些元數據很重要,生產者、消費者和 Broker 都要經常讀,來決定消息發往哪個分區、從哪開始消費等。

  2. 控制器選舉:集群的 Controller 負責分區創建、刪除、副本分配遷移等操作。它的選舉靠 ZooKeeper 的臨時節點和 Watcher 機制。所有 Broker 都嘗試在 ZooKeeper 創建特定臨時節點,第一個成功的就是 Controller。其他 Broker 監聽這個節點,一旦當前 Controller 所在 Broker 故障,節點消失,其他 Broker 就重新競爭,選出新 Controller。

  3. 服務發現與集群拓撲管理:新加入的 Broker 能通過 ZooKeeper 快速找到其他節點并注冊。ZooKeeper 還監控 Broker 狀態,上線或下線時及時更新信息,通過 Watcher 機制通知其他組件,讓它們調整狀態。比如某個 Broker 下線,ZooKeeper 告訴 Controller,Controller 就重新分配該 Broker 上的分區副本。

(三)核心組件的作用

  1. 生產者:按分區策略把消息發到對應分區領導者,策略可以是哈希、輪詢或自定義的。還能配置消息確認機制,確保消息可靠發送。

  2. 消費者與消費者組:消費者訂閱主題獲取消息,組內每個消費者消費一個或多個分區,且每個分區只被組內一個消費者消費,避免重復消費。消費者通過提交偏移量記錄消費位置,重啟或重新加入組時,能從上次位置繼續消費。

  3. 主題與分區:主題是消息的邏輯分類,分區是物理存儲單元。有了分區,Kafka 能并行讀寫,提高吞吐量。每個分區的消息都有唯一偏移量,標識其位置。

  4. 副本機制:這是保證數據可靠的關鍵。分區副本分布在不同 Broker,領導者故障后,從追隨者中選新領導者。追隨者定期復制領導者消息,保持數據一致。

  5. Broker:負責存儲分區和副本,處理生產者和消費者的請求。傳統模式下,Broker 之間靠 ZooKeeper 協調,ZooKeeper 管理著主題分區、副本分布等元數據。

(四)Kafka 對 ZooKeeper 的依賴移除與 KRaft 模式

隨著 Kafka 的廣泛應用,ZooKeeper 的問題逐漸顯現。運維 ZooKeeper 集群復雜,要額外投入資源,而且它和 Kafka 運維方式不同,對運維人員要求高。大規模集群中,ZooKeeper 處理大量元數據操作可能出現性能瓶頸,影響整個集群。

為解決這些問題,從 Kafka 2.8.0 版本開始,引入了 KRaft(Kafka Raft)模式,逐步移除對 ZooKeeper 的依賴,實現自管理元數據共識。KRaft 用新的仲裁控制器服務取代依賴 ZooKeeper 的控制器,采用基于事件的 Raft 共識協議變體達成元數據一致。

  1. 架構變化:KRaft 模式下,集群不依賴外部 ZooKeeper,引入專門的 Controller 節點(通過process.roles配置角色)。這些節點靠 Raft 協議組成仲裁集合,管理元數據。元數據存在 Kafka 內部的__cluster_metadata主題,通過 Raft 協議在 Controller 節點間復制,保證一致性和高可用性。

  2. Controller 選舉機制:傳統模式靠 ZooKeeper 的臨時節點和競爭創建機制選舉 Controller。KRaft 模式下,配置為controller角色的節點參與 Raft 選舉。候選節點等隨機時間后發起選舉,獲超過半數投票的成為主 Controller,處理元數據寫入和同步,其他節點作為追隨者同步日志。這種方式更直接高效,減少了外部依賴帶來的復雜和故障點。

  3. 對集群的影響:用了 KRaft 模式,不用單獨部署管理 ZooKeeper 集群,簡化運維,降低成本。元數據管理集成在 Kafka 內部,避免了和 ZooKeeper 頻繁交互的性能瓶頸,處理大規模元數據操作時性能提升,分區創建、刪除等操作響應更快,集群擴展性也更好。到 Kafka 4.0 版本,KRaft 模式成為默認設置,標志著 Kafka 在擺脫 ZooKeeper 依賴上邁出重要一步。

三、Kafka 的底層原理

(一)消息存儲原理

Kafka 的消息以日志文件存在 Broker 磁盤上。每個分區對應一個目錄,里面有多個日志段(Log Segment)文件,由數據文件(.log)和索引文件(.index)組成,分別用于存儲消息和快速定位消息。

生產者發消息到分區,會追加到當前活躍的日志段文件末尾。當文件達到一定大小,就創建新的日志段文件。這種分段存儲方便消息查找和過期消息刪除。

(二)消息傳遞機制

Kafka 用推拉結合的方式傳遞消息。生產者主動把消息推到分區領導者,消費者主動從分區領導者拉取消息。這樣能根據消費者處理能力調整拉取速度,避免消息積壓。

傳遞過程中,還用了批量發送和壓縮技術提高效率。生產者把多個消息打包發送,減少網絡傳輸次數;壓縮消息能減小大小,降低帶寬消耗。

(三)副本同步機制

Kafka 的副本同步用 ISR(In-Sync Replicas)機制,ISR 是和領導者保持同步的追隨者集合。判斷追隨者是否在 ISR 中,主要看是否在規定時間(replica.lag.time.max.ms)內和領導者通信,以及消息偏移量差距是否在規定范圍(新版本更多看時間)。不符合就會被移出 ISR,只有 ISR 中的副本能被選為新領導者,保證數據最新。

生產者發消息到領導者后,領導者寫入本地日志,等待 ISR 中的追隨者復制成功。達到一定數量(通過 acks 參數配置,比如 acks=all 要求所有 ISR 中的追隨者都復制成功)后,領導者才向生產者確認消息發送成功。這種機制在保證可靠性的同時,也提高了效率。

(四)消費者組重平衡機制

當消費者組的消費者數量變化,或者主題分區數量變化時,Kafka 會觸發重平衡(Rebalance),重新分配消費者和分區的對應關系,確保每個分區都有消費者消費。

重平衡時,消費者組會暫停消費,直到完成。為減少影響,Kafka 引入消費者組協調器(Coordinator)管理這個過程,還優化算法縮短時間。協調器收集組內消費者信息,按范圍分配、輪詢分配等策略把分區分給消費者。

總的來說,Kafka 憑借合理的架構設計和底層原理,實現了高性能、高吞吐量、高可靠性的消息傳遞。深入理解這些,對用好和優化 Kafka 很有幫助。

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

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

相關文章

Kafka-exporter采集參數調整方案

#作者:張桐瑞 文章目錄1 問題概述2 修改方案2.1修改參數2.2配置示例3 消費者組均分腳本3.1使用說明3.2腳本內容3.3實現原理說明4 KAFKA-EXPORTER流程代碼4.1KAFKA-EXPORTER拉取數據流程1 問題概述 由于kafka-exporter獲取kafka指標時間過長,無法通過cur…

AT32的freertos下modbus TCP移植

1.準備模板 打開雅特力官網,也就是帶有LwIP的示例。 下載官方源碼:modbus 2.移植 我這里是在這里新建兩個文件夾,分別是modbus與port,這個任意,只需要將必要的文件加入項目即可。 將源碼中的modbus這些都移植過來&a…

Redis面試精講 Day 16:Redis性能監控與分析工具

【Redis面試精講 Day 16】Redis性能監控與分析工具 開篇 歡迎來到"Redis面試精講"系列第16天,今天我們將深入探討Redis性能監控與分析工具。在大型分布式系統中,Redis作為關鍵的數據存儲和緩存組件,其性能指標直接影響整個系統的…

vue3+vue-flow制作簡單可拖拽可增刪改流程圖

實現效果實現代碼 準備工作 安裝依賴 npm install vue-flow/core npm install vue-flow/minimap //小地圖 npm install vue-flow/controls //自帶的縮放、居中、加鎖功能我這里只用到上述三個,還有其余的可根據實際情況配合官方文檔使用。 npm install vue-flow/bac…

itextPdf獲取pdf文件寬高不準確

正常情況下我們通過下面方式獲取寬高PdfReader reader new PdfReader(file.getPath()); float width reader.getPageSize(1).getWidth(); float height reader.getPageSize(1).getHeight();但是這樣獲取的寬高是不準確的,永遠都是 寬 > 高,也就是橫…

NodeJs學習日志(2):windows安裝使用node.js 安裝express,suquelize,mysql,nodemon

windows安裝使用node.js 安裝express,suquelize,mysql,nodemon 系統是win10,默認已經安裝好nodejs與npm包名作用expressWeb應用框架suquelize數據庫ORMmysql數據庫nodemon代碼熱重載安裝express 添加express生成器 npm add expres…

VueCropper 圖片裁剪組件在Vue項目中的實踐應用

VueCropper 圖片裁剪組件在Vue項目中的實踐應用 1. 組件介紹 VueCropper 是一個基于 Vue.js 的圖片裁剪組件,它提供了豐富的圖片裁剪功能,包括: 圖片縮放、旋轉、移動固定比例裁剪高質量圖片輸出多種裁剪模式選擇 2. 安裝與引入 首先需要安裝…

給同一個wordpress網站綁定多個域名的實現方法

在WordPress網站上綁定多個域名,可以通過以下幾種方法實現: 1. 修改wp-config.php文件 在wp-config.php文件中,找到define(‘WP_DEBUG’, false);,在其下方添加以下代碼: define(WP_SITEURL, http:// . $_SERVER[HT…

HarmonyOS分布式開發實戰:打造跨設備協同應用

📖 文章目錄 第一章:HarmonyOS分布式架構揭秘第二章:跨設備協同的核心技術第三章:開發環境搭建與配置第四章:實戰項目:智能家居控制系統第五章:數據同步與狀態管理第六章:性能優化與…

用 Enigma Virtual Box 把 Qt 程序壓成單文件 EXE——從編譯、收集依賴到一鍵封包

關鍵詞:Qt、windeployqt、Enigma Virtual Box、單文件、綠色軟件 為什么要打成單文件? 傳統做法:用 windeployqt 把依賴拷進 release 目錄,發給用戶一個文件夾,文件又多又亂。理想做法:把整個目錄壓成一個…

unity中實現選中人物腳下顯示圓形標識且完美貼合復雜地形(如彈坑) 的效果

要實現人物腳下圓形 完美貼合復雜地形(如彈坑) 的效果,核心思路是 「動態生成貼合地面的 Mesh」 —— 即根據地面的高度場實時計算環形頂點的 Y 坐標,讓每個頂點都 “貼” 在地面上。核心邏輯:確定環形范圍&#xff1a…

引領GameFi 2.0新范式:D.Plan攜手頂級財經媒體啟動“龍珠創意秀”

在GameFi賽道尋求新突破的今天,一個名為Dragonverse Plan(D.Plan)的項目正以其獨特的經濟模型和宏大愿景,吸引著整個Web3社區的目光。據悉,D.Plan即將聯合中文區頂級加密媒體金色財經與非小號(Feixiaohao&a…

通信算法之307:fpga之時序圖繪制

時序圖繪制軟件 一. 序言 在FPGA設計過程中,經常需要編寫設計文檔,其中,不可缺少的就是波形圖的繪制,可以直接截取Vivado或者Modelsim平臺實際仿真波形,但是往往由于信號雜亂無法凸顯重點。因此,通過相應軟…

計網學習筆記第3章 數據鏈路層(灰灰題庫)

題目 11 單選題 下列說法正確的是______。 A. 路由器具有路由選擇功能,交換機沒有路由選擇功能 B. 三層交換機具有路由選擇功能,二層交換機沒有路由選擇功能 C. 三層交換機適合異構網絡,二層交換機不適合異構網絡 D. 路由器適合異構網絡&…

SQL的LEFT JOIN優化

原sql,一個base表a,LEFT JOIN三個表抽數 SELECT ccu.*, ctr.*, om.*, of.* FROM ods.a ccu LEFT JOIN ods.b ctr ON ccu.coupon_code ctr.coupon_code AND ctr.is_deleted 0 LEFT JOIN ods.c om ON ctr.bill_code om.order_id AND om.deleted 0 LEFT JOIN ods.…

Redis 核心概念、命令詳解與應用實踐:從基礎到分布式集成

目錄 1. 認識 Redis 2. Redis 特性 2.1 操作內存 2.2 速度快 2.3 豐富的功能 2.4 簡單穩定 2.5 客戶端語言多 2.6 持久化 2.7 主從復制 2.8 高可用 和 分布式 2.9 單線程架構 2.9.1 引出單線程模型 2.9.2 單線程快的原因 2.10 Redis 和 MySQL 的特性對比 2.11 R…

【Day 18】Linux-DNS解析

目錄 一、DNS概念 1、概念和作用 2、域名解析類型 3、 軟件與服務 4、DNS核心概念 區域 記錄 5、查詢類型 6、分層結構 二、DNS操作 配置本機為DNS內網解析服務器 (1)修改主配置文件 (2)添加區域 正向解析區域: …

Python 中 OpenCV (cv2) 安裝與使用介紹

Python 中 OpenCV (cv2) 安裝與使用詳細指南 OpenCV (Open Source Computer Vision Library) 是計算機視覺領域最流行的庫之一。Python 通過 cv2 模塊提供 OpenCV 的接口。 一、安裝 OpenCV 方法 1:基礎安裝(推薦) # 安裝核心包&#xff0…

微軟WSUS替代方案

微軟WSUS事件回顧2025年7月10日,微軟最新確認Windows Server Update Services(WSUS)出現了問題,導致IT管理員無法正常同步和部署Windows更新。WSUS是允許管理員根據策略配置,將更新推送到特定計算機,并優化…

Minio 分布式集群安裝配置

目錄創建 mkdir -p /opt/minio/run && mkdir -p /etc/minio && mkdir -p /indata/disk_0/minio/datarun:啟動腳本及二進制文件目錄/etc/minio:配置文件目錄data:數據存儲目錄下載 minio wget https://dl.min.io/server/minio…