1. 程式人生 > >Kafka入門介紹(一)

Kafka入門介紹(一)

1.介紹

Kafka是一個分散式的流平臺,有三種關鍵的功能:

  1. 釋出和訂閱流記錄。在這方面和訊息佇列或企業訊息系統類似。
  2. 以容錯的方式儲存流記錄。
  3. 處理流記錄。

Kafka被用於兩大類應用程式:

  1. 建立實時的流資料管道,可靠的在系統或應用中獲取資料。
  2. 建立實時的流應用程式,對流資料進行變換或反應。

Kafka的幾個概念:

  1. Kafka作為一個或多個伺服器上的叢集執行。
  2. Kafka叢集儲存的記錄類別稱為主題。

Kafka四個核心API:

  • Producer API : 能讓一個應用程式釋出流記錄給一個或多個Kafka主題。
  • Consumer API:能讓應用程式訂閱一個或多個主題並處理為其生成的流記錄。
  • Streams API:能讓應用程式充當流處理器,從一個或多個主題消費輸入流,並生產輸出流到一個或多個輸出主題,有效地將輸入流轉換為輸出流。
  • Connector API:允許構建和執行可重複使用的生產者或消費者,來將Kafka主題與現有應用程式或資料系統相連線。例如,關係資料庫的聯結器可能會捕獲表的每個更改。

    這裡寫圖片描述

在Kafka中,客戶端和伺服器之間的通訊是用簡單,高效能,基於TCP協議完成的。此協議版本化並保持與舊版本的向後相容性。Kafka提供了Java客戶端,但是客戶端可以使用多種語言。

2.主題和日誌

主題是釋出記錄的類別或名稱。在Kafka中主題總是多使用者的,也就是說,主題可以有零個,一個或多個消費者訂閱的資料。

對每一個主題,Kafka叢集維護一個分割槽日誌,如下所示:

這裡寫圖片描述

每個分割槽是一個有序的、不可變的記錄序列,不斷有結構化的提交日誌附加到其中。每個分割槽中的記錄都被分配一個順序的id號,稱為偏移量,這個唯一數字用來區分分割槽中每個記錄。

Kafka叢集保留所有已釋出的記錄,無論它們是否已被使用 ,可使用可配置的保留期限。例如,如果保留策略設定為兩天,則在釋出記錄後的兩天內,它可以消費,之後將被丟棄以釋放空間。卡夫卡的效能在資料大小方面是有效的,所以長時間儲存資料不是問題。

這裡寫圖片描述

事實上,在每個消費者基礎上保留的唯一元資料是消費者在日誌中的偏移或位置。這個偏移由消費者控制:通常消費者會在讀取記錄時線性地提高其偏移,但實際上,由於位置由消費者控制,它可以以任何順序消耗記錄。例如,消費者可以重置為較舊的偏移量以重新處理來自過去的資料,或者跳過最近的記錄,並從“現在”開始消費。

這種特徵的組合意味著Kafka消費者非常便宜,他們的來回去對群集或其他消費者沒有太大的影響。例如,你可以使用命令列工具來拖任何主題的內容,不會改變任何現有消費者所消耗的內容。

日誌分割槽有幾個目的。首先,它們允許日誌擴充套件到適合單個伺服器的大小。每個單獨的分割槽必須適合託管它的伺服器,但主題可能有很多分割槽,因此它可以處理任意數量的資料。第二,它們作為並行性的單位,更多的是在這一點上。

3.分佈

日誌分割槽分佈在Kafka群集中的伺服器上,每個伺服器處理資料並請求分割槽的一部分。每個分割槽都跨可配置數量的伺服器進行復制,以實現容錯。

每個分割槽都有一個伺服器作為“領導”,零個或多個伺服器充當“追隨者”。領導者處理對分割槽的所有讀取和寫入請求,而追隨者被動地複製領導者。如果領導掛掉,其中一個追隨者將自動成為新的領導者。每個伺服器充當其分割槽的一個領導者,另一個伺服器作為其他分割槽的追隨者,因此在群集中負載平衡良好。

4.生產者

生產者將資料釋出到他們選擇的主題。生產者負責選擇要分配給主題中哪個分割槽的記錄。這可以通過迴圈方式簡單地平衡負載,或者可以根據某些語義分割槽功能(例如基於記錄中的一些關鍵字)來完成。更多關於使用分割槽在一秒鐘!

5.消費者

消費者使用消費者組名稱標註自己,並將釋出到主題的每條記錄傳遞到每個訂閱消費者組中的一個消費者例項。消費者例項可以在單獨的程序中或單獨的機器上。

如果所有的消費者例項具有相同的消費者組,那麼這些記錄將在消費者例項上實際負載平衡。

如果所有的消費者例項都有不同的消費者群體,那麼每個記錄將被廣播給所有的消費者程序。

這裡寫圖片描述

兩個伺服器Kafka叢集託管四個分割槽(P0-P3)與兩個消費者組。消費者組A有兩個消費者例項,B組有四個。

然而,更常見的是,我們發現主題具有少量的消費者群體,每個“邏輯訂戶”一個。每個組由許多消費者例項組成,具有可擴充套件性和容錯能力。這只不過是釋出訂閱語義,使用者是一組消費者而不是單個程序。

在Kafka中實現消費的方式是通過將日誌分區劃分到消費者例項上,以便每個例項都是任何時間點的“公平共享”分割槽的唯一消費者。維護成員資格的過程由Kafka協議動態處理。如果新的例項加入組,他們將把一些分割槽分配給從組中的其他成員;如果一個例項消失,其分割槽會被分發到剩餘的例項。

5.保證

在Kafka提供以下保證:

  • 生產者傳送到特定主題分割槽的訊息將按照發送的順序進行追加。也就是說,如果記錄M1由與記錄M2相同的生產者傳送,並且首先發送M1,則M1將具有比M2更低的偏移並且在日誌中較早出現。
  • 消費者例項按照儲存在日誌中的順序檢視記錄。
  • 對於具有複製因子N的主題,我們將容忍最多N-1個伺服器故障,而不會丟失提交到日誌的任何記錄。

6.Kafka作為訊息系統

Kafka的流概念與傳統的企業郵件系統相比如何?

訊息傳統傳統上有兩種模式:排隊和釋出訂閱。在佇列中,消費者池可以從伺服器讀取,每條記錄都轉到其中一個;在釋出訂閱中,記錄將廣播給所有消費者。這兩個模型中的每一個都有實力和弱點。排隊的優點是它允許你在多個消費者例項上分配資料處理,從而可以擴充套件你的處理。不幸的是,佇列不是多使用者的 , 一旦一個程序讀取資料就會消失。釋出訂閱允許您將資料廣播到多個程序,但無法縮放處理,因為每個訊息都發送給每個使用者。

Kafka消費者組的概念有兩個概念。與佇列一樣,消費者組允許你通過一系列程序(消費者組的成員)來劃分處理。與釋出訂閱一樣,Kafka允許你將訊息廣播到多個消費者組。

Kafka模型的優點是,每個主題都具有這兩個屬性 -,它可以擴充套件處理,也是多使用者 -,不需要選擇一個或另一個。

Kafka也比傳統的郵件系統更強大的訂閱保證。

傳統佇列在伺服器上儲存順序的記錄,如果多個消費者從佇列中消費,則伺服器按照儲存順序輸出記錄。然而,雖然伺服器按順序輸出記錄,但是記錄被非同步傳遞給消費者,所以它們可能會在不同的消費者處按順序到達。這意味著在並行消耗的情況下,記錄的排序丟失。訊息傳遞系統通常通過使“唯一消費者”的概念只能讓一個程序從佇列中消費,但這當然意味著處理中沒有並行性。

Kafka做得更好,通過在主題中有一個並行概念(分割槽),Kafka能夠在消費者流程池中提供排序保證和負載平衡。這通過將主題中的分割槽分配給消費者組中的消費者來實現,使得每個分割槽被組中的一個消費者消耗。通過這樣做,我們確保消費者是該分割槽的唯一讀者,並按順序消耗資料。由於有許多分割槽,這仍然平衡了許多消費者例項的負載。但請注意,消費者組中的消費者例項不能超過分割槽。

7.Kafka作為儲存系統

任何允許釋出訊息的訊息佇列與消費實際上是充當儲存系統的動態資訊。Kafka的不同之處在於它是一個很好的儲存系統。

寫入Kafka的資料寫入磁碟並進行復制以進行容錯。 Kafka允許生產者等待確認,以便在完全複製之前寫入不被認為是完整的,並且即使寫入伺服器失敗,也保證持久寫入。

Kafka的磁碟結構使用縮放功能,Kafka將執行相同的操作,無論您在伺服器上是否有50 KB或50 TB的持久資料。

由於儲存並允許客戶端控制其讀取位置,你可以將Kafka視為專用於高效能,低延遲的提交日誌儲存,複製和傳播的專用分散式檔案系統。

8.Kafka流處理

不只是讀取,寫入和儲存資料流,目的是實現流的實時處理。

在Kafka,流處理器從輸入主題持續的接收資料流,對輸入執行一些處理,並生成持續的資料流以輸出主題。

例如,零售應用程式可能會輸入銷售和出貨的輸入流,並輸出根據此資料計算的重新排序和價格調整。

可以直接使用生產者和消費者API進行簡單處理。然而對於更復雜的轉換,Kafka提供了一個完全整合的Streams API。這允許構建應用程式進行面對較重大處理,以計算流中的聚合或將流連線在一起。

該設施有助於解決這種型別的應用程式面臨的困難問題:處理無序資料,重新處理輸入作為程式碼更改,執行有狀態計算等。

Streams API基於Kafka提供的核心原語構建:它使用生產者和消費者API進行輸入,使用Kafka進行有狀態儲存,並在流處理器例項之間使用相同的組機制進行容錯。

9.集中碎片

訊息,儲存和流處理的這種組合似乎是不尋常的,但是Kafka作為流平臺的角色至關重要。

像HDFS這樣的分散式檔案系統允許儲存用於批處理的靜態檔案。這樣的系統有效地允許儲存和處理來自過去的歷史資料。

傳統的企業郵件系統允許處理將在你訂閱之後到達的未來的訊息。應用程式以這種方式處理未來的資料,因為它的到來。

Kafka結合了這兩種功能,組合對於Kafka作為流應用程式平臺和流式傳輸資料管道的使用而言至關重要。

通過組合儲存和低延遲訂閱,流應用程式可以以相同的方式處理過去和未來的資料。這是一個單一的應用程式可以處理歷史記錄資料,而不是在到達最後一個記錄時結束,它可以隨著未來資料的到來而繼續處理。這是流程處理的一般概念,其中包含批處理以及訊息驅動的應用程式。

同樣,對於流資料管道,訂閱到實時事件的組合使得可以使用Kafka進行非常低延遲的管道;但是可靠性地儲存資料的能力使得可以將其用於必須保證資料傳送的關鍵資料,或者與僅負載資料的離線系統進行整合,或者可能會長時間停機進行維護。流處理裝置可以在資料到達時轉換資料。