【MQ】探索 Kafka

高性能

  • 消息的順序性、順序寫磁盤

  • 零拷貝

    • RocketMQ內部主要是使用基于mmap實現的零拷貝,用來讀寫文件

    • 減少cpu的拷貝次數和上下文切換次數,實現文件的高效讀寫操作

  • Kafka

零拷貝

  • Kafka 使用到了 mmap 和 sendfile 的方式來實現零拷貝。分別對應 Java 的 MappedByteBuffer 和 FileChannel.transferTo

順序寫磁盤

  • Kafka 采用順序寫文件的方式來提高磁盤寫入性能。順序寫文件,基本減少了磁盤尋道和旋轉的次數
    • 完成一次磁盤 IO,需要經過尋道、旋轉和數據傳輸三個步驟,如果在寫磁盤的時候省去尋道、旋轉可以極大地提高磁盤讀寫的性能。
    • Kafka 中每個分區是一個有序的,不可變的消息序列,新的消息不斷追加到 Partition 的末尾,在 Kafka 中 Partition 只是一個邏輯概念,Kafka 將 Partition 劃分為多個 Segment,每個 Segment 對應一個物理文件,Kafka 對 segment 文件追加寫,這就是順序寫文件

頁緩存技術

  • 應當使用本地磁盤作為存儲介質。Page Cache 的存在就可以提升消息的讀取速度,

批量傳輸與壓縮消息

  • 生產端有兩個重要的參數:batch.size和linger.ms。這兩個參數就和 Producer 的批量發送消息有關。

網絡模型

  • Kafka 自己實現了網絡模型做 RPC。底層基于 Java NIO,采用和 Netty 一樣的 Reactor 線程模型。
    • Kafka 即基于 Reactor 模型實現了多路復用和處理線程池。
    • Reactor 模型基于池化思想,避免為每個連接創建線程,連接完成后將業務處理交給線程池處理;基于 IO 復用模型,多個連接共用同一個阻塞對象,不用等待所有的連接。遍歷到有新數據可以處理時,操作系統會通知程序,線程跳出阻塞狀態,進行業務邏輯處理

分區并發

  • Kafka 的 Topic 可以分成多個 Partition,每個 Paritition 類似于一個隊列,保證數據有序。同一個 Group 下的不同 Consumer 并發消費 Paritition,分區實際上是調優 Kafka 并行度的最小單元,因此,可以說,每增加一個 Paritition 就增加了一個消費并發。

高效的文件數據結構

  • 每個 Topic 又可以分為一個或多個分區。每個分區各自存在一個記錄消息數據的日志文件。Kafka 每個分區日志在物理上實際按大小被分成多個 Segment。
    • segment file 組成:由 2 大部分組成,分別為 index file 和 data file,此 2 個文件一一對應,成對出現,
    • index 采用稀疏索引,這樣每個 index 文件大小有限,Kafka 采用mmap的方式,直接將 index 文件映射到內存,這樣對 index 的操作就不需要操作磁盤 IO
    • 分段和索引的策略:利用偏移量和時間索引文件實現快速消息查找

高可用

  • Kafka

    • Kafka 從 0.8 版本開始提供了高可用機制,可保障一個或多個 Broker 宕機后,其他 Broker 能繼續提供服務

分區副本、備份機制

    同一個 Partition 存在多個消息副本,每個 Partition 的副本通常由 1 個 Leader 及 0 個以上的 Follower 組成,

    • Kafka 會盡量將所有的 Partition 以及各 Partition 的副本均勻地分配到整個集群的各個 Broker 上
    • 多副本機制
      • 分區(Partition)引入了多副本(Replica)機制。
      • 多分區、多副本機制好處呢?
        • 1. Kafka 通過給特定 Topic 指定多個 Partition分區, 而各個 Partition 可以分布在不同的 Broker 上, 這樣便能提供比較好的并發能力(負載均衡)。
        • 2. Partition 可以指定對應的 Replica 數, 這也極大地提高了消息存儲的安全性, 提高了容災能力,不過也相應的增加了所需要的存儲空間。

    ACK 機制

          • 生產者發送消息中包含 acks 字段,該字段代表 Leader 應答生產者前 Leader 收到的應答數
          • 「acks=0」
            • 生產者無需等待服務端的任何確認,因此 acks=0 不能保證服務端已收到消息
          • 「acks=1」默認值
            • 只要 Partition Leader 接收到消息而且寫入本地磁盤了,就認為成功了,不管其他的 Follower 有沒有同步
          • 「acks=all or -1」
            • 服務端會等所有的 follower 的副本受到數據后才會收到 leader 發出的 ack,這樣數據不會丟失
            • Broker 有個配置項min.insync.replicas(默認值為 1)代表了正常寫入生產者數據所需要的最少 ISR 個數
        • 發送的 acks=1 和 0 消息會出現丟失情況,為了不丟失消息可配置生產者acks=all & min.insync.replicas >= 2

    ISR 機制

          • ISR 中的副本都是與 Leader 同步的副本,不在 ISR 中的Follower副本就被認為是沒有資格的
          • Follower 周期性地向 Leader 發送 FetchRequest 請求,發送時間間隔配置在replica.fetch.wait.max.ms中,默認值為 500
          • 每個分區的 Leader 負責維護 ISR 列表并將 ISR 的變更同步至 ZooKeeper,被移出 ISR 的 Follower 會繼續向 Leader 發 FetchRequest 請求,試圖再次跟上 Leader 重新進入 ISR
          • ISR 中所有副本都跟上了 Leader,通常只有 ISR 里的成員才可能被選為 Leader

    主從同步

          • 1、Follower副本通過發送Fetch請求來同步Leader副本上的數據。
          • LEO(Log End Offset)
            • 對于Leader副本和每個Follower副本來說,它們都有各自的LEO
            • LEO是下一個要寫入的消息的偏移量
          • HW(High Watermark)
            • HW是分區中所有副本的已提交消息的最大偏移量。是分區中所有ISR(In-Sync Replicas)副本的LEO中的最小值
            • 只要分區的Leader副本和至少一個Follower副本保持同步,消費者就能看到所有已提交的消息,即使Leader副本發生故障
          • 確保了Kafka在分區的Leader副本發生故障時,可以從ISR中選舉出一個Follower副本作為新的Leader,
        • Unclean 領導者選舉
          • 當 Kafka 中unclean.leader.election.enable配置為 true(默認值為 false)且 ISR 中所有副本均宕機的情況下,
          • 開啟 Unclean 領導者選舉可能會造成數據丟失,但好處是,它使得分區 Leader 副本一直存在,不至于停止對外提供服務,因此提升了高可用性,

    Leader 選舉 & 故障恢復機制

          • 「Kafka 從 0.8 版本開始引入了一套 Leader 選舉及失敗恢復機制」
          • 在集群所有 Broker 中選出一個 Controller,負責各 Partition 的 Leader 選舉以及 Replica 的重新分配
          • Controller
            • 集群中的 Controller 也會出現故障,因此 Kafka 讓所有 Broker 都在 ZooKeeper 的 Controller 節點上注冊一個 Watcher。
          • 當出現 Leader 故障后,Controller 會將 Leader/Follower 的變動通知到需要為此作出響應的 Broker。
          • Kafka 使用 ZooKeeper 存儲 Broker、Topic 等狀態數據,Kafka 集群中的 Controller 和 Broker 會在 ZooKeeper 指定節點上注冊 Watcher(事件監聽器),以便在特定事件觸發時,由 ZooKeeper 將事件通知到對應 Broker
          • 當 Broker 發生故障后,由 Controller 負責選舉受影響 Partition 的新 Leader 并通知到相關 Broker

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

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

    相關文章

    VMware 和本機(Win10)安裝共享文件

    1. 安裝VM-tools, sudo apt-get install open-vm-tools-desktop -y 2. VMware->設置-> 選項中啟動共享文件夾. 3. 本機設置共享文件夾(文件目錄為data),右鍵屬性設置: VMware, Other Locations->Computer->mnt->data 即可。 ps: 還有個…

    2025美賽MCM數學建模A題:《石頭臺階的“記憶”:如何用數學揭開歷史的足跡》(全網最全思路+模型)

    ?個人主頁歡迎您的訪問 ?期待您的三連 ? 《石頭臺階的“記憶”:如何用數學揭開歷史的足跡》 目錄 《石頭臺階的“記憶”:如何用數學揭開歷史的足跡》 ?摘要? ?引言? 1. 引言的結構 2. 撰寫步驟 (1)研究背景 &#…

    SpringBoot-Vue整合百度地圖

    文章目錄 一、Spring Boot整合百度地圖的步驟1. 申請百度地圖的AK值2. 創建實體類3. 創建Controller層4. 前端集成百度地圖4.1 在Vue項目中安裝百度地圖Vue組件庫4.2 在Vue項目中引入百度地圖API4.3 創建地圖組件 二、實現功能說明1. 前端部分:2. 后端部分&#xff…

    Baklib如何優化企業知識管理實現全面數字化升級與協同創新

    內容概要 Baklib 作為企業知識管理的重要工具,提供了一個集成化的知識中臺,幫助企業在數字化轉型過程中更高效地管理和利用其知識資產。在現代企業中,知識的管理和應用顯得尤為重要,因為優秀的知識管理能夠直接影響到組織的決策效…

    機器學習day4

    自定義數據集 使用pytorch框架實現邏輯回歸并保存模型,然后保存模型后再加載模型進行預測 import numpy as np import torch import torch.nn as nn import torch.optim as optimizer import matplotlib.pyplot as pltclass1_points np.array([[2.1, 1.8],[1.9, 2…

    天道無極:論文明興衰中的規律自覺與文化覺醒

    宇宙洪荒,星河輪轉,人類文明在浩渺時空中不過滄海一粟。當我們剖開青銅器上的饕餮紋,凝視量子計算機的硅基瞳孔,會發現所有文明興衰的背后都躍動著同一組密碼——對規律的認知與駕馭程度,構成了文明存續的底層邏輯。從兩河流域的楔形文字到華爾街的電子屏幕,從雅典學院的…

    Linux解決輸入法卡死問題

    說明:在Ubuntu系統中,如果您需要重啟輸入法服務(比如fcitx或ibus),您可以按照以下步驟操作。這些步驟適用于大多數基于Ubuntu的發行版,例如Ubuntu、Linux Mint等。 一、重啟Fcitx輸入法服務 1、使用Ctrl …

    區間選點(貪心)

    給定 NN 個閉區間 [ai,bi][ai,bi],請你在數軸上選擇盡量少的點,使得每個區間內至少包含一個選出的點。 輸出選擇的點的最小數量。 位于區間端點上的點也算作區間內。 輸入格式 第一行包含整數 NN,表示區間數。 接下來 NN 行,…

    WPF基礎 | WPF 常用控件實戰:Button、TextBox 等的基礎應用

    WPF基礎 | WPF 常用控件實戰:Button、TextBox 等的基礎應用 一、前言二、Button 控件基礎2.1 Button 的基本定義與顯示2.2 按鈕樣式設置2.3 按鈕大小與布局 三、Button 的交互功能3.1 點擊事件處理3.2 鼠標懸停與離開效果3.3 按鈕禁用與啟用 四、TextBox 控件基礎4.…

    【huawei】云計算的備份和容災

    目錄 1 備份和容災 2 災備的作用? ① 備份的作用 ② 容災的作用 3 災備的衡量指標 ① 數據恢復時間點(RPO,Recoyery Point Objective) ② 應用恢復時間(RTO,Recoyery Time Objective) 4…

    Vue 封裝http 請求

    封裝message 提示 Message.js import { ElMessage } from "element-plus";const showMessage (msg,callback,type)>{ElMessage({message: msg,type: type,duration: 3000,onClose:()>{if (callback) {callback();}}}); }const message {error: (msg,…

    簡單的停車場管理系統的C語言實現示例

    以下是一個簡單的停車場管理系統的C語言實現示例。該示例使用結構體來管理停車場的車位信息&#xff0c;并提供基本車輛進入、離開以及顯示停車場狀態功能。 #include <stdio.h> #include <stdlib.h> #include <string.h>#define MAX_SLOTS 10 // 最大車位數…

    解除阿里云盤壓縮包分享限制的最新工具(2025年更新)

    前言 前段時間&#xff0c;為了在阿里云盤分享一些資料&#xff0c;嘗試了好多種方法&#xff1a;改文件名后綴&#xff0c;打包自解壓&#xff0c;使用將壓縮文件追加在圖片文件后&#xff0c;還有的一些工具&#xff0c;雖然能偽裝文件但并不太好用&#xff0c;最后自己寫了…

    HarmonyOS:創建應用靜態快捷方式

    一、前言 靜態快捷方式是一種在系統中創建的可以快速訪問應用程序或特定功能的鏈接。它通常可以在長按應用圖標&#xff0c;以圖標和相應的文字出現在應用圖標的上方&#xff0c;用戶可以迅速啟動對應應用程序的組件。使用快捷方式&#xff0c;可以提高效率&#xff0c;節省了查…

    21.0.2-為什么選FreeRTOS 第21章-FreeRTOS項目實戰--基礎知識之新建任務、啟動流程、編碼風格、系統配置

    這個是全網最詳細的STM32項目教學視頻。 第一篇在這里: 視頻在這里 STM32智能小車V3-STM32入門教程-openmv與STM32循跡小車-stm32f103c8t6-電賽 嵌入式學習 PID控制算法 編碼器電機 跟隨 **V3:HAL庫開發、手把手教學下面功能&#xff1a;PID速度控制、PID循跡、PID跟隨、遙控、…

    12 款開源OCR發 PDF 識別框架

    2024 年 12 款開源文檔解析框架的選型對比評測&#xff1a;PDF解析、OCR識別功能解讀、應用場景分析及優缺點比較 這是該系列的第二篇文章&#xff0c;聚焦于智能文檔處理&#xff08;特別是 PDF 解析&#xff09;。無論是在模型預訓練的數據收集階段&#xff0c;還是基于 RAG…

    DeepSeek R1:推理模型新紀元與價格戰

    標題&#xff1a;DeepSeek R1&#xff1a;推理模型新紀元與價格戰 文章信息摘要&#xff1a; DeepSeek R1的發布標志著推理模型研究的重要轉折點&#xff0c;其采用四階段強化學習訓練方法&#xff0c;結合監督微調和拒絕采樣&#xff0c;顯著提升了模型的推理能力。這一進展不…

    深度剖析C++17中的std::optional:處理可能缺失值的利器

    文章目錄 一、基本概念與設計理念二、構建與初始化&#xff08;一&#xff09;默認構造&#xff08;二&#xff09;值初始化&#xff08;三&#xff09;使用std::make_optional&#xff08;四&#xff09;使用std::nullopt 三、訪問值&#xff08;一&#xff09;value()&#x…

    擬合損失函數

    文章目錄 擬合損失函數一、線性擬合1.1 介紹1.2 代碼可視化1.2.1 生成示例數據1.2.2 損失函數1.2.3 繪制三維圖像1.2.4 繪制等高線1.2.5 損失函數關于斜率的函數 二、 多變量擬合2.1 介紹2.2 代碼可視化2.2.1 生成示例數據2.2.2 損失函數2.2.3 繪制等高線 三、 多項式擬合3.1 介…

    基于微信小程序的移動學習平臺的設計與實現(LW+源碼+講解)

    專注于大學生項目實戰開發,講解,畢業答疑輔導&#xff0c;歡迎高校老師/同行前輩交流合作?。 技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;…