Kafka入門-Broker以及文件存儲機制

Kafka Broker

Broker實際上就是kafka實例,每一個節點都是獨立的Kafka服務器。

Zookeeper中存儲的Kafka信息

在這里插入圖片描述

節點的服役以及退役

服役

首先要重新建立一臺全新的服務器105,并且在服務器中安裝JDK、Zookeeper、以及Kafka。配置好基礎的信息之后,再將節點加入到kafka集群之中。如果是直接拷貝配置好的主機一定要先修改主機的ip地址以及主機名,那么一定要移除kafka的broker.id并且要刪除kafka安裝目錄下的datas以及logs下的所有文件,不然復制的主機和被復制的主機會產生沖突。

rm -rf datas/ logs/

將節點加入到kafka集群之中,只需要在105機器中的kafka安裝目錄下執行啟動命令

bin/kafka-server-start.sh -daemon config/server.properties

啟動之后,kafka就會將自己的broker.id注冊到zookeeper中,這樣就加入了kafka集群。此時雖然加入了集群,但是并沒有跟101、102、103之間同步數據,相當于沒有起到作用。此時需要執行負載均衡操作,讓105能夠和其他三臺主機一起共同工作。

首先在安裝目錄下創建一個新文件(直接操作101主機即可)

vim topics-to-move.json
{"topics":[{"topic":"first"}],"version":1
}

執行生成負載均衡計劃命令,為0,1,2,3生成負載均衡計劃,系統會生產一個負載均衡計劃

bin/kafka-reassign-partitions.sh --bootstrap-server 192.168.27.101:9092 --topics-to-move-json-file topics-to-move.json --broker-list "0,1,2,3" --generate

查看計劃如果滿足要求,那么復制計劃,并新建一個文件將復制的計劃粘貼到文件中

vim increase-replication-factor.json

執行副本存儲計劃

bin/kafka-reassign-partitions.sh --bootstrap-server 192.168.27.101:9092 --reassignment-json-file increase-replication-factor.json --execute

驗證副本執行計劃

bin/kafka-reassign-partitions.sh --bootstrap-server 192.168.27.101:9092 --reassignment-json-file increase-replication-factor.json --verify

此時105主機就承擔了一部分的副本存儲壓力,此時才正式服役。

退役舊節點

退役一臺節點時,直接再執行一次負載均衡計劃,比如退役105主機,105的broker.id=3

首先創建文件

vim topics-to-move.json
{"topics":[{"topic":"first"}],"version":1
}

執行生成負載均衡計劃命令,只為0,1,2生成負載均衡計劃,系統會生產一個負載均衡計劃

bin/kafka-reassign-partitions.sh --bootstrap-server 192.168.27.101:9092 --topics-to-move-json-file topics-to-move.json --broker-list "0,1,2" --generate

查看生成的計劃,如果滿足要求,那么復制計劃,并將復制的計劃粘貼到文件increase-replication-factor.json中

vim increase-replication-factor.json

執行副本存儲計劃

bin/kafka-reassign-partitions.sh --bootstrap-server 192.168.27.101:9092 --reassignment-json-file increase-replication-factor.json --execute

驗證副本執行計劃

bin/kafka-reassign-partitions.sh --bootstrap-server 192.168.27.101:9092 --reassignment-json-file increase-replication-factor.json --verify

此時105主機就可以直接停止進行退役。

副本

Kafka使用副本來提高數據可靠性,kafka默認使用一個副本,但是在生產環境中一般配置兩個,保證數據可靠性。副本不是越多越好,會增加磁盤存儲空間,增加網絡中的數據傳輸,降低效率。

Kafka副本中分為Leader和Follower,Kafka生產者只會把數據發往Leader,然后Follower主動找Leader同步數據。

Kafka分區中的所有副本統稱為AR(Assigned Repllicas)

AR=ISR+OSR

ISR:能夠和Leader保持同步的Follower集合,ISR包含Leader本身,如果Follower長時間未向Leader發送通信請求或者同步數據,那么該Follower就會被踢出ISR。該時間閾值由replica.lag.time.max.ms參數設定,默認30s,Leader發生故障之后就會從ISR中選舉新的Leader。

OSR:表示在Follower與Leader同步時,延遲過多的副本。

Leader的選舉流程

在這里插入圖片描述

如圖所示,Leader的選舉由AR中的順序以及是否在ISR存活決定。

Follower故障處理

LEO:每個副本的最后一個offset,LEO其實就是最新的offset + 1。

HW:所有副本中最小的LEO

實際上HW就是記錄一個消息的偏移量,在這個消息之前的所有消息是Leader以及所有正常的Follower都有的消息。

在這里插入圖片描述

當Followers故障時:

  1. Followers會被臨時踢出ISR
  2. 這個期間Leeder和Follower會繼續接收數據
  3. 當Follower恢復之后,Follower會讀取本地磁盤記錄的上次HW,并且將文件高于HW的部分截取掉,然后從HW開始向Leader進行同步
  4. 當重新恢復的Follower的LEO大于等于該Partiton的HW時,就代表Follower已經基本同步了Leader的數據,可以重新加入ISR
Leader故障處理

故障處理也跟LEO、HW相關

當Leader故障時:

  1. 首先將Leader踢出ISR隊列,并從ISR隊列選出一個新的Leader
  2. 為了保證數據在各個副本中一致(數據可能會丟失或者重復),其余的Follower各自將高于HW的部分截掉,然后從新的Leader處同步數據。
分區副本分配

Kafka會為盡量均勻的分配副本在節點上,增強數據的安全性、可靠性。但是我們可以跟之前服役和退役一樣,來手動設置分區副本的分配。

正常情況下,Kafka會自動把LeaderPartition均勻分散在各個機器上,來保證每臺機器的讀寫吞吐量都是均勻的,但是如果因為某些Broker宕機,會導致Leader Partition過于集中在其他少部分幾臺的Brokers上。導致其他機器請求讀寫壓力過高。而宕機的Leader重啟之后就成了Follower Partition,讀寫請求很低,造成集群負載不均衡

文件存儲機制

Topic是邏輯上的概念,而Partiton是物理上的概念,每個Partition對應一個log文件,該log文件中存儲的是Producer生產的數據。Producer生產的數據會不斷的追加到log文件末端,為防止log文件過大導致數據定位效率低下,因此Kafka采取了分片索引機制,將每個Partition分為多個Segment。每個Segment包括,“.index"偏移量索引文件、”.log"日志文件和".timeindex"時間戳索引文件等文件,這些文件位于一個以topic名稱+分區序號為命名規則的文件夾下。

在這里插入圖片描述

在這里插入圖片描述

如果需要查看文件內容,那么可以通過kafka的命令進行查看。

[root@centos101 first-0]# kafka-run-class.sh kafka.tools.DumpLogSegments --files ./00000000000000000000.index
Dumping ./00000000000000000000.index
offset: 0 position: 0

index為稀疏索引,大約每往log文件寫入4kb數據,會往index文件寫入一條索引。參數log.index.interval.bytes默認為4kb

index文件中保存的offset為相對offset,這樣能確保offset的值所占空間不會過大,因此能將offset的值控制在固定大小

Kafka文件清除策略

Kafka默認的日志保存時間為7天,可以調整以下參數修改保存時間

  1. log.retention.hour (最低優先級)小時,默認七天
  2. log.retention.minutes 分鐘
  3. log.retention.ms (最高優先級)毫秒
  4. log.retention.check.interval.ms 負責設置檢查周期,隔一段時間檢測是否過期,默認5分鐘

日志保存時間和檢查周期要進行搭配配置,不然檢查周期過長就起不到效果。

Kafka提供的日志清理策略log.cleanup.policy有兩種:delete以及compact兩種

Delete
  1. 基于時間:默認開啟,以segment中所有記錄的最大時間戳作為該文件的過期時間戳,也就是segment中最晚過期的記錄過期,才會清除這個segment
  2. 基于大小:默認關閉,超過設置的所有日志總大小,刪除最早的segment。log.retention.bytes,默認為-1,表示無窮大
Compact

compact日志壓縮:對于相同的key的不同value值,只保留最后一個版本。開啟該策略只需修改log.cleanup.policy = compact.

在這里插入圖片描述

Kafka高效讀寫數據

  • Kafka本身是分布式集群,采用分區技術,并行度高

  • 讀數據采用稀疏索引,可以快速定位要消費的數據

  • 順序寫磁盤,寫入log文件時是一直追加到文件的末端,使用順序寫,減少了大量磁頭尋址的時間

  • 頁緩存+零拷貝技術

在這里插入圖片描述

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

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

相關文章

dexcap升級版之DexWild——面向戶外環境的靈巧手交互策略:人類和機器人演示協同訓練(人類直接帶上動捕手套采集數據)

前言 截止到25年6.6日,在沒動我司『七月在線』南京、武漢團隊的機器的前提下,長沙這邊所需的前幾個開發設備都已到齊——機械臂、宇樹g1 edu、VR、吊架 ?長沙團隊必須盡快追上南京步伐 加速前進 如上篇文章所說的, 為盡快 讓近期新招的新同…

【基于阿里云搭建數據倉庫(離線)】使用UDTF時出現報錯“FlatEventUDTF cannot be resolved”

目錄 問題: 可能的原因有: 解決方法: 問題: 已經將包含第三方依賴的jar包上傳到dataworks,并且成功注冊函數,但是還是報錯:“FlatEventUDTF cannot be resolved”,如下&#xff1a…

06 Deep learning神經網絡編程基礎 激活函數 --吳恩達

深度學習激活函數詳解 一、核心作用 引入非線性:使神經網絡可學習復雜模式控制輸出范圍:如Sigmoid將輸出限制在(0,1)梯度傳遞:影響反向傳播的穩定性二、常見類型及數學表達 Sigmoid σ ( x ) = 1 1 +

【LC實戰派】小智固件編譯

這篇寫給立創吳總,是節前答應他配合git代碼的說明;也給所有對小智感興趣的小伙伴。 請多提意見,讓這份文檔更有價值 - 第一當然是拉取源碼 - git clone https://github.com/78/xiaozhi-esp32.git 完成后,先查看固件中實際的…

有沒有 MariaDB 5.5.56 對應 MySQL CONNECTION_CONTROL 插件

有沒有 MariaDB 對應 MySQL CONNECTION_CONTROL 插件 背景 寫這篇文章的目的是因為昨晚半夜突然被call起來,有一套系統的mysql數據庫啟動失敗了。嘗試了重啟服務器也不行。讓我協助排查一下問題出在哪。 分析過程 一開始拿到服務器IP地址,就去數據庫…

初學 pytest 記錄

安裝 pip install pytest用例可以是函數也可以是類中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…

【LeetCode】算法詳解#6 ---除自身以外數組的乘積

1.題目介紹 給定一個整數數組 nums,返回 數組 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘積 。 題目數據 保證 數組 nums之中任意元素的全部前綴元素和后綴的乘積都在 32 位 整數范圍內。 請 不要使用除法,且在 O…

Kubernetes 節點自動伸縮(Cluster Autoscaler)原理與實踐

在 Kubernetes 集群中,如何在保障應用高可用的同時有效地管理資源,一直是運維人員和開發者關注的重點。隨著微服務架構的普及,集群內各個服務的負載波動日趨明顯,傳統的手動擴縮容方式已無法滿足實時性和彈性需求。 Cluster Auto…

LLMs 系列科普文(11)

目前我們已經介紹了大語言模型訓練的兩個主要階段。第一階段被稱為預訓練階段,主要是基于互聯網文檔進行訓練。當你用互聯網文檔訓練一個語言模型時,得到的就是所謂的 base 模型,它本質上就是一個互聯網文檔模擬器,我們發現這是個…

深度學習環境配置指南:基于Anaconda與PyCharm的全流程操作

一、環境搭建前的準備 1. 查看基礎環境位置 conda env list 操作說明:通過該命令確認Anaconda默認環境(base)所在磁盤路徑(如D盤),后續操作需跳轉至該磁盤根目錄。 二、創建與激活獨立虛擬環境 1. 創…

【2D與3D SLAM中的掃描匹配算法全面解析】

引言 掃描匹配(Scan Matching)是同步定位與地圖構建(SLAM)系統中的核心組件,它通過對齊連續的傳感器觀測數據來估計機器人的運動。本文將深入探討2D和3D SLAM中的各種掃描匹配算法,包括數學原理、實現細節以及實際應用中的性能對比,特別關注…

力扣160.相交鏈表

題目描述 難度:簡單 示例 思路 使用雙指針 使用指針分別指向兩個不同的鏈表進行比較 解題方法 1.首先進行非空判斷 2.初始化指針分別指向兩個鏈表 3.遍歷鏈表 while (pA ! pB): 當pA和pB不相等時,繼續循環。如果pA和pB相等,說明找…

本地項目push到git

cd /home/user/project git init 添加遠程倉庫地址 git remote add origin https://github.com/user/repo.git 創建并切換到新分支 git checkout -b swift 添加文件到暫存區 git add . git commit -m “swift訓練評測” git push -u origin swift —force #首次 git push …

uni-app學習筆記二十九--數據緩存

uni.setStorageSync(KEY,DATA) 將 data 存儲在本地緩存中指定的 key 中&#xff0c;如果有多個key相同&#xff0c;下面的會覆蓋掉原上面的該 key 對應的內容&#xff0c;這是一個同步接口。數據可以是字符串&#xff0c;可以是數組。 <script setup>uni.setStorageSyn…

GitHub 趨勢日報 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系統生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日報中的項目描述已自動翻譯為中文 &#x1f4c8; 今日獲星趨勢圖 今日獲星趨勢圖 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…

NFC碰碰卡發視頻源碼搭建與寫卡功能開發實踐

在信息快速傳播的時代&#xff0c;便捷的數據交互方式成為用戶的迫切需求。“碰一碰發視頻” 結合寫卡功能&#xff0c;為視頻分享提供了新穎高效的解決方案&#xff0c;在社交娛樂、商業推廣等場景中展現出巨大潛力。本文將詳細介紹碰一碰發視頻源碼搭建以及寫卡功能開發的全過…

詳解K8s 1.33原地擴縮容功能:原理、實踐、局限與發展

你是否有過這樣的經歷&#xff1f; 精心配置了 Kubernetes 的 Pod&#xff0c;設置了“剛剛好”的 CPU 和內存&#xff08;至少你當時是這么想的&#xff09;&#xff0c;結果應用不是資源緊張喘不過氣&#xff0c;就是像“雙十一”搶購一樣瘋狂搶占資源。 過去&#xff0c;唯…

IOS 打包賬號發布上傳和IOS Xcode證書配置

xcode下載 https://developer.apple.com/download/all/ App發布 https://appstoreconnect.apple.com/ https://appstoreconnect.apple.com/teams/83ba877c-af24-4fa5-aaf2-e9b9b6066e82/apps/6473148620/testflight/groups/eb983352-b2e2-4c29-bbb7-071bf7287795 https://devel…

【從零學習JVM|第三篇】類的生命周期(高頻面試題)

前言&#xff1a; 在Java編程中&#xff0c;類的生命周期是指類從被加載到內存中開始&#xff0c;到被卸載出內存為止的整個過程。了解類的生命周期對于理解Java程序的運行機制以及性能優化非常重要。本文會深入探尋類的生命周期&#xff0c;讓讀者對此有深刻印象。 目錄 ?…

Significant Location Change

一、Significant Location Change是什么 “Significant Location Change&#xff08;重大位置變化&#xff09;” 是蘋果 iOS 系統中一項用于在應用未主動運行時&#xff0c;監測設備位置顯著變化的功能。它主要通過基站、Wi-Fi 網絡等信號來判斷設備是否發生了有意義的位置移…