1. 程式人生 > 其它 >4個小技巧帶你輕鬆入門kafka!

4個小技巧帶你輕鬆入門kafka!

前言

Kafka 是一個訊息系統,原本開發自 LinkedIn,用作 LinkedIn 的活動流(Activity Stream)和運營資料處理管道(Pipeline)的基礎。現在它已被多家不同型別的公司 作為多種型別的資料管道和訊息系統使用。

活動流資料是幾乎所有站點在對其網站使用情況做報表時都要用到的資料中最常規的部分。活動資料包括頁面訪問量(Page View)、被檢視內容方面的資訊以及搜尋情況等內容。這種資料通常的處理方式是先把各種活動以日誌的形式寫入某種檔案,然後週期性地對這些檔案進行統計分析。運營資料指的是伺服器的效能資料(CPU、IO 使用率、請求時間、服務日誌等等資料)。運營資料的統計方法種類繁多。

近年來,活動和運營資料處理已經成為了網站軟體產品特性中一個至關重要的組成部分,這就需要一套稍微更加複雜的基礎設施對其提供支援。

Kafka 簡介

Kafka 是一種分散式的,基於釋出 / 訂閱的訊息系統。主要設計目標如下:

  • 以時間複雜度為 O(1) 的方式提供訊息持久化能力,即使對 TB 級以上資料也能保證常數時間複雜度的訪問效能。
  • 高吞吐率。即使在非常廉價的商用機器上也能做到單機支援每秒 100K 條以上訊息的傳輸。
  • Java中介軟體學習筆記集錦
  • 支援 Kafka Server 間的訊息分割槽,及分散式消費,同時保證每個 Partition 內的訊息順序傳輸。
  • 同時支援離線資料處理和實時資料處理。
  • Scale out:支援線上水平擴充套件。

Kafka 基礎概念

概念一:生產者與消費者

對於 Kafka 來說客戶端有兩種基本型別:生產者(Producer)消費者(Consumer)。除此之外,還有用來做資料整合的 Kafka Connect API 和流式處理的 Kafka Streams 等高階客戶端,但這些高階客戶端底層仍然是生產者和消費者API,它們只不過是在上層做了封裝。

這很容易理解,生產者(也稱為釋出者)建立訊息,而消費者(也稱為訂閱者)負責消費or讀取訊息。

概念二:主題(Topic)與分割槽(Partition)

在 Kafka 中,訊息以主題(Topic)來分類,每一個主題都對應一個「訊息佇列」,這有點兒類似於資料庫中的表。但是如果我們把所有同類的訊息都塞入到一個“中心”佇列中,勢必缺少可伸縮性,無論是生產者/消費者數目的增加,還是訊息數量的增加,都可能耗盡系統的效能或儲存。

我們使用一個生活中的例子來說明:現在 A 城市生產的某商品需要運輸到 B 城市,走的是公路,那麼單通道的高速公路不論是在「A 城市商品增多」還是「現在 C 城市也要往 B 城市運輸東西」這樣的情況下都會出現「吞吐量不足」的問題。所以我們現在引入分割槽(Partition)的概念,類似“允許多修幾條道”的方式對我們的主題完成了水平擴充套件。

概念三:Broker 和叢集(Cluster)

一個 Kafka 伺服器也稱為 Broker,它接受生產者傳送的訊息並存入磁碟;Broker 同時服務消費者拉取分割槽訊息的請求,返回目前已經提交的訊息。使用特定的機器硬體,一個 Broker 每秒可以處理成千上萬的分割槽和百萬量級的訊息。(現在動不動就百萬量級..我特地去查了一把,好像確實叢集的情況下吞吐量挺高的..摁..)

若干個 Broker 組成一個叢集(Cluster),其中叢集內某個 Broker 會成為叢集控制器(Cluster Controller),它負責管理叢集,包括分配分割槽到 Broker、監控 Broker 故障等。在叢集內,一個分割槽由一個 Broker 負責,這個 Broker 也稱為這個分割槽的 Leader;當然一個分割槽可以被複制到多個 Broker 上來實現冗餘,這樣當存在 Broker 故障時可以將其分割槽重新分配到其他 Broker 來負責。下圖是一個樣例:

Kafka 的一個關鍵性質是日誌保留(retention),我們可以配置主題的訊息保留策略,譬如只保留一段時間的日誌或者只保留特定大小的日誌。當超過這些限制時,老的訊息會被刪除。我們也可以針對某個主題單獨設定訊息過期策略,這樣對於不同應用可以實現個性化。

概念四:多叢集

隨著業務發展,我們往往需要多叢集,通常處於下面幾個原因:

  • 基於資料的隔離;
  • 基於安全的隔離;
  • 多資料中心(容災)

當構建多個數據中心時,往往需要實現訊息互通。舉個例子,假如使用者修改了個人資料,那麼後續的請求無論被哪個資料中心處理,這個更新需要反映出來。又或者,多個數據中心的資料需要彙總到一個總控中心來做資料分析。

上面說的分割槽複製冗餘機制只適用於同一個 Kafka 叢集內部,對於多個 Kafka 叢集訊息同步可以使用 Kafka 提供的 MirrorMaker 工具。本質上來說,MirrorMaker 只是一個 Kafka 消費者和生產者,並使用一個佇列連線起來而已。它從一個叢集中消費訊息,然後往另一個叢集生產訊息。