Kafka簡介

来源:http://www.cnblogs.com/BYRans/archive/2016/11/11/6054930.html
-Advertisement-
Play Games

Kafka簡介 轉載請註明出處: "http://www.cnblogs.com/BYRans/" Apache Kafka發源於LinkedIn,於2011年成為Apache的孵化項目,隨後於2012年成為Apache的主要項目之一。Kafka使用Scala和Java進行編寫。Apache Kaf ...


Kafka簡介


轉載請註明出處:http://www.cnblogs.com/BYRans/

Apache Kafka發源於LinkedIn,於2011年成為Apache的孵化項目,隨後於2012年成為Apache的主要項目之一。Kafka使用Scala和Java進行編寫。Apache Kafka是一個快速、可擴展的、高吞吐、可容錯的分散式發佈訂閱消息系統。Kafka具有高吞吐量、內置分區、支持數據副本和容錯的特性,適合在大規模消息處理場景中使用。

接下來先介紹下消息系統的基本理念,然後再介紹Kafka。

消息系統介紹

一個消息系統負責將數據從一個應用傳遞到另外一個應用,應用只需關註於數據,無需關註數據在兩個或多個應用間是如何傳遞的。分散式消息傳遞基於可靠的消息隊列,在客戶端應用和消息系統之間非同步傳遞消息。有兩種主要的消息傳遞模式:點對點傳遞模式、發佈-訂閱模式。大部分的消息系統選用發佈-訂閱模式。

點對點消息系統

在點對點消息系統中,消息持久化到一個隊列中。此時,將有一個或多個消費者消費隊列中的數據。但是一條消息只能被消費一次。當一個消費者消費了隊列中的某條數據之後,該條數據則從消息隊列中刪除。該模式即使有多個消費者同時消費數據,也能保證數據處理的順序。這種架構描述示意圖如下:

p2pMsgQueue

發佈-訂閱消息系統

在發佈-訂閱消息系統中,消息被持久化到一個topic中。與點對點消息系統不同的是,消費者可以訂閱一個或多個topic,消費者可以消費該topic中所有的數據,同一條數據可以被多個消費者消費,數據被消費後不會立馬刪除。在發佈-訂閱消息系統中,消息的生產者稱為發佈者,消費者稱為訂閱者。該模式的示例圖如下:

pub-subMsgQueue

Kafka概述

Apache Kafka是一個分散式的發佈-訂閱消息系統,能夠支撐海量數據的數據傳遞。在離線和實時的消息處理業務系統中,Kafka都有廣泛的應用。Kafka將消息持久化到磁碟中,並對消息創建了備份保證了數據的安全。Kafka在保證了較高的處理速度的同時,又能保證數據處理的低延遲和數據的零丟失。

Kafka的優勢在於:

  • 可靠性:Kafka是一個具有分區機制、副本機制和容錯機制的分散式消息系統
  • 可擴展性:Kafka消息系統支持集群規模的熱擴展
  • 高性能:Kafka在數據發佈和訂閱過程中都能保證數據的高吞吐量。即便在TB級數據存儲的情況下,仍然能保證穩定的性能。

Kafka術語

在深入理解Kafka之前,先介紹一下Kafka中的術語。下圖展示了Kafka的相關術語以及之間的關係:

KafkaTerminologies

上圖中一個topic配置了3個partition。Partition1有兩個offset:0和1。Partition2有4個offset。Partition3有1個offset。副本的id和副本所在的機器的id恰好相同。

如果一個topic的副本數為3,那麼Kafka將在集群中為每個partition創建3個相同的副本。集群中的每個broker存儲一個或多個partition。多個producer和consumer可同時生產和消費數據。

各個術語的詳細介紹如下:

  • Topic:在Kafka中,使用一個類別屬性來劃分數據的所屬類,劃分數據的這個類稱為topic。如果把Kafka看做為一個資料庫,topic可以理解為資料庫中的一張表,topic的名字即為表名。
  • Partition:topic中的數據分割為一個或多個partition。每個topic至少有一個partition。每個partition中的數據使用多個segment文件存儲。partition中的數據是有序的,partition間的數據丟失了數據的順序。如果topic有多個partition,消費數據時就不能保證數據的順序。在需要嚴格保證消息的消費順序的場景下,需要將partition數目設為1。
  • Partition offset:每條消息都有一個當前Partition下唯一的64位元組的offset,它指明瞭這條消息的起始位置。
  • Replicas of partition:副本是一個分區的備份。副本不會被消費者消費,副本只用於防止數據丟失,即消費者不從為follower的partition中消費數據,而是從為leader的partition中讀取數據。
  • Broker:
    • Kafka 集群包含一個或多個伺服器,伺服器節點稱為broker。
    • broker存儲topic的數據。如果某topic有N個partition,集群有N個broker,那麼每個broker存儲該topic的一個partition。
    • 如果某topic有N個partition,集群有(N+M)個broker,那麼其中有N個broker存儲該topic的一個partition,剩下的M個broker不存儲該topic的partition數據。
    • 如果某topic有N個partition,集群中broker數目少於N個,那麼一個broker存儲該topic的一個或多個partition。在實際生產環境中,儘量避免這種情況的發生,這種情況容易導致Kafka集群數據不均衡。
  • Producer:生產者即數據的發佈者,該角色將消息發佈到Kafka的topic中。broker接收到生產者發送的消息後,broker將該消息追加到當前用於追加數據的segment文件中。生產者發送的消息,存儲到一個partition中,生產者也可以指定數據存儲的partition。
  • Consumer:消費者可以從broker中讀取數據。消費者可以消費多個topic中的數據。
  • Leader:每個partition有多個副本,其中有且僅有一個作為Leader,Leader是當前負責數據的讀寫的partition。
  • Follower:Follower跟隨Leader,所有寫請求都通過Leader路由,數據變更會廣播給所有Follower,Follower與Leader保持數據同步。如果Leader失效,則從Follower中選舉出一個新的Leader。當Follower與Leader掛掉、卡住或者同步太慢,leader會把這個follower從“in sync replicas”(ISR)列表中刪除,重新創建一個Follower。

Kafka架構

Kafka的架構示意圖如下:

kfkArchi

  • Broker:Kafka的broker是無狀態的,broker使用Zookeeper維護集群的狀態。Leader的選舉也由Zookeeper負責。
  • Zookeeper:Zookeeper負責維護和協調broker。當Kafka系統中新增了broker或者某個broker發生故障失效時,由ZooKeeper通知生產者和消費者。生產者和消費者依據Zookeeper的broker狀態信息與broker協調數據的發佈和訂閱任務。
  • Producer:生產者將數據推送到broker上,當集群中出現新的broker時,所有的生產者將會搜尋到這個新的broker,並自動將數據發送到這個broker上。
  • Consumer:因為Kafka的broker是無狀態的,所以consumer必須使用partition offset來記錄消費了多少數據。如果一個consumer指定了一個topic的offset,意味著該consumer已經消費了該offset之前的所有數據。consumer可以通過指定offset,從topic的指定位置開始消費數據。consumer的offset存儲在Zookeeper中。

Kafka工作流程

Kafka將某topic的數據存儲到一個或多個partition中。一個partition內數據是有序的,每條數據都有一個唯一的index,這個index叫做offset。新來的數據追加到partition的尾部。每條數據可以在不同的broker上做備份,從而保證了Kafka使用的可靠性。

生產者將消息發送到topic中,消費者可以選擇多種消費方式消費Kafka中的數據。下麵介紹兩種消費方式的流程。

一個消費者訂閱數據:

  • 生產者將數據發送到指定topic中
  • Kafka將數據以partition的方式存儲到broker上。Kafka支持數據均衡,例如生產者生成了兩條消息,topic有兩個partition,那麼Kafka將在兩個partition上分別存儲一條消息
  • 消費者訂閱指定topic的數據
  • 當消費者訂閱topic中消息時,Kafka將當前的offset發給消費者,同時將offset存儲到Zookeeper中
  • 消費者以特定的間隔(如100ms)向Kafka請求數據
  • 當Kafka接收到生產者發送的數據時,Kafka將這些數據推送給消費者
  • 消費者受到Kafka推送的數據,併進行處理
  • 當消費者處理完該條消息後,消費者向Kafka broker發送一個該消息已被消費的反饋
  • 當Kafka接到消費者的反饋後,Kafka更新offset包括Zookeeper中的offset。
  • 以上過程一直重覆,直到消費者停止請求數據
  • 消費者可以重置offset,從而可以靈活消費存儲在Kafka上的數據

消費者組數據消費流程

Kafka支持消費者組內的多個消費者同時消費一個topic,一個消費者組由具有同一個Group ID的多個消費者組成。具體流程如下:

  • 生產者發送數據到指定的topic
  • Kafka將數據存儲到broker上的partition中
  • 假設現在有一個消費者訂閱了一個topic,topic名字為“test”,消費者的Group ID為“Group1”
  • 此時Kafka的處理方式與只有一個消費者的情況一樣
  • 當Kafka接收到一個同樣Group ID為“Group1”、消費的topic同樣為“test"的消費者的請求時,Kafka把數據操作模式切換為分享模式,此時數據將在兩個消費者上共用。
  • 當消費者的數目超過topic的partition數目時,後來的消費者將消費不到Kafka中的數據。因為在Kafka給每一個消費者消費者至少分配一個partition,一旦partition都被指派給消費者了,新來的消費者將不會再分配partition。即一個partition只能分配給一個消費者,一個消費者可以消費多個partition。

Kafka自帶工具

Kafka tool包在org.apache.Kafka.tools.*下,分為系統工具和複製工具兩類,重點介紹幾個系統工具:

  • Kafka Migration Tool:該工具用於將broker的版本從一個版本更新或還原為另一版本。
  • Mirror Maker:該工具用於將源Kafka集群的數據鏡像到目的集群。
  • Consumer Offset Checker:該工具用於顯示指定topic和消費者組的信息,信息包括:消費者組名、topic名、partition、offset、logSize、owner等。



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

-Advertisement-
Play Games
更多相關文章
  • const,static,extern 簡介 一、const與巨集的區別: const簡介:之前常用的字元串常量,一般是抽成巨集,但是蘋果不推薦我們抽成巨集,推薦我們使用const常量。 執行時刻:巨集是預編譯 ( 編譯之前處理 ),const是編譯階段。 編譯檢查:巨集不做檢查,不會報編譯錯誤,只是替換,c ...
  • Weex 是什麼 Weex是阿裡發佈的一款用WEB方式開發原生app的開源產品 Weex能夠完美兼顧性能與動態性,讓移動開發者通過簡捷的前端語法寫出Native級別的性能體驗,並支持iOS、安卓、YunOS及Web等多端部署。對於移動開發者來說,Weex主要解決了頻繁發版和多端研發兩大痛點,同時解決 ...
  • 大家都知道如果手機只有一個活動的應用,那這個應用也太簡單了吧。如同網頁一下,是有多個組成的,在C#中我們可以使用各程skip控制項或代碼,這裡不再贅述。 ...
  • 一、TCP/IP協議(傳輸層協議) 1、Socket與ServerSocket Socket是應用層與TCP/IP協議簇通訊的中間抽象層,Socket是一組介面,在設計模式中,Socket的設計就是門面模式,它把複雜的TCP/IP協議簇的內容隱藏在套接字介面後面,用戶無需關心協議的實現,只需使用So ...
  • 場景【1】多表聯查時,主表與關聯表同時與同一張(第三張表)有關聯,類似三角戀關係- - 涉及表: HOUSE:記錄了房屋信息 ROOMS:記錄了房間信息 HOUSE_STATUS:記錄了狀態信息的中文欄位 房屋信息HOUSE表中有一個關於記錄房屋狀態的欄位,status_id,與HOUSE_STAT ...
  • info 伺服器基本信息 monitor 實時轉儲收到的請求 flushdb 清空當前資料庫 flushall 清空所有資料庫 quit 關閉連接 save 將數據同步保持到磁碟 bgsave 非同步 lastsave 返回最後一次成功保存數據到磁碟的時間戳 shundown 將數據同步保持到磁碟並關 ...
  • AND 和 OR 運算符用於基於一個以上的條件對記錄進行過濾。 AND 和 OR 運算符用於基於一個以上的條件對記錄進行過濾。 AND 和 OR 運算符 AND 和 OR 可在 WHERE 子語句中把兩個或多個條件結合起來。 如果第一個條件和第二個條件都成立,則 AND 運算符顯示一條記錄。 如果第 ...
  • 在SQL Server中,為Partition Scheme多次指定Next Used,不會出錯,最後一次指定的FileGroup是Partition Scheme的Next Used,建議,在執行Partition Split操作之前,都要為Partition Scheme指定Next Used。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...