主頁 >  其他 > 吃透Kafka一:Kafka架構剖析

吃透Kafka一:Kafka架構剖析

2021-11-15 07:48:35 其他

一,kafka簡介

Kafka 是一種分布式的,基于發布 / 訂閱的訊息系統,主要設計目標如下:

  • 以時間復雜度為 O(1) 的方式提供訊息持久化能力,即使對 TB 級以上資料也能保證常數時間復雜度的訪問性能,
  • 高吞吐率,即使在非常廉價的商用機器上也能做到單機支持每秒 100K 條以上訊息的傳輸,
  • 支持 Kafka Server 間的訊息磁區,及分布式消費,同時保證每個 Partition 內的訊息順序傳輸,
  • 同時支持離線資料處理和實時資料處理,
  • Scale out:支持在線水平擴展,

kafka的使用

  • 異步通信:很多時候,用戶不想也不需要立即處理訊息,訊息佇列提供了異步處理機制,允許用戶把一個訊息放入佇列,但并不立即處理它,想向佇列中放入多少訊息就放多少,然后在需要的時候再去處理它們,
  • 解耦:在專案啟動之初來預測將來專案會碰到什么需求,是極其困難的,訊息系統在處理程序中間插入了一個隱含的、基于資料的介面層,兩邊的處理程序都要實作這一介面,這允許你獨立的擴展或修改兩邊的處理程序,只要確保它們遵守同樣的介面約束,
  • 削峰:在訪問量劇增的情況下,應用仍然需要繼續發揮作用,但是這樣的突發流量并不常見;如果為以能處理這類峰值訪問為標準來投入資源隨時待命無疑是巨大的浪費,使用訊息佇列能夠使關鍵組件頂住突發的訪問壓力,而不會因為突發的超負荷的請求而完全崩潰,
  • 順序保證:在大多使用場景下,資料處理的順序都很重要,大部分訊息佇列本來就是排序的,并且能保證資料會按照特定的順序來處理,Kafka 保證一個 Partition 內的訊息的有序性,

二,kafka架構

在這里插入圖片描述

  • Broker:Kafka 集群包含一個或多個服務器,這種服務器被稱為 broker,
  • Topic:每條發布到 Kafka 集群的訊息都有一個類別,這個類別被稱為 Topic,(物理上不同 Topic 的訊息分開存盤,邏輯上一個 Topic 的訊息雖然保存于一個或多個 broker 上但用戶只需指定訊息的 Topic 即可生產或消費資料而不必關心資料存于何處),
  • Partition:物理上的概念,每個 Topic 包含一個或多個 Partition,
  • Producer:負責發布訊息到 Kafka broker,
  • Consumer:訊息消費者,向 Kafka broker 讀取訊息的客戶端,
  • Consumer Group:每個 Consumer 屬于一個特定的 Consumer Group(可為每個 Consumer 指定 group name,若不指定 group name 則屬于默認的 group),

如上圖所示,一個典型的 Kafka 集群中包含若干 Producer,若干 broker(Kafka 支持水平擴展,一般 broker 數量越多,集群吞吐率越高),若干 Consumer Group,以及一個Zookeeper集群,

Kafka 通過 Zookeeper 管理集群配置,選舉 leader,以及在 Consumer Group 發生變化時進行 rebalance,

Producer 使用 push 將訊息發布到 broker,Consumer 使用 pull 模式從 broker 訂閱并消費訊息,

三,Topic and Partition

Kafka 中的訊息以Topic為單位進行歸類,生產者負責將訊息發送到特定的Topic(發送到 Kafka 集群中的每一條訊息都要指定一個Topic),而消費者負責訂閱Topic并進行消費,

Topic是一個邏輯上的概念,它可以細分為多個Partition,一個Partition只屬于單個Topic,同一Topic下的不同Partition包含的訊息是不同的,Partition在存盤層面可以看作一個可追加的日志(Log)檔案,訊息在被追加到磁區日志檔案的時候都會分配一個特定的偏移量(offset),

offset 是訊息在Partition中的唯一標識,Kafka 通過它來保證訊息在磁區內的順序性,不過 offset 并不跨越磁區,也就是說,Kafka 保證的是磁區有序而不是主題有序

在這里插入圖片描述

如上圖所示,Topic 中有4個磁區,訊息被順序追加到每個磁區日志檔案的尾部,Kafka 中的磁區可以分布在不同的服務器(broker)上,也就是說,一個 Topic 可以橫跨多個 broker,以此來提供比單個 broker 更強大的性能,

每一條訊息被發送到 broker 之前,會根據磁區規則選擇存盤到哪個具體的磁區,如果磁區規則設定得合理,所有的訊息都可以均勻地分配到不同的磁區中,如果一個主題只對應一個檔案,那么這個檔案所在的機器I/O將會成為這個主題的性能瓶頸,而磁區解決了這個問題,在創建主題的時候可以通過指定的引數來設定磁區的個數,當然也可以在主題創建完成之后去修改磁區的數量,通過增加磁區的數量可以實作水平擴展,

Kafka 為磁區引入了多副本(Replica)機制,通過增加副本數量可以提升容災能力,

同一磁區的不同副本中保存的是相同的訊息(在同一時刻,副本之間并非完全一樣),副本之間是“一主多從”的關系,其中 leader 副本負責處理讀寫請求,follower 副本只負責與 leader 副本的訊息同步,副本處于不同的 broker 中,當 leader 副本出現故障時,從 follower 副本中重新選舉新的 leader 副本對外提供服務,Kafka 通過多副本機制實作了故障的自動轉移,當 Kafka 集群中某個 broker 失效時仍然能保證服務可用,

四,producer

Producer 發送訊息到 broker 時,會根據 Paritition 機制選擇將其存盤到哪一個 Partition,如果 Partition 機制設定合理,所有訊息可以均勻分布到不同的 Partition 里,這樣就實作了負載均衡,如果一個 Topic 對應一個檔案,那這個檔案所在的機器 I/O 將會成為這個 Topic 的性能瓶頸,而有了 Partition 后,不同的訊息可以并行寫入不同 broker 的不同 Partition 里,極大的提高了吞吐率,

在發送一條訊息時,可以指定這條訊息的 key,Producer 根據這個 key 和 Partition 機制來判斷應該將這條訊息發送到哪個 Parition,

producer的ack機制

Kafka的Ack機制指producer的訊息發送確認機制,其影響kafka集群的吞吐量和訊息可靠性,

  • Ack=0,相當于異步發送,意味著producer不等待broker同步完成,訊息發送完畢繼續發送下一批資訊,提供了最低延遲,但持久性最弱,當服務器發生故障時很可能發生資料丟失,如果leader死亡,producer繼續發送訊息,broker接收不到資料就會造成資料丟失,
  • Ack=1,producer要等待leader成功收到訊息并確認,才發送下一條message,提供較低的延遲性以及較好的持久性,但是如果partition下的leader死亡,而follower尚未復制資料,資料就會丟失,
  • Ack=-1,leader收到所有訊息,且follower同步完資料,才發送下一條資料,延遲性最差,持久性最好(即可靠性最好),

以上三種引數設定性能遞減,可靠性遞增,

Ack默認值為1,此時吞吐量與可靠性折中,實際生產中可以根據實際需求進行調整,

五,consumer

1,consumer group

同一 Topic 的一條訊息只能被同一個 Consumer Group 內的一個 Consumer 消費,但多個 Consumer Group 可同時消費這一訊息,

這是 Kafka 用來實作一個 Topic 訊息的廣播(發給所有的 Consumer)和單播(發給某一個 Consumer)的手段,一個 Topic 可以對應多個 Consumer Group,如果需要實作廣播,只要每個 Consumer 有一個獨立的 Group 就可以了,要實作單播只要所有的 Consumer 在同一個 Group 里,用 Consumer Group 還可以將 Consumer 進行自由的分組而不需要多次發送訊息到不同的 Topic,

2,pull and push

作為一個訊息系統,Kafka 遵循了傳統的方式,選擇由 Producer 向 broker push 訊息并由 Consumer 從 broker pull 訊息,

push 模式很難適應消費速率不同的消費者,因為訊息發送速率是由 broker 決定的,push 模式的目標是盡可能以最快速度傳遞訊息,但是這樣很容易造成 Consumer 來不及處理訊息,典型的表現就是拒絕服務以及網路擁塞,而 pull 模式則可以根據 Consumer 的消費能力以適當的速率消費訊息,

對于 Kafka 而言,pull 模式更合適,pull 模式可簡化 broker 的設計,Consumer 可自主控制消費訊息的速率,同時 Consumer 可以自己控制消費方式——即可批量消費也可逐條消費,同時還能選擇不同的提交方式從而實作不同的傳輸語意,

六,訊息存盤結構

如果磁區規則設定得合理,那么所有的訊息可以均勻地分布到不同的磁區中,這樣就可以實作水平擴展,不考慮多副本的情況,一個磁區對應一個日志(Log),為了防止 Log 過大,Kafka 又引入了日志分段(LogSegment)的概念,將 Log 切分為多個 LogSegment,相當于一個巨型檔案被平均分配為多個相對較小的檔案,這樣也便于訊息的維護和清理,

事實上,Log 和 LogSegment 也不是純粹物理意義上的概念,Log 在物理上只以檔案夾的形式存盤,而每個 LogSegment 對應于磁盤上的一個日志檔案和兩個索引檔案,以及可能的其他檔案(比如以“.txnindex”為后綴的事務索引檔案),下圖描繪了主題、磁區、副本、Log 以及 LogSegment 之間的關系,
在這里插入圖片描述

每一個topic-paration對應一個檔案夾,舉個例子:

kafka-topics --create --zookeeper localhost:2181 --replication-factor 1 --partitions 4 --topic topic-bobo

創建"topic-bobo"的主題,此主題中具有4個磁區,那么在實際物理存盤上表現為“topic-bobo-0”、“topic-bobo-1”、“topic-bobo-2”、“topic-bobo-3”這4個檔案夾:

在這里插入圖片描述

向 Log 中追加訊息時是順序寫入的,只有最后一個 LogSegment 才能執行寫入操作,在此之前所有的 LogSegment 都不能寫入資料,為了方便描述,我們將最后一個 LogSegment 稱為“activeSegment”,即表示當前活躍的日志分段,隨著訊息的不斷寫入,當 activeSegment 滿足一定的條件時,就需要創建新的 activeSegment,之后追加的訊息將寫入新的 activeSegment,

在這里插入圖片描述

為了便于訊息的檢索,每個 LogSegment 中的日志檔案(以“.log”為檔案后綴)都有對應的兩個索引檔案:偏移量索引檔案(以“.index”為檔案后綴)和時間戳索引檔案(以“.timeindex”為檔案后綴),每個 LogSegment 都有一個基準偏移量 baseOffset,用來表示當前 LogSegment 中第一條訊息的 offset,偏移量是一個64位的長整型數,日志檔案和兩個索引檔案都是根據基準偏移量(baseOffset)命名的,名稱固定為20位數字,沒有達到的位數則用0填充,比如第一個 LogSegment 的基準偏移量為0,對應的日志檔案為00000000000000000000.log,

注意每個 LogSegment 中不只包含“.log”、“.index”、“.timeindex”這3種檔案,還可能包含“.deleted”、“.cleaned”、“.swap”等臨時檔案,以及可能的“.snapshot”、“.txnindex”、“leader-epoch-checkpoint”等檔案,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/357056.html

標籤:其他

上一篇:資料分析 一文搞懂什么是RFM模型

下一篇:基于云服務器docker搭建zookeeper集群

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more