1. 程式人生 > >Kafka 介紹

Kafka 介紹

1 Kafka為何是一個分散式流平臺

一個流平臺有三個關鍵功能:

  • 釋出與訂閱記錄流,類似於資訊佇列或企業訊息傳遞系統
  • 通過容錯持久的方法儲存記錄流
  • 當記錄流產生時,處理記錄流

Kafka通常用於兩大類應用:

  • 構建可靠的實時流資料管道,此管道可以用於系統或應用間穩定地獲取資料
  • 構建實時流應用,此應用可以用於轉化或響應流資料

基礎概念

  • Kafka可以執行在由一個或多臺伺服器構建的叢集上,這些伺服器可以橫跨多個數據中心
  • Kafka分類儲存記錄流,劃分的類別稱為主題
  • 每一條記錄由鍵、值、時間戳構成

Kafka具有四類核心APIs:

  • Producer API:允許應用將資料流釋出到一個或多個Kafka主題。
  • Consumer API:允許應用訂閱一個或多個主題,並處理產生到這些主題中的記錄流。
  • Streams API:允許應用表現為流處理器,即消費來自一個或多個主題的輸入流,生產流入一個或多個主題的輸出流,有效地將輸入流轉化為輸出流。
  • Connector API:允許構建執行可重用的生產者或消費者,這些生產者與消費者將Kafka的主題與已存在的應用或系統連線。eg:一個關係型資料庫的聯結器,可以捕獲表的每一個改變。

介面

Kafka中,客戶端與伺服器之間的通訊通過TCP協議完成。此協議版本化並且向後相容。

​​​​2 主題與日誌

主題是釋出記錄的類別或源名稱。一個主題可以有零個、一個或多個訂閱資料的消費者。 對於每個主題,Kafka叢集維護一個分割槽日誌。 主題結構

每個分割槽是一個有序、不可變的記錄序列,結構化提交日誌不斷地新增到此記錄序列之後。分割槽中的每條記錄都被分別賦予一個名為offset的順序id號碼,此id唯一標識了分割槽中的每一條記錄。

Kafka叢集使用一個可配置的儲存期持久儲存所有的釋出記錄,無論它們是否已經被消費。Kafka在資料大小方面的效能實際上是一個常數,所以長時間儲存資料並不是一個問題。

在這裡插入圖片描述

實際上,基於每個消費者儲存的元資料只有消費者在日誌中的位置或偏移量。偏離量收消費者控制:通常一個消費者會在它讀取記錄時線性移動其偏移量,但事實上,由於位置由消費者控制,所以消費者可以以任意順序讀取資料。

日誌分割槽由多個目的: 首先,允許日誌擴充套件到超過單個伺服器大小的規模,雖然每個分割槽都應當適應伺服器,但是主題由於擁有多個分割槽所以可以處理任意數量的資料。其次,分割槽充當了並行的單元

3 分佈

每個日誌跨越伺服器分佈在Kafka的叢集上,每個伺服器處理資料並請求分割槽共享。每個分割槽備份在可配置數量的伺服器上,以提供容錯性。

每個分割槽都有一個伺服器充當“領導者”,零個或多個伺服器充當“跟隨者”。領導者處理髮往分割槽的所有讀寫請求,而跟隨者被動複製領導者。如果領導者掛了,跟隨者中的一個伺服器將自動成為新的領導者。每個伺服器要麼充當分割槽的領導者,要麼成為其他伺服器的追隨者,就這樣在叢集中實現了良好的負載均衡。

4 異地備份

Kafka MirrorMaker向叢集提供了異地備份支援。通過使用MirrorMaker,資訊在多個數據中心或雲區域中備份。可以使用這一功能主動或被動進行備份與恢復,或主動將資料放置在靠近使用者的地方,以滿足資料位置要求。

5 生產者

生產者將資料釋出到它們指定的主題之中。生產者負責決定將記錄賦給主題的哪一個分割槽之中。可以根據迴圈方式來完成分割槽的選擇,這種方案有助於負載均衡,或者也可以根據分割槽函式的功能來完成分割槽選擇(例如,根據記錄的鍵)。

6 消費者

每個消費者都會被賦予消費者組標籤,並且每條釋出在主題中的記錄都會被髮給每個訂閱消費者組中的一個消費者例項。消費者例項可以位於不同的程序上,也可以位於不同的機器上。

如果所有的消費者例項都位於相同的消費組中,那麼記錄實際上會在消費者例項中進行負載均衡。

如果所有的消費者例項都位於不同的消費者組中,每條記錄將會被廣播到所有的消費者程序。 消費者組 然而,更常見的是,主題具有少量的消費者組,,每個消費者組被稱為“邏輯訂閱者”。每個消費者組都由許多訂閱者例項組成,用以提供容錯性與擴充套件性。這還是釋出-訂閱的含義,只不過將單程序執行的消費者例項更換為消費者叢集。

Kafka中實現消費的方法是將日誌中的分割槽分配到各個消費者例項上,這樣每個消費者例項便可以在任何時間點都是分割槽的“公平份額”的獨佔消費者。維護組中成員資格的程序由Kafka協議動態處理。如果一個新的例項加入了組,它們將會從組中的其他成員中接管一些分割槽,如果一個例項被銷燬,它的分割槽將會被分配給剩餘的例項。

7 多租戶

Kafka可以被部署為多租戶解決方案。通過配置用於生產或消費資料的主題,開啟多租戶。存在支援配額的操作。管理者可以定義並且強制執行配置,實現對客戶端使用的代理資源的控制。

8 保證

高階Kafka給出了以下保證:

  • 被消費者發往特定主題分割槽的訊息將會按照發送順序新增到日誌中
  • 消費者例項依照記錄在日誌中的儲存順序讀取記錄
  • 對於備份因子為N的主題,它可以在不丟失任何記錄的情況下,容忍最多N-1個伺服器掛機

9 Kafka作為訊息系統

傳統的訊息系統具有兩個模型:佇列與釋出-訂閱。在佇列模型中,消費者池從伺服器中讀取記錄,並且記錄將會被髮往消費者池中的一個消費者,在釋出-訂閱模型中,記錄將會被廣播給所有的消費者。

這兩個模型都有其優缺點。佇列的優點是它允許將資料程序分發到多個消費者例項上,但缺點是它沒有多訂閱者特性,即一旦一個程序讀取了資料,此資料就會被取出。釋出-訂閱允許將資料廣播到多個程序中,但是因為每條資訊被髮往了每個訂閱者,所以沒有辦法擴充套件處理。

消費者組的概念結合了以上兩種概念。與佇列相同,消費者組允許將處理分發到程序集合(消費者的成員)。與釋出訂閱模型相同,Kafka允許將訊息廣播到多個消費者組。

Kafka模型的優勢便是每個主題集成了以上兩個模型,所以它既可以擴充套件處理過程也可以有多個訂閱者。

Kafak比傳統資訊系統具有更強的順序保證。

傳統佇列在伺服器上按順序持有記錄,如果多個消費者從佇列中消費,那麼伺服器將按照儲存的順序取出儲存的記錄。然而,雖然伺服器按序取出記錄,記錄將會被非同步傳送給消費者,所以它們抵達不同的消費者時,順序將會被打亂。這實際上意味著,在並行消費發生時,記錄的順序將會被打亂。訊息系統通常會使用“獨佔消費者”的概念(即,只允許一個程序從佇列中消費)來處理這一情況,不過,這當然意味著非並行處理。

通過使用主題的並行概念——分割槽,Kafka同時提供了順序保證與消費者程序間的負載均衡。通過將主題中的分割槽賦予消費者組中的消費者,每個分割槽都將被組中的單個消費者消費。通過這一機制,Kafka確保每個消費者是分割槽的唯一讀者並且按序消費。由於存在多個分割槽,所以負載均衡在多個消費者例項中達成。注意,消費者組中消費者例項的數量不能超過分割槽數。

10 Kafka作為儲存系統

允許釋出訊息從消費訊息解耦和的訊息佇列實際上充當了正在使用的訊息的儲存系統。Kafka的不同之處在於,它本事就是一個很不錯的儲存系統。

寫入Kafka的資料將會被寫入磁碟,並且為了容錯進行備份。Kafka允許生產者等待確認,因此一個寫操作直到備份完成之後才會被認為完成,並且即使伺服器寫失敗,也會繼續保持。

Kafka使用的磁碟介面擴充套件性很好——無論伺服器上儲存了50KB還是50TB的資料,Kafka都能正常執行。

基於對儲存的認真對待以及允許客戶端控制讀位置,可以將Kafka視為一種特定目的的分散式檔案系統,它專用於高效能低延遲的提交日誌的儲存、備份與傳輸。

11 Kafka用於流處理

Kafka不僅可以讀、寫於儲存資料流,並且可以進行實時流處理。 Kafka的流處理器是指包含從輸入主題中讀取連續流,對輸入執行流操作,並且生產連續資料流到輸出主題的一切東西。

使用生產者與消費者API可以進行簡單的直接處理。然而,為了實現更復雜的轉換,Kafka提供了繼承 Streams API。它允許構建具有計算流聚合或連線流的處理過程的應用。

此工具用於解決這類應用問題:處理無序資料,在程式碼更改時重新處理輸入,執行有狀態計算等。

streams API基於Kafaka提供的核心功能實現:它對輸入使用了生產者APIs與消費者APIs,對狀態儲存使用了Kafka,在流處理器例項之間使用了相同的組機制來實現容錯。

12 功能整合

Kafka作為一個流平臺,整合訊息傳送、儲存與流處理功能十分重要。

類似於HDFS的分散式檔案系統允許儲存靜態檔案用於執行批處理。實際上,這樣的系統用於儲存與處理過去的歷史資料。

傳統的企業訊息傳遞系統允許處理在訂閱後抵達的未來資訊。使用這種方式構建的應用用於處理在未來抵達的資料。

Kafka結合了這兩種特性,成為流處理應用與流資料管道的平臺。

通過結合儲存與低延遲訂閱,流應用可以使用相同的方式處理過去的資料與未來的資料。這樣,單個應用可以處理歷史儲存的資料並且在未來的資料到達後繼續處理,不會在到達最後一條資料時終止處理。這一更為泛化的流處理概念既包括批處理,也包括訊息驅動應用。

同樣,對於流處理管道,訂閱與實時事件的結合使將Kafka用於低延遲管道變得可能,不過資料的可靠儲存能力卻使將Kafka用於關鍵資料(資料的傳輸必須得到保證)或用於與離線系統(週期載入資料或可能長時間停機維護)整合成為可能。流處理工具使轉化抵達的資料成為可能。