kafka詳解一、Kafka簡介

五柳-先生發表於2015-11-17
問題導讀

1.Kafka有何特性?
2.Kafka有哪些元件?











背景:
     當今社會各種應用系統諸如商業、社交、搜尋、瀏覽等像資訊工廠一樣不斷的生產出各種資訊,在大資料時代,我們面臨如下幾個挑戰:
  • 如何收集這些巨大的資訊
  • 如何分析它
  • 如何及時做到如上兩點


     以上幾個挑戰形成了一個業務需求模型,即生產者生產(produce)各種資訊,消費者消費(consume)(處理分析)這些資訊,而在生產者與消費者之間,需要一個溝通兩者的橋樑-訊息系統。
     從一個微觀層面來說,這種需求也可理解為不同的系統之間如何傳遞訊息。

Kafka誕生:由 linked-in 開源

kafka-即是解決這類問題的一個框架,它實現了生產者和消費者之間的無縫連線。
kafka-高產出的分散式訊息系統(A high-throughput distributed messaging system)
Kafka特性:它形容自己的設計是獨一無二的,先看一下它有如何過人之處:


  • 快:單個kafka服務每秒可處理數以千計客戶端發來的幾百MB資料。
  • 可擴充套件性:一個單一叢集可作為一個大資料處理中樞,集中處理各種型別業務
  • 持久化:訊息被持久化到磁碟(可處理TB資料級別資料但仍保持極高資料處理效率),並且有備份容錯機制
  • 分散式:著眼於大資料領域,支援分散式,叢集可處理每秒百萬級別訊息
  • 實時性:生產出的訊息可立即被消費者消費


 


file:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image(2).png
Kafka的元件:
  • topic:訊息存放的目錄即主題
  • Producer:生產訊息到topic的一方
  • Consumer:訂閱topic消費訊息的一方
  • Broker:Kafka的服務例項就是一個broker

如下圖所示,Producer生產的訊息通過網路傳送給Kafka cluster,而Consumer從其中消費訊息

 


file:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image(3).png
Topic 和Partition:

訊息傳送時都被髮送到一個topic,其本質就是一個目錄,而topic由是由一些Partition Logs(分割槽日誌)組成,其組織結構如下圖所示:

 


file:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image.png
     我們可以看到,每個Partition中的訊息都是有序的,生產的訊息被不斷追加到Partition log上,其中的每一個訊息都被賦予了一個唯一的offset值。
     Kafka叢集會儲存所有的訊息,不管訊息有沒有被消費;我們可以設定訊息的過期時間,只有過期的資料才會被自動清除以釋放磁碟空間。比如我們設定訊息過期時間為2天,那麼這2天內的所有訊息都會被儲存到叢集中,資料只有超過了兩天才會被清除。

     Kafka需要維持的後設資料只有一個--消費訊息在Partition中的offset值,Consumer每消費一個訊息,offset就會加1。其實訊息的狀態完全是由Consumer控制的,Consumer可以跟蹤和重設這個offset值,這樣的話Consumer就可以讀取任意位置的訊息。

     把訊息日誌以Partition的形式存放有多重考慮,第一,方便在叢集中擴充套件,每個Partition可以通過調整以適應它所在的機器,而一個topic又可以有多個Partition組成,因此整個叢集就可以適應任意大小的資料了;第二就是可以提高併發,因為可以以Partition為單位讀寫了。


分散式:
     這些Partitions分佈在叢集的每一臺server上,而每一個Partition在叢集中都可以有多個備份,這個備份數量是可配置的。
     每個Partition都有一個leader server,而其他備份的server都稱為followers,只有leader伺服器才會處理這個Partition上所有的讀寫請求,而其它followers則被動的複製leader上的資料。如果一個leader掛掉了,followers中的一個伺服器則會自動升級為leader。因此,其實叢集中的每個伺服器都扮演著一個Partition的leader伺服器,和其它Partition的follower伺服器。

Producers:
     Producer可以根據自己的選擇釋出訊息到一個主題,Producer也可以自己決定把訊息釋出到這個主題的哪個Partition,當然我們可以選擇API提供的簡單的分割槽選擇演算法,也可以自己去實現一個分割槽選擇演算法。

Consumers:
     訊息傳遞通常由兩種模式,queuing(佇列)和publish-subscribe (釋出-訂閱)
  • queuing:每個Consumer從訊息佇列中取走一個訊息
  • pub-scrib:訊息被廣播到每個Consumer


     Kafka通過提供了一個對Consumer的抽象來同時實現這兩種模式-ConsumerGroup。Consumer例項需要給自己指定一個ConsumerGroup的名字,如果所有的例項都用同一個ConsumerGroup名字,那麼這些Consumer就會以queuing的模式工作;如果所有的例項分別用的不同的ConsumerGroup名字,那麼它們就以public-subscribe模式工作。

如下圖所示:含兩臺server的叢集一共有p0~p3四個Partition,兩個Consumer Group,在Group內部是以queuing的模式消費Partition,在Group之間是以pub-scrib模式消費。
 

4.png (31.91 KB, 下載次數: 1)

下載附件  儲存到相簿

2015-1-8 14:25 上傳


  file:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image(1).png
訊息順序性:

     Kafka是如何確保訊息消費的順序性的呢?前面講到過Partition,訊息在一個Partition中的順序是有序的,但是Kafka只保證訊息在一個Partition中有序,如果要想使整個topic中的訊息有序,那麼一個topic僅設定一個Partition即可。

轉載: http://www.aboutyun.com/thread-11113-1-1.html

相關文章