Kafka之Broker原理

1. 日志數據的存儲

1.1 Partition

1. 為了實現橫向擴展,把不同的數據存放在不同的 Broker 上,同時降低單臺服務器的訪問壓力,我們把一個Topic 中的數據分隔成多個 Partition
2.?每個 Partition 中的消息是有序的,順序寫入,但是全局不一定有序
3.?在服務器上,每個 Partition 都有一個物理目錄( TopicN )后面的數字代表分區

?

1.2 Replica副本

1. 為了提高分區的可靠性, Kafka 設計了副本機制
2.?副本數必須小于等于節點數,而不能大于 Broker 的數量
3.?Leader 對外提供讀寫服務, Follower 唯一的任務就是從 Leader 異步拉取數據

?

1.3 Segment段

1.?為了防止Log不斷追加導致文件過大,導致檢索消息效率變低,一個Partition又 被劃分成多個Segment來組織數據.

在這里會有3個配置,也就是log的閾值配置。什么時候下進行分段

  • log.segment.bytes :根據日志文件大小
  • log.roll.hours log.roll.ms :根據時間戳差值

    log.index.size.max.bytes:根據索引文件大小

每一個segment都是由一個log文件和2個index文件組成的,其中時間戳索引的創建方式可以自定義的執行createTime或LogAppendTime.默認是creareTime

?1.4 Sparse Index(稀疏索引)

索引文件的查看可以通過以下命令進行查看

?kfaka索引文件中記錄的Offset不是連續的,而是采用了稀疏索引。根據配置的大小,稀疏索引記錄的是從Log中的哪個位置開始檢索,比如配置的是4kb,則當log文件中向下存儲的數據達到4kb的話,就會記錄一個索引值

?1.5 分區副本在Broker上的分布

創建一個topic

./kafka-topics.sh--bootstrap-server192.168.61.101:9092--create--topic3p3r--partitions3--replication-factor3

?假設配置的是3p3r,則我們看下服務器上的存儲

查看Topic信息

./kafka-topics.sh--bootstrap-server192.168.61.101:9092--describe--topic3p3r

?其中 Partition是分區,Leader后面代表的是在哪臺服務器上,Replicas就是副本信息,ISR是個副本隊列

?假設配置的是4p2r,則物品們查看topic信息如圖所示

創建、查看topic

./kafka-topics.sh --bootstrap-server 192.168.61.101:9092 --create --topic 4p2r --partitions 4 --replication-factor 2
./kafka-topics.sh --bootstrap-server 192.168.61.101:9092 --describe --topic 4p2r

?假設我們配置的是6p2r

由以上我們可以看出,副本分配的兩個基本原則和規律

1、副本會被平均分布在所有的Broker之上

2 partition 的多個副本應該分配在不同的 Broker

基于上面的規則,分區副本最終落入哪個節點,還會收到兩個隨機數的影響

1、第一個隨機數:startIndex,決定了第一個分區的第一個副本的放置位置

2 、第二個隨機數: nextReplicaShift ,決定了分區中,副本跟副本的間距nextReplicaShift%(BrokerSize-1)

這樣設計的目的在于提高Broker服務器的容災能力?

2. 消息保留與清理機制

對于一些太久的日志,我們需要一定的清理策略。

當開啟清理策略后,有兩種方式提供開發者選擇

log.cleanup.policy=delete (默認項) // 刪除策略
log.cleanup.policy=compact? ? // 壓縮策略

?2.1 刪除策略(delete)

kafka可以通過定時任務實現日志數據的刪除,默認5分鐘執行一次

log.retention.check.interval.ms=300000

那么要刪除什么樣的數據呢?kafka提供了兩個緯度以及對應不同的配置

時間緯度

log.retention.hours(默認值是168個小時,時間戳超過的數據會被刪除)

log.retention.minutes (默認值是空,優先級比小時高)
log.retention.ms (默認值是空,優先級比分鐘高)

若產生消息的速度不均勻,有時多、有時少,就可以根據日志大小刪除

log.retention.bytes (表示所有日志文件的總大小,默認值是 -1 ,代表不限制大小)
log.segment.bytes (對單個 Segment 文件大小進行限制,默認值 1G

?2.2 壓縮策略(compact)

若設置為壓縮策略compact,則表示不清楚日志,只對日志數據進行壓縮處理

思考問題: 如果同一個key重復寫入多次,是會存儲多次?還是會更新?

kafka中是存儲多次的,如:?_ _consumer_offsets

那么壓縮策略是怎么做的呢?(將相同的key進行去重壓縮)

3. Broker高可用架構

高可用,無非就是選舉機制、數據的一致性也就是主從同步,以及對于故障的處理,由于kafka是直接數據存儲在磁盤中的,因此無需考慮持久化,Broker的高可用 涉及到一系列的動作?

  • 選舉出一個Controller
  • 從分區中選舉出Leader角色
  • 主從同步
  • Replica故障處理

3.1 選舉機制

3.1.1 Controller選舉

Controller其實就是一個Broker,由它來負責選舉出新的Leader,那么Controller是怎么選舉出來的呢

?3.1.2 分區副本Leader的選舉

在講解Leader選舉前,我們先復習以下博客Kafka之Producer原理-CSDN博客中提到的ISR機制的幾個概念

AR Assigned-Replicas ),一個分區所有的副本
ISR In-Sync Replicas ),在 AR 中,跟 Leader 保持積極同步數據的副本
OSR Out-Sync-Replicas ),在 AR 中,跟 Leader 同步滯后的副本
AR = ISR + OSR
  • ?當Leader副本發生故障時,只有在ISR中的副本才能參與新Leader的選舉
    • 問題:如果ISR為空呢? unclean.leader.election.enable配置為false OSR也可以進行選舉
  • Kafka采用了類似于繼位傳嫡的選舉協議,選擇ISR中位置靠前的節點成為新的Leader.

3.2 主從同步

從節點和主節點的同步過程如下:

1 、首先, Follower 節點向 Leader 發送一個 fetch 請求
2 、然后, Leader Follower 發送數據
3 、接著, Follower 接收到數據響應后,依次寫入消息、并更新 LEO
4 、最后, Leader 更新 HW ISR 最小的 LEO
5 、循環上述過程,直至所有 Follower 完成數據同步

?整體流程圖如下所示:

?

?

?Kafka設計的ISR復制,既可以在保障數據一致性,又可以提供高吞吐量(ISR隊列中清除響應不積極的Follower節點)

3.3 Replica故障處理

  • Follower發生故障,會被先提出ISR,Follower恢復之后,從HW開始同步數據
  • Leader發生故障,會先選舉出一個新的Leader,其它的Follower將高于HW的消息截取掉,然后從新的Leader同步數據

4. 總結

? ? ? ? 本文介紹Broker服務器,主要講了Broker中日志的存儲,從大到小依次為Partition、Segment,副本機制的具體存儲形式,是怎么進行負載均衡和容災保障的,在Segment中我們直到了Segment是由一個Log文件和兩個索引文件組成的,索引文件主要起的是一個提升查詢效率的作用。隨后當kafka中log文件過大的時候,kagka中提供了兩種維度上的刪除策略以及相同key去重壓縮的compact策略。最后,kafka高可用中的選舉機制是先到先得選舉Controller,再根據ISR副本隊列嫡長子繼位的算法進行Leader的選舉;以及Kafka中的主從同步是以高水位HW為界限,不斷的同步數據,直到LEO值相等完成數據的同步。最后講到了副本故障的處理,針對follwe節點故障,則直接踢出ISR隊列,Leader故障,就會觸發選舉機制,選舉出一個新的Leader,最后數據從LEO處以上的開始同步,高于HW的消息全部截斷。

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

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

相關文章

LeetCode刷題:反轉鏈表

leetCode真題 206. 反轉鏈表 屬于基礎簡單題目 常見的做法有遞歸和while循環 遞歸 // 1. 遞歸參數和返回值public static ListNode reverseList(ListNode head) {// 1. 遞歸終止條件if (head null || head.next null) {return head;}// 遞歸邏輯ListNode last reverseL…

達夢數據庫相關SQL及適配Mysql配置總結

🍓 簡介:java系列技術分享(👉持續更新中…🔥) 🍓 初衷:一起學習、一起進步、堅持不懈 🍓 如果文章內容有誤與您的想法不一致,歡迎大家在評論區指正🙏 🍓 希望這篇文章對你有所幫助,歡…

解決Python導入第三方模塊報錯“TypeError: the first argument must be callable”

注意以下內容只對導包時遇到同樣的報錯會有參考價值。 問題描述 當你嘗試導入第三方模塊時,可能會遇到如下報錯信息: TypeError: the first argument must be callable 猜測原因 經過仔細檢查代碼,我猜測這個錯誤的原因是由于變量名沖突所…

Windows 系統安裝 VisualSVN Server

一.下載 VisualSVN Server VisualSVN-Server 是 SVN 版本控制中服務器端要使用的軟件,就是我們提交代碼存在安裝這個軟件的電腦上,它將很多配置和服務直接幫你完成,簡單好用容易上手。VisualSVN Server有三個版本,社區版免費但限15個用戶,另有一般和‘企業’兩個收費版本…

如何卸載ollama

文章目錄 一 概述二 卸載2.1 Windows平臺卸載 ollama2.2 Linux 平臺卸載 ollama2.3 Docker 平臺卸載 ollama 參考鏈接 一 概述 本文檔主要講述 ollama 如何卸載,適用范圍包括 Windows Linux 以及 Docker 等平臺的安裝方式。 二 卸載 2.1 Windows平臺卸載 ollama …

學習C++應該做點什么項目

C作為一門底層可操作性很強的語言,廣泛應用于游戲開發、工業和追求性能、速度的應用。 比如騰訊,無論游戲,還是微信,整個鵝廠后臺幾乎都是 C 開發,對 C 開發者的需求非常大。 但問題是C入門和精通都比較困難&#xf…

有哪些掙錢軟件一天能賺幾十元?盤點十個能長期做下去的掙錢軟件

在這個信息爆炸的時代,每個人都在尋找快速賺錢的秘訣。很多人做兼職副業的目標并不是獲得很大的成功,大部分人一天能賺幾十就心滿意足了。 今天,我要帶你一探究竟,揭秘那些能讓你日賺幾十元的掙錢軟件。準備好了嗎?讓我…

單槍匹馬月入17萬美元:數字游民Pieter Levels如何成就商業傳奇

了解數字游民的應該都聽說過 Pieter Levels,可以說他是數字游民的先驅人物。 他在推特上擁有超過43萬的粉絲,僅憑一臺筆記本電腦就連續建立了多個高盈利網站,光是推特主頁上展示的比較新的幾個網站,每月收入加起來就高達 17.6 萬…

第九周:員工激勵理論

1. 關注自己到關注他人 你是激勵者,也會是被激勵者。 雖然每個人的價值觀不一樣,但要做好激勵員工這件事情,我覺得可以從自身角度出發,可以問問自己,你是如何被激勵的? 如果是我,就只想要錢&…

如何實現區域公司和專業公司合理有效的銜接?

對于集團公司來說,各區域公司、專業公司的管理問題成為困擾管理者的難題。特別是在信息壁壘比較嚴重的情況下,各個單位往往各自為政、自行其是,缺乏有效的溝通和協作,導致整體管理效率低下。那么應該如何實現區域公司和專業公司合…

Vulnhub項目:THE PLANETS: MERCURY

1、靶場地址 The Planets: Mercury ~ VulnHubThe Planets: Mercury, made by SirFlash. Download & walkthrough links are available.https://vulnhub.com/entry/the-planets-mercury,544/ 這好像是個系列的,關于星球系列,之前還做過一個地球的&a…

滑動窗口最大值-力扣

在做這道題時,首先想到的解法是使用隊列來做,維護一個隊列,每次保存滑動窗口大小的長度,并判斷此時隊列中的最大值,但這樣做,在k的值較大時,出現了超時問題,代碼如下: c…

STM32-15-DMA

STM32-01-認識單片機 STM32-02-基礎知識 STM32-03-HAL庫 STM32-04-時鐘樹 STM32-05-SYSTEM文件夾 STM32-06-GPIO STM32-07-外部中斷 STM32-08-串口 STM32-09-IWDG和WWDG STM32-10-定時器 STM32-11-電容觸摸按鍵 STM32-12-OLED模塊 STM32-13-MPU STM32-14-FSMC_LCD 文章目錄 STM…

[原創][Delphi多線程]TThreadedQueue的經典使用案例.

[簡介] 常用網名: 豬頭三 出生日期: 1981.XX.XX QQ: 643439947 個人網站: 80x86匯編小站 https://www.x86asm.org 編程生涯: 2001年~至今[共22年] 職業生涯: 20年 開發語言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 開發工具: Visual Studio、Delph…

悉數六大設計原則

悉數六大設計原則 目錄 悉數六大設計原則前言?誰發明了設計模式設計原則設計原則與設計模式的關系 單一職責什么是單一職責不遵循單一職責原則的設計遵循單一職責原則的設計單一職責的優點示例代碼: 里氏替換原則什么是里氏替換原則示例代碼:違反里氏替…

解讀信創產業根基,操作系統發展歷程

信創產業根基之一操作系統 操作系統是一個關鍵的控制程序,負責協調、管理和控制計算機硬件和軟件資源。作為硬件的首要軟件擴展,它位于裸機與用戶之間,充當了兩者之間的橋梁。通過其核心程序,操作系統高效地管理著系統中的各類資源…

static修飾變量和函數

static修飾的變量和函數只能在定義它的cpp源文件中使用,如果在頭文件中定義,則需要注意 在頭文件中定義static變量和static函數: 變量 如果在頭文件中定義了static變量,那么,所有包含這個頭文件的源文件都會定義自己…

vm-bhyve虛擬機安裝ubuntu22版本后進入grub無法啟動

問題:安裝ubuntu22版本后無法啟動 安裝好ubuntu22之后,重啟進入了grub模式,沒有自動啟動ubuntu 網上查了一下,這算一個通病。 問題解決 在grub模式下輸入boot命令: boot (lvm/ubuntu--vg-ubuntu--lv)/boot error: …

有哪些兼職軟件一天能賺幾十元?盤點十個能長期做下去的掙錢軟件

在當今這個信息泛濫的時代,眾人紛紛尋求迅速致富的捷徑。許多人在從事兼職或副業時,并不期望取得巨大的成就,只要每天能額外收入數十元,便已心滿意足。 今天,我將帶領大家深入探究,揭開那些隱藏在日常生活…

【小海實習日記】Git使用規范

1.Git使用流程 1.1 從master分支拉一個分支,命名要符合規范且清晰。 1.2 commit到本地,push 到遠端。 1.3 在Gitlab創建MR,選擇develp分支。 1.4 如果要修改的話,先把Gitlab上的MR修改為Draft(修改態),然后在本地修改代…