大數據之Kafka內部原理詳細介紹

  • 目錄
    • 前言:
    • 1、Kafka整體結構
    • 2、Consumer與topic關系
    • 3、Kafka消息的分發
    • 4、Consumer的負載均衡
    • 5、kafka文件存儲機制
    • 總結:

目錄

前言:

本篇文章所介紹的內容還是以了解為主,主要目的還是為了對Kafka有一個更深入的理解。主要介紹了以下幾個知識點:Kafka的負載均衡、Producer生產數據、Kafka文件存儲機制等(不過總感覺這篇文章總結的亂七八糟。。請大家多多包涵,隨著后面的學習,自己會再回過頭來進行修改)

1、Kafka整體結構

Kafka名詞解釋和工作方式

  • kafka:是一個生產-消費模型類JMS消息隊列,結合JMS中的兩種模式,可以有多個消費者主動拉取數據,在JMS中只有點對點模式才有消費者主動拉取數據。
  • Producer :消息生產者,就是向kafka broker發消息的客戶端。數據的分發策略由producer決定,默認是defaultPartition Utils.abs(key.hashCode) % numPartitions
  • Consumer :消息消費者,向kafka broker取消息的客戶端
  • Topic :可以理解為一個隊列或者目標發送的目的地,這是一個邏輯上的概念,落到磁盤上是一個partition的目錄。partition的目錄中有多個segment組合(index,log),一個Topic對應多個partition[0,1,2,3],一個partition對應多個segment組合。一個segment有默認的大小是1G。每個partition可以設置多個副本(replication-factor 1),會從所有的副本中選取一個leader出來。所有讀寫操作都是通過leader來進行的。特別強調,和mysql中主從有區別,mysql做主從是為了讀寫分離,在kafka中讀寫操作都是leader。
  • Consumer Group(CG):數據消費者組,ConsumerGroup可以有多個,每個ConsumerGroup消費的數據都是一樣的。可以把多個consumer線程劃分為一個組,組里面所有成員共同消費一個topic的數據,組員之間不能重復消費。
  • Broker :一臺kafka服務器就是一個broker。一個集群由多個broker組成。一個broker可以容納多個topic。只管數據存儲,不管是誰生產,不管是誰消費。
  • Partition:為了實現擴展性,一個非常大的topic可以分布到多個broker(即服務器)上,一個topic可以分為多個partition,每個partition是一個有序的隊列。partition中的每條消息都會被分配一個有序的id(offset)。kafka只保證按一個partition中的順序將消息發給consumer,不保證一個topic的整體(多個partition間)的順序。
  • Offset:kafka的存儲文件都是按照offset.kafka來命名,用offset做名字的好處是方便查找。例如你想找位于2049的位置,只要找到2048.kafka的文件即可。當然the first offset就是00000000000.kafka。

2、Consumer與topic關系

本質上kafka只支持Topic;

  • 每個group中可以有多個consumer,每個consumer屬于一個consumer group;
    通常情況下,一個group中會包含多個consumer,這樣不僅可以提高topic中消息的并發消費能力,而且還能提高”故障容錯”性,如果group中的某個consumer失效那么其消費的partitions將會有其他consumer自動接管。
  • 對于Topic中的一條特定的消息,只會被訂閱此Topic的每個group中的其中一個consumer消費,此消息不會發送給一個group的多個consumer;那么一個group中所有的consumer將會交錯的消費整個Topic,每個group中consumer消息消費互相獨立,我們可以認為一個group是一個”訂閱”者。
  • 在kafka中,一個partition中的消息只會被group中的一個consumer消費(同一時刻);
    一個Topic中的每個partions,只會被一個”訂閱者”中的一個consumer消費,不過一個consumer可以同時消費多個partitions中的消息。
  • kafka的設計原理決定,對于一個topic,同一個group中不能有多于partitions個數的consumer同時消費,否則將意味著某些consumer將無法得到消息

kafka只能保證一個partition中的消息被某個consumer消費時是順序的;事實上,從Topic角度來說,當有多個partitions時,消息仍不是全局有序的。

3、Kafka消息的分發

Producer客戶端負責消息的分發

  • kafka集群中的任何一個broker都可以向producer提供metadata信息,這些metadata中包含”集群中存活的servers列表”/”partitions leader列表”等信息;
  • 當producer獲取到metadata信息之后, producer將會和Topic下所有partition
    leader保持socket連接;
  • 消息由producer直接通過socket發送到broker,中間不會經過任何”路由層”,事實上,消息被路由到哪個partition上由producer客戶端決定;

比如可以采用”random”“key-hash”“輪詢”等,如果一個topic中有多個partitions,那么在producer端實現”消息均衡分發”是必要的。
在producer端的配置文件中,開發者可以指定partition路由的方式。

Producer消息發送的應答機制
ack機制:broker表示發來的數據已確認接收無誤,表示數據已經保存到磁盤。
設置發送數據是否需要服務端的反饋,有三個值0,1,-1
0: producer不會等待broker發送ack
1: 當leader接收到消息之后發送ack
-1: 當所有的follower都同步消息成功后發送ack
request.required.acks=0

4、Consumer的負載均衡

當一個group中,有consumer加入或者離開時,會觸發partitions均衡.均衡的最終目的,是提升topic的并發消費能力,步驟如下:

  1. 假如topic1,具有如下partitions: P0,P1,P2,P3
  2. 加入group中,有如下consumer: C1,C2
  3. 首先根據partition索引號對partitions排序: P0,P1,P2,P3
  4. 根據consumer.id排序: C0,C1
  5. 計算倍數: M = [P0,P1,P2,P3].size / [C0,C1].size,本例值M=2(向上取整)
  6. 然后依次分配partitions: C0 = [P0,P1],C1=[P2,P3],即Ci = [P(i * M),P((i + 1)
    • M -1)]

這里寫圖片描述

5、kafka文件存儲機制

5.1、Kafka文件存儲基本結構

  • 在Kafka文件存儲中,同一個topic下有多個不同partition,每個partition為一個目錄,partiton命名規則為topic名稱+有序序號,第一個partiton序號從0開始,序號最大值為partitions數量減1。
  • 每個partition(目錄)相當于一個巨型文件被平均分配到多個大小相等segment(段)數據文件中。但每個段segment file消息數量不一定相等,這種特性方便old segment file快速被刪除。默認保留7天的數據。

這里寫圖片描述
- 每個partiton只需要支持順序讀寫就行了,segment文件生命周期由服務端配置參數決定。(什么時候創建,什么時候刪除)
這里寫圖片描述

5.2、Kafka Partition Segment

  • Segment file組成:由2大部分組成,分別為index file和data file,此2個文件一一對應,成對出現,后綴”.index”和“.log”分別表示為segment索引文件、數據文件。

這里寫圖片描述

  • Segment文件命名規則:partion全局的第一個segment從0開始,后續每個segment文件名為上一個segment文件最后一條消息的offset值。數值最大為64位long大小,19位數字字符長度,沒有數字用0填充。
  • 索引文件存儲大量元數據,數據文件存儲大量消息,索引文件中元數據指向對應數據文件中message的物理偏移地址。

3,497:當前log文件中的第幾條信息,存放在磁盤上的那個地方

上述圖中索引文件存儲大量元數據,數據文件存儲大量消息,索引文件中元數據指向對應數據文件中message的物理偏移地址。
其中以索引文件中元數據3,497為例,依次在數據文件中表示第3個message(在全局partiton表示第368772個message)、以及該消息的物理偏移地址為497。

5.3、Kafka 查找message
讀取offset=368776的message,需要通過下面2個步驟查找。
這里寫圖片描述

5.3.1、查找segment file
00000000000000000000.index表示最開始的文件,起始偏移量(offset)為0
00000000000000368769.index的消息量起始偏移量為368770 = 368769 + 1
00000000000000737337.index的起始偏移量為737338=737337 + 1
其他后續文件依次類推。
以起始偏移量命名并排序這些文件,只要根據offset 二分查找文件列表,就可以快速定位到具體文件。當offset=368776時定位到00000000000000368769.index和對應log文件。
5.3.2、通過segment file查找message
當offset=368776時,依次定位到00000000000000368769.index的元數據物理位置和00000000000000368769.log的物理偏移地址
然后再通過00000000000000368769.log順序查找直到offset=368776為止。

總結:

需要了解的知識點有以下幾個:
1、Kafka的內部名詞及各個名詞的含義及作用。
2、Kafka消息分發的機制。
3、Consumer的負載均衡機制。
4、Kafka文件存儲機制。
總感覺這篇文章總結的比較亂,也許可以把其中的模塊拆開來寫吧。Anyway,就先總結成這樣吧,以后有機會會再修改。

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

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

相關文章

【python】urllib和urllib3,requests 簡要概括---筆記

urllib和urllib3,requestsurl:協議://存放資源的地址(域名)/具體的資源https://bj.lianjia.com/zufang/dghfjhsjdf648.htmlurllib.request 用來發出請求urllib.parseurllib.request.urlopen(str) --->response對象request urllib.reques…

JS與APP原生控件交互

“熱更新”、“熱部署”相信對于混合式開發的童鞋一定不陌生,那么APP怎么避免每次升級都要在APP應用商店發布呢?這里就用到了混合式開發的概念,對于電商網站尤其顯得重要,不可能每次發布一個活動,都要發布一個現版本&a…

《脫穎而出——成功網店經營之道》一2.6 連橫:返利模式的應用及分銷

本節書摘來異步社區《脫穎而出——成功網店經營之道》一書中的第2章,第2.6節,作者: 何小健 責編: 趙軒, 更多章節內容可以訪問云棲社區“異步社區”公眾號查看。 2.6 連橫:返利模式的應用及分銷 脫穎而出——成功網店…

【python】os模塊 遞歸刪除文件夾所有文件 --筆記

os.environ 獲取系統的環境變量 os.name nt -- windows \r\n | posix --- Linux \nos.path: import osprint(os.environ) print(os.environ[OS])print(os.path.abspath(t1/file01.py)) # 獲取絕對路徑 print(os.path.isabs(t1/file01.py)) # 判斷所給的路徑是否是一個絕對…

大數據之Spark集群安裝及簡單使用

目錄1、Spark集群安裝1.1. 安裝 2、啟動Spark Shell2.1、啟動spark shell2.2、在spark shell中編寫WordCount程序 目錄 1、Spark集群安裝 1.1. 安裝 1.1.1. 機器部署 準備兩臺以上Linux服務器,安裝好JDK1.7 1.1.2. 下載Spark安裝包 下載地址:ht…

《C和C++代碼精粹》——1.7 類型安全I/O

本節書摘來自異步社區出版社《C和C代碼精粹》一書中的第1章第1.7節,作者: 【美】Chuck Allison,更多章節內容可以訪問云棲社區“異步社區”公眾號查看。 1.7 類型安全I/O C和C代碼精粹當然每個C程序員都曾經使用過printf的錯誤格式描述符號。…

大數據之Spark簡介及RDD說明

目錄前言:1、Spark概述1.1、什么是Spark(官網:http://spark.apache.org)1.2、為什么要學Spark1.3、Spark特點 2、RDD概述2.1、什么是RDD2.2、RDD的屬性2.3、創建RDD的兩種方式2.4、RDD編程API2.5、RDD的依賴關系2.6、RDD的緩存2.7…

Python3中urlopen()詳解

一. 簡介 urllib.request.urlopen()函數用于實現對目標url的訪問。 函數原型如下:urllib.request.urlopen(url, dataNone, [timeout, ]*, cafileNone, capathNone, cadefaultFalse, contextNone)  url: 需要打開的網址 data:Post提交的數據 timeo…

python面向對象實現簡易銀行管理員頁面系統

銀行管理員頁面系統設計:card 類: cardId password moneyuser 類: username phone id cards[]銀行的工作人員: 賬號 密碼 登錄 展現管理系統所有功能Bank類:開戶取錢存錢轉賬銷戶查賬解鎖... import pickle import random# 銀行卡 import time#card 類…

單子模式

package test; class aceing { /** param args */ private static aceing ace; public aceing() { super(); System.out.println("aceing類中的無參構造器調用了"); } public static aceing getAceing() { if(ace null) { ace new aceing(); } return ace; }} pack…

《塑造互聯網思維的企業》一一第4章 全球商務向社會化媒體的轉變

第4章 全球商務向社會化媒體的轉變 塑造互聯網思維的企業社會化媒體在發達國家的廣泛采用已是我們所熟知的,它在社會和全球文化產生的大范圍變革中至關重要。為了完全了解其中的原因,有必要探究一下那些推動社會化商務的復雜且相互關聯的因素的共同影響…

大數據之SparkSQL簡介及DataFrame的使用

目錄前言:1、Spark SQL1.1、Spark SQL概述1.2、DataFrames1.3、DataFrame常用操作 總結: 目錄 前言: 本文主要介紹下SparkSQL以及SparkSQL的簡單使用。這里只是做了一個非常簡單的介紹,后續工作中如果有用到相關的知識&#xff…

python的各種推導式(列表推導式、字典推導式、集合推導式)

python的各種推導式(列表推導式、字典推導式、集合推導式) 推導式comprehensions(又稱解析式),是Python的一種獨有特性。推導式是可以從一個數據序列構建另一個新的數據序列的結構體。 共有三種推導,在Pyt…

原生js實現jquery庫中選擇器的功能(jquery庫封裝一)

今天是2017.1.1,新的一天,新的一年,新的一年里繼續夯實基礎知識,在工作中多些項目,多思考,多總結,前端是不斷更新,在更新的過程中也是發現樂趣和挑戰自我的過程,希望年輕…

Ubantu下使用vi時,方向鍵變字母輸出、退格鍵無法刪除字符的解決辦法

目錄前言:一、編輯/etc/vim/vimrc.tiny二、安裝vim full版本三、添加”.vimrc”文件 目錄 前言: 最近由于要玩TensorFlow,所以把塵封已久的Ubantu給打開了,不過配置網絡的時候,算是一團糟,出現了在插入模…

《Python爬蟲開發與項目實戰》——第3章 初識網絡爬蟲 3.1 網絡爬蟲概述

本節書摘來自華章計算機《Python爬蟲開發與項目實戰》一書中的第3章,第3.1節,作者:范傳輝著,更多章節內容可以訪問云棲社區“華章計算機”公眾號查看 第3章 初識網絡爬蟲 從本章開始,將正式涉及Python爬蟲的開發。本章…

【python】解決:TypeError: can't send non-None value to a just-started generator

在一個生成器函數未啟動之前,是不能傳遞數值進去。必須先傳遞一個None進去或者調用一次next(g)方法,才能進行傳值操作 def product(c):# c.send(None)for i in range(5):print("生產者產生數據%d"%i)r c.send(str(i))print("消費者消費了…

Shell腳本與vi編輯器:vi啟動與退出、工作模式、命令大全

Vi簡介 Vi是一種廣泛存在于各種UNIX和Linux系統中的文本編輯程序。Vi不是排版程序,只是一個純粹的文本編輯程序。Vi是全屏幕文本編輯器,它沒有菜單,只有命令。Vi不是基于窗口的,所以,這個多用途編輯程序可以用于在任何…

windows環境下,如何在Pycharm下安裝TensorFlow環境

文章目錄目錄前言:1.安裝Anaconda2.安裝Tensorflow3.其他問題4.在pycharm中使用tensorflow目錄 前言: 最近由于工作需要要使用TensorFlow,所以只能狂補相關的知識。本來博主打算在Ubantu上玩,但是由于一些原因還是放棄了這個想法…

python面向對象實現簡易銀行管理員頁面系統【導入自定義模塊】

main.py 人 類名:Person 屬性:姓名 身份證號 電話 卡 行為:卡 類名:Card 屬性:卡號 密碼 余額 行為:銀行 類名:Bank 屬性:用戶列表 提款機提款機 類名:ATM 屬性&#xf…