Kafka 集群如何實現數據同步?

来源:https://www.cnblogs.com/edisonfish/archive/2023/11/16/17837100.html
-Advertisement-
Play Games

哈嘍大家好,我是鹹魚 最近這段時間比較忙,將近一周沒更新文章,再不更新我那為數不多的粉絲量就要庫庫往下掉了 T﹏T 剛好最近在學 Kafka,於是決定寫篇跟 Kafka 相關的文章(文中有不對的地方歡迎大家指出) 考慮到有些小伙伴可能是第一次接觸 Kafka ,所以先簡單介紹一下什麼是 Kafka ...


哈嘍大家好,我是鹹魚

最近這段時間比較忙,將近一周沒更新文章,再不更新我那為數不多的粉絲量就要庫庫往下掉了 T﹏T

剛好最近在學 Kafka,於是決定寫篇跟 Kafka 相關的文章(文中有不對的地方歡迎大家指出)

考慮到有些小伙伴可能是第一次接觸 Kafka ,所以先簡單介紹一下什麼是 Kafka 吧!

Kafka 介紹

Kafka 是一個高吞吐的分散式消息系統,不但像傳統消息隊列(RaabitMQ、RocketMQ等)那樣能夠【非同步處理、流量消峰、服務解耦】

還能夠把消息持久化到磁碟上,用於批量消費。除此之外由於 Kafka 被設計成分散式系統,吞吐量和可用性大大提高

Kafka 角色

  • kafka 客戶端
    • 生產者(producer):也叫發佈者,負責創建消息
    • 消費者(consumer):也叫訂閱者,負責消費(讀取)消息
  • Kafka 服務端(broker)
    • leader:對外提供讀寫服務
    • follower:不提供服務,負責向 leader 同步數據

Topic(主題)和 partition(分區)

topic 就是消息發佈的地方,消費者通過訂閱 topic 來消費到對應的消息

為了提高吞吐量,實現 topic 的負載均衡,Kafka 在 topic 下又引用了分區(partition)的概念,每個 topic 可以被劃分成多個分區

分區允許消息在 Topic 下水平分割和存儲,每個分區都是一個有序且不可變的消息隊列,消費者可以以並行的方式消費同一個 topic 中的消息

PS:topic 是邏輯上的概念,消息真正是存儲到 partition 中去的

例如某個 topic 下被劃分成 n 個分區,那麼這個 topic 的併發度就提高 n,同時可以支持 n 個 consumer 並行消費該 topic 中的消息

log(日誌)

對於每一個 topic ,Kafka 都會維護一個分區日誌

每個分區都是一個有序的、不可變的消息隊列,且可以持續地添加消息。消息在分區中分配了唯一的序列號,被稱為偏移量(Offset)

offset 用來唯一的標識分區中每一條記錄

Kafka 會保留所有分區中的消息,不會自動刪除消息。消息的保留策略由 Kafka 配置參數控制,消息可以在一定時間或達到一定大小後過期,過期的消息會被刪除

消費者在 Kafka 中只保留自己的 Offset,用於標識它在分區中的位置。通常情況下,當 消費者消費消息時,它的 Offset 會線性增加,表示它已經消費了這些消息

消費者可以選擇將 Offset 重置為更舊的值,從而重新開始讀取消息

每個消費者實例唯一負責一個分區,Kafka 只保證分區內的記錄是有序的,而不保證主題中不同分區的順序

Kafka 集群

Kafka 是分散式架構,有集群(cluster)的概念

Kafka 中的一個實例被稱為 broker,它接收生產者的消息並存入磁碟,消費者連接 broker 消費消息

多個 broker 組成一個 Kafka cluster,集群內某個 broker 會成為集群控制器(cluster controller),負責管理整個 Kafka 集群,包括分配分區給 broker,監控 broker 等

分區被覆製成了多個副本(replica)然後均分在不同的 broker 上 ,其中一個副本 Leader,其他的是 Follower

創建副本的單位是 topic 的 分區

正常情況下,每個分區都有一個 leader 和零或多個 followers 。這樣即使某個 broker 發生故障,其他 broker上的副本仍然可以繼續提供服務

那如何將所有的副本均勻分佈在不同 broker 上呢?

分配副本的演算法如下:

  • 將所有 broker(假設共 n 個 broker)和待分配的分區排序
  • 將第 i 個分區分配到第(i mod n)個 broker上
  • 將第 i 個分區的第 j 個副本分配到第((i + j) mode n)個 broker 上

如何實現數據同步?

我們先來看下 Kafka 中的 ISR(In-Sync Replicas) 機制

既然每個 leader 下麵都有至少一個 follower,於是便有了 ISR,ISR 就是 Kafka 動態維護的一組同步副本集合

ISR 中所有的 follower 都與 leader 保持同步狀態,而且 leader 也在 ISR 列表中,只有在自己 ISR 列表中的副本才能參與 leader 競選

當生產者寫入數據時,leader 更新數據,follower 是怎麼知道 leader 更新然後去同步數據的呢?

follower 會通過定期向 leader 發送 fetch 請求來實現數據同步,這個是由 fetcher 線程來負責的

當一個副本被選舉成為 follower 後,會啟動副本的 fetcher 線程,隨後 Follower 會定期向 Leader 發送心跳請求,以保持連接,併發送 fetch 請求來獲取最新的數據

如果 follower 發現自己的 LEO(Log End Offset,日誌結束偏移量)與 Leader 的 LEO 有差距時,會觸發同步數據請求,以便將自身日誌同步至 Leader 的對應位置,確保與 Leader 的數據保持一致

如果一個 follower 在指定時間內(配置欄位為 replica.lag.time.max.ms)沒有發送 fecth 請求或者沒有追上 leader 的 LEO,就會從 ISR 中移除

最後總結一下:

  • Kafka 中的 topic 是邏輯概念,每個 topic 可以被劃分為多個分區,而分區才是存儲消息的實體
  • 每一個分區會被覆製成多個副本,然後選取其中一個副本當作 leader,剩下的則是 follower
  • follower 會定期去向 leader 發送 fetch 請求來保證數據的同步
  • leader 不會關心 follower 的數據是不是同步好了的,只要你在指定時間內沒有找我來 fetch ,我就把你從 ISR 中剔除出來

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 我希望在職業生涯早期就開始做的事情和我希望以不同的方式做的事情。 大家好,我已經做了八年半的軟體工程師。這篇文章來源於我最近對自己在職業生涯中希望早點開始做的事情以及希望以不同方式做的事情的自我反思。 我在這裡分享的對任何希望提高和進步到高級甚至更高職位的初級至中級開發者都很有用。 0 大綱 我的職 ...
  • 資料庫事務是什麼?事務的四大特性是什麼? 1.資料庫事務 事務是一組原子性的 SQL 語句,或者說一個獨立的工作單元。如果資料庫引擎能夠成功地對資料庫應用該組操作的全部語句,那麼就執行該組查詢。如果其中任何一條語句因為崩潰或其他原因無法執行,那麼所有的語句都不會執行。也就是說,事務內的語句,要麼全部 ...
  • 學習視頻:【孫哥說Spring5:從設計模式到基本應用到應用級底層分析,一次深入淺出的Spring全探索。學不會Spring?只因你未遇見孫哥】 第四章、註入(Injection) 1.什麼是註入 通過Spring工廠及配置文件,為所創建對象的成員變數賦值 1.1為什麼需要註入 “通過編碼的方式,為 ...
  • 公眾號「架構成長指南」,專註於生產實踐、雲原生、分散式系統、大數據技術分享。 在本文中,我們將討論一些重要且常見的 Java Lambda 表達式面試問題和解答 1.什麼是 Lambda 表達式? lambda表達式只是一個沒有任何名稱的函數,它甚至可以用作函數中的參數,Lambda 表達式有利於函 ...
  • 目錄abstract class 和 interface 有什麼區別1.抽象類1.1抽象類的格式1.2抽象類註意事項2.介面2.1介面的格式2.2介面可以多繼承2.3介面的實現(implements)3.異同 abstract class 和 interface 有什麼區別 1.抽象類 抽象類:聲明 ...
  • 日誌在程式中的重要性非常的重要,當系統發生故障時,我們要隨時能排查出相關的日誌,細數日誌在Rust中的定義依賴及其實現。 ...
  • 本文討論了一次故障排查的過程,通過監控工具和分析信息,但最終沒有找到根本原因。文章強調了故障排查的複雜性和重要性,提醒保持冷靜和耐心,在團隊合作和知識共用的基礎上解決問題,並總結了從這次故障中學到的經驗和教訓。 ...
  • 前言 看過不少關於 await 的原理的文章,也知道背後是編譯器給轉成了狀態機實現的,但是具體是怎麼完成的,回調又是如何銜接的,一直都沒有搞清楚,這次下定決心把源碼自己跑了下,終於豁然開朗了 本文的演示代碼基於 VS2022 + .NET 6 示例 public class Program { st ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...