IT學習筆記--Kafka

Kafka概述:

定義:

Kafka是一個分布式的基于發布/訂閱模式的消息隊列,主要應用于大數據實時處理領域。

消息隊列消息隊列的兩種模式:

  • 點對點模式:

消息生產者生產消息發送到Queue中,然后消息消費者從Queue中取出并且消費消息。
消息被消費以后,queue中不再有存儲,所以消息消費者不可能消費到已經被消費的消息。Queue支持存在多個消費者,但是對一個消息而言,只會有一個消費者可以消費。

  • 發布/訂閱模式(一對多,消費者消費數據之后不會清除消息):

消息生產者(發布)將消息發布到topic中,同時有多個消息消費者(訂閱)消費該消息。和點對點方式不同,發布到topic的消息會被所有訂閱者消費。

?Kafka的基本架構:

基礎架構:

  • Producer:消息生產者,就是向kafka broker發消息的客戶端;
  • Consumer:消息消費者,向kafka broker取消息的客戶端;
  • Consumer Group (CG):消費者組,由多個consumer組成。消費者組內每個消費者負責消費不同分區的數據,一個分區只能由一個消費者消費;消費者組之間互不影響。所有的消費者都屬于某個消費者組,即消費者組是邏輯上的一個訂閱者。
  • Broker:一臺kafka服務器就是一個broker。一個集群由多個broker組成。一個broker可以容納多個topic。
  • Topic:可以理解為一個隊列,生產者和消費者面向的都是一個topic;
  • Partition:為了實現擴展性,一個非常大的topic可以分布到多個broker(即服務器)上,一個topic可以分為多個partition,每個partition是一個有序的隊列;
  • Replica:副本,為保證集群中的某個節點發生故障時,該節點上的partition數據不丟失,且kafka仍然能夠繼續工作,kafka提供了副本機制,一個topic的每個分區都有若干個副本,一個leader和若干個follower。
  • Leader:每個分區多個副本的“主”,生產者發送數據的對象,以及消費者消費數據的對象都是leader。
  • Follower:每個分區多個副本中的“從”,實時從leader中同步數據,保持和leader數據的同步。leader發生故障時,某個follower會成為新的follower。?

kafka中partition和消費者對應關系:

1個partition只能被同組的一個consumer消費,同組的consumer則起到均衡效果。

  • 消費者多于partition:同一個partition內的消息只能被同一個組中的一個consumer消費。當消費者數量多于partition的數量時,多余的消費者空閑。
  • 消費者少于和等于partition:消息在同一個組之間的消費者之間均分。
  • 多個消費者組:啟動多個組,則會使同一個消息被消費多次。

?Kafka文件存儲機制:

Kafka中消息是以topic進行分類的,生產者生產消息,消費者消費消息,都是面向topic的。

topic是邏輯上的概念,而partition是物理上的概念,每個partition對應于一個log文件,該log文件中存儲的就是producer生產的數據。Producer生產的數據會被不斷追加到該log文件末端,且每條數據都有自己的offset。消費者組中的每個消費者,都會實時記錄自己消費到了哪個offset,以便出錯恢復時,從上次的位置繼續消費。

由于生產者生產的消息會不斷追加到log文件末尾,為防止log文件過大導致數據定位效率低下,Kafka采取了分片和索引機制,將每個partition分為多個segment。每個segment對應兩個文件——“.index”文件和“.log”文件。這些文件位于一個文件夾下,該文件夾的命名規則為:topic名稱+分區序號。例如,first這個topic有三個分區,則其對應的文件夾為first-0,first-1,first-2。

index和log文件以當前segment的第一條消息的offset命名;“.index”文件存儲大量的索引信息,“.log”文件存儲大量的數據,索引文件中的元數據指向對應數據文件中message的物理偏移地址。

生產者:

分區原因:

  • 方便在集群中擴展,每個Partition可以通過調整以適應它所在的機器,而一個topic又可以有多個Partition組成,因此整個集群就可以適應任意大小的數據了。
  • 可以提高并發,因為可以以Partition為單位讀寫了。

如何保證數據可靠性:

為保證producer發送的數據,能可靠的發送到指定的topic,topic的每個partition收到producer發送的數據后,都需要向producer發送ack(acknowledgement確認收到),如果producer收到ack,就會進行下一輪的發送,否則重新發送數據。

副本的同步策略:
方案優點缺點
半數以上完成同步,就發送ack延遲低選舉新的leader時,容忍n臺節點的故障,需要2n+1個副本
全部完成同步,才發送ack選舉新的leader時,容忍n臺節點的故障,需要n+1個副本延遲高

Kafka選擇了第二種方案,原因如下:

  1. 同樣為了容忍n臺節點的故障,第一種方案需要2n+1個副本,而第二種方案只需要n+1個副本,而Kafka的每個分區都有大量的數據,第一種方案會造成大量數據的冗余。
  2. 雖然第二種方案的網絡延遲會比較高,但網絡延遲對Kafka的影響較小。
ACK應答機制:

Kafka為用戶提供了三種可靠性級別,用戶根據對可靠性和延遲的要求進行權衡,選擇以下的配置。acks參數配置:

  • 0:producer不等待broker的ack,這一操作提供了一個最低的延遲,broker一接收到還沒有寫入磁盤就已經返回,當broker故障時有可能丟失數據;
  • 1:producer等待broker的ack,partition的leader落盤成功后返回ack,如果在follower同步成功之前leader故障,那么將會丟失數據;
  • -1(all):producer等待broker的ack,partition的leader和follower全部落盤成功后才返回ack。但是如果在follower同步完成后,broker發送ack之前,leader發生故障,那么會造成數據重復。

消費者:

消費方式:

consumer采用pull(拉)模式從broker中讀取數據;push(推)模式很難適應消費速率不同的消費者,因為消息發送速率是由broker決定的。它的目標是盡可能以最快速度傳遞消息,但是這樣很容易造成consumer來不及處理消息,典型的表現就是拒絕服務以及網絡擁塞。而pull模式則可以根據consumer的消費能力以適當的速率消費消息。

pull模式不足之處是,如果kafka沒有數據,消費者可能會陷入循環中,一直返回空數據。針對這一點,Kafka的消費者在消費數據時會傳入一個時長參數timeout,如果當前沒有數據可供消費,consumer會等待一段時間之后再返回,這段時長即為timeout。

分區分配策略:

一個consumer group中有多個consumer,一個 topic有多個partition,所以必然會涉及到partition的分配問題,即確定那個partition由哪個consumer來消費。

Kafka有兩種分配策略,一是roundrobin,一是range。

offest維護:

由于consumer在消費過程中可能會出現斷電宕機等故障,consumer恢復后,需要從故障前的位置的繼續消費,所以consumer需要實時記錄自己消費到了哪個offset,以便故障恢復后繼續消費。

Kafka 0.9版本之前,consumer默認將offset保存在Zookeeper中,從0.9版本開始,consumer默認將offset保存在Kafka一個內置的topic中,該topic為__consumer_offsets。

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

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

相關文章

Linux中解決普通用戶使用不了sudo問題

目錄 sudo的使用場景sudo使用不了的原因解決方法 sudo的使用場景 之前我們介紹了文件的權限問題 如果一個普通用戶想去執行一個它命令之外的權限,只能使用sudo 比如普通用戶使用yum去安裝軟件,需要sudo yum xxxx sudo使用不了的原因 這里我們用普通用戶…

小恐龍跳一跳源碼

小恐龍跳一跳源碼是前兩年就火爆過一次的小游戲源碼,不知怎么了今年有火爆了,所以今天就吧這個源碼分享出來了!有喜歡的直接下載就行,可以本地單機直接點擊index.html進行運行,又或者放在虛擬機或者服務器上與朋友進行…

python 獲取視頻的時長

以下是幾種獲取視頻時長的實現方法: 方法一:使用moviepy庫 from moviepy.editor import VideoFileClipdef get_video_duration(file_path):video VideoFileClip(file_path)duration video.durationvideo.close()return duration 方法二:…

SAP-FICO-憑證編號控制

成本憑證編號KANK 如果自己的公司下沒有,直接復制系統原有的就可以。使用系統默認即可。 如果不維護 會報錯“CO-憑證編號分配對于成本控制范圍****中的商業事務COIN無效” 財務憑證編號FBN1 可以用OBH2批量復制編號范圍。 物料賬期MMPV 財務賬期OB52

python使用base加密解密

原理 base編碼是一種加密解密措施,目前常用的有base16、base32和base64。其大致原理比較簡單。 以base64為例,base64加密后共有64中字符。其加密過程是編碼后將每3個字節作為一組,這樣每組就有3*824位。將每6位作為一個單位進行編碼&#xf…

1個逗號,提升Python代碼質量

有些時候,我們會在Python代碼中看到列表或其他科迭代對象的結尾會存在一個逗號: 而且編輯器和解釋器都容許這種逗號的存在,它就叫作拖尾逗號。 通常是為了在頻繁地增減數組元素的時候同時保證語法的正確,且拖尾逗號不占用數組的長…

MySQL 主備環境搭建 docker

MySQL 主備環境搭建 docker 拉取docker鏡像 sudo docker pull mysql:8.0 啟動容器 docker run -p 3339:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD123456 -d mysql:8.0docker run -p 3340:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD123456 -d mysql:8.0配置 M…

第四十二天 | 背包問題理論

二維: 1.dp[i][j] 表示從下標為[0-i]的物品里任意取,放進容量為j的背包,價值總和最大是多少。 2.遞歸公式: dp[i][j] max(dp[i - 1][j], dp[i - 1][j - weight[i]] value[i]); 3.初始化: 首先從dp[i][j]的定義出發…

基于xilinx fpga RFSOC系列的Ultrascale+ RF Data Converter ip詳解說明

目錄 1 概述2 IP功能2.1 ADC性能2.2 DAC性能3 IP端口4 代碼框架4.1 ADC功能框圖4.2 DAC功能框圖5 收發數據時序5.1 ADC數據格式5.2 DAC數據格式6 時鐘配置6.1 ADC/DAC參考時鐘7 數據格式配置模式7.1 ADC的配置模式7.1.1 Real -> real;7.1.2 Real ->IQ;7.1.3 IQ -> IQ;…

【設計模式】JAVA Design Patterns——Bridge(橋接模式)

🔍目的 將抽象與其實現分離,以便二者可以獨立變化。 🔍解釋 真實世界例子 考慮一下你擁有一種具有不同附魔的武器,并且應該允許將具有不同附魔的不同武器混合使用。 你會怎么做? 為每個附魔創建每種武器的多個副本&…

當代人工智能三教父——深度學習三巨頭

文章目錄 引言 人物介紹 突出貢獻 專業名詞解釋 引言 今天下午閑來無事翻閱了一下csdn首頁的頭條文章——《27 歲天才創始人 Joel Hellermark 分享了自己和“AI 教父” Geoffery Hinton 的最新采訪》 感覺挺有意思,就從頭到尾的看了一遍,里面有很多…

pyqt5與yolov5進行視頻檢測(一)——登錄操作

項目效果展示 一、登錄界面 二、主界面 目前在更新中。。。 一、設計 二、登錄代碼 注意:下面會導入主界面的包,圖片資源自己設計一下,密碼保存時沒設計加密,需要自行設計 main_window主界面下文會設計from main_window impor…

無線通信的穿墻能力主要取決于哪些指標

無線通信的穿墻能力是指無線信號在穿越建筑物墻壁時,其信號衰減程度以及能否維持足夠強度以進行穩定通信的能力。穿墻能力的好壞直接影響到無線通信在室內環境中的覆蓋范圍和使用體驗。 一、無線信號的頻率 無線信號的頻率是影響穿墻能力的重要因素之一。一般來說…

工行音視頻服務平臺建設與應用經驗

近些年來,伴隨著技術能力的積累突破,音視頻服務開始蓬勃生長走進千家萬戶,使用遠程視頻通話、觀看各類視頻直播逐漸成為人們的日常,而金融服務作為社會生活的重要組成部分,自然需要積極擁抱應用新技術。 如今&#xff…

怎么知道Python包的依賴項

要查看Python包的依賴項,有幾種方法可以做到這一點: 使用pip: pip是Python的包管理器,它允許你安裝和管理Python庫。要查看一個包的依賴關系,你可以使用pip show命令加上包名,但請注意,直接用pip show并不直接列出依賴項,它提供包的詳細信息,包括它的安裝路徑。為了查看…

Kubernetes Deployment 之擴縮容與滾動更新

Kubernetes Deployment 之擴縮容與滾動更新 Deployment 擴縮容 擴縮容非常簡單,我們可以直接調整 replica 副本數目,然后 kubectl apply指定進行動態更新。下面將nginx-deployment動態改為 1 個 Pod 和 3 個 Pod 的操作 apiVersion: apps/v1 kind: De…

20232820 2023-2024-2 《網絡攻防實踐》實踐十一報告

20232820 2023-2024-2 《網絡攻防實踐》實踐十一報告 1.實踐內容 web瀏覽器滲透攻擊 任務:使用攻擊機和Windows靶機進行瀏覽器滲透攻擊實驗,體驗網頁木馬構造及實施瀏覽器攻擊的實際過程 取證分析實踐—網頁木馬攻擊場景分析 攻防對抗實踐—web瀏覽…

非關系型數據庫NOSQL

文章目錄 1. NOSQL 概述2. 相關理論基礎2.1 一致性2.2 分區2.3 存儲分布2.4 查詢模型 3. NOSQL 數據庫的種類3.1 文檔存儲3.2 鍵值存儲3.3 列存儲3.3 圖存儲 4. NOSQL 應用案例和新技術4.1 HBase 數據庫4.2 云數據庫 GeminiDB 非關系型的數據庫 NOSQL (Not Only SQL)是對不同于…

linux-x86_64-musl 里面的musl是什么意思?

在一些開源庫里面可以看到,linux-x86_64-musl類似于這樣的字符串,這個musl是什么意思呢? 在字符串 "linux-x86_64-musl" 中,musl 指的是 musl libc,這是一個輕量級的 C 標準庫實現。 讓我們來拆解一下這個字…

Linux系統(ubuntu)掛載jffs2文件系統

一. 掛載操作 1、加載mtdram模塊: sudo modprobe mtdram total_size16384//total_size后面跟的參數單位是KB,并且其大小要大于jffs2鏡像文件的大小 2、sudo modprobe mtd 3、sudo modprobe mtdblock 4、sudo modprobe jffs2 5、拷貝jffs2鏡像文件到/dev…