Apache Kafka系列之Kafka介紹

2021-06-16 21:38:42 字數 2710 閱讀 5693

kafka是乙個分布式的、分割槽的、多複本的日誌提交服務。它通過一種獨一無二的設計提供了乙個訊息系統的功能。

所有的這些意味著什麼?

1)kafka維護按類區分的訊息,稱為主題(topic)

2)生產者(producer)向kafka的主題發布訊息

3)消費者(consumer)向主題註冊,並且接收發布到這些主題的訊息

4)kafka以乙個擁有一台或多台伺服器的集群執行著,每一台伺服器稱為broker

從高層來說,生產者(producer)通過網路發訊息到kafka集群,而kafka集群則以下面這種方式對消費者進行服務:

主題與日誌(topic and log)

首先我們來看一下kafka提供的高層抽象——主題(topic)

乙個主題就是乙個類別或者乙個可訂閱的條目名稱。對每個topic來說,kafka維護的是如圖所示的乙個分割槽日誌(partitioned log):

每個分割槽(partition)是乙個有序的、不可變的訊息序列,這個序列可以被連續地追加—— 乙個提交日誌。在分區內的每條訊息都有乙個有序的id號,這個id號被稱為偏移(offset),這個偏移量可以唯一確定每條訊息在分區內的位置。

kafka集群可以在乙個指定的時間內保持所有發布上來的訊息,不管這些訊息有沒有被消費。打個比方,如果這個時間設定為兩天,那麼在訊息發布的兩天以內,這條訊息都是可以被消費的,但是在兩天後,這條訊息就會被系統丟棄以釋放空間。kafka的效能不會受資料量的大小影響,因此保持大量的資料不是乙個問題。

事實上,每個消費者(consumer)唯一需要儲存的元資料就是它已經消費到日誌裡的哪乙個位置了,這個位置就是前面提到的偏移量(offset)。這個偏移量是由消費者控制的:一般來說,消費者會按順序去一條條讀日誌裡的訊息,但是如果需要的話,它也是可以重新設定它開始讀的位置的。

這些特點的組合意味著消費者(consumer)是很輕量的——它們可以不影響系統效能的情況下來去自如。打個比方,你可以用我們的命令列工具在不影響其他消費者的情況下去抓取任何乙個主題的內容。

日誌裡的分割槽設計有多個目的。首先,這可以使日誌的規模擴大到單獨一台機子所能容納的數量之外。每個單獨的分割槽必須和它所在的主機相匹配,但是乙個主題(topic)可以有許多分割槽,這樣的話它就可以處理任意數量的資料。其次這些分割槽可以作為並行的乙個單元——更多的內容稍後會講到。

分布式(distributed)

日誌的分割槽分布在kafka集群的多台伺服器上,每台伺服器儲存資料以及對每個分割槽資料的請求。每個分割槽會在多台伺服器上進行副本備份以便容錯,副本的數量是可配置的。

每個分區分有乙個「leader」的伺服器,剩下的都是「follower」。leader處理對這個分割槽的所有讀寫請求,與此同時,follower會被動地去複製leader上的資料。如果leader發生故障,其中乙個follower會自動成為新的leader。每台伺服器可以作為一些分割槽的leader,同時也作為其他一些分割槽的follower,這樣在集群內部就可以做到乙個很好的負載均衡。

生產者(producer)

生產者(producer)可以根據具情況將訊息發布(publish)到乙個主題(topic)上。生產者可以選擇將哪條訊息發布到這個主題下的某乙個分割槽(partition)。這可以用傳統的輪詢方式以保證負載均衡,也可以根據一些語義分割槽函式來做。更多的有關分割槽的內容後面會講到。

消費者(consumer)

傳統的訊息系統有兩種模型:佇列和發布-訂閱模式。在佇列模型中,一堆消費者會從一台機子上讀訊息,每一條訊息只會被乙個消費者讀到;在發布訂閱模型中,訊息會向所有的消費者廣播。kafka提供了一種單一的將這兩種模型進行抽象的消費者模式——消費者組(consumer group)。

消費者會屬於某乙個組,發布到每個主題的訊息會遞送給訂閱了這個主題的消費者組中的乙個消費者。消費者例項可以是不同的程序或者在不同的機器上。如果所有的消費者從屬於同乙個組,這就跟傳統的佇列模式一樣了。如果每個消費者自成一組,那麼這就是發布訂閱模式了,所有的訊息會被廣播給所有的消費者。但是通常情況下,我們發現,主題會有多個消費者組,每個組對應乙個邏輯上的訂閱者,每個組由多個消費者例項組成以保證擴充套件性和容錯性。

kafka處理定序問題上也去傳統的訊息系統不一樣。傳統的佇列允許訊息被任何乙個消費者例項所消費。這意味著訊息的順序丟失了。也就是說,儘管在佇列中訊息是有順序的,但這些訊息會到達不同的消費者並且被無序地處理。在kafka裡,因為有並行的概念——分割槽,kafka可以同時提供順序保證和負載均衡。這可以通過將主題中的分割槽分配給消費者組中的消費者來實現,這樣的話每個分割槽只被這個組中的乙個消費者所消費。這樣我們還可以保證這個消費者是這個分割槽的唯一消費者,並且是按原來的順序來處理資料的。因為有許多分割槽,所以也就可以在多個消費者例項中實現負載均衡。需要注意的是,消費者例項的數量不可能比分區多。

保證(guarantees)

kafka給出了以下保證:

2)乙個消費者例項會按訊息在日誌中的儲存順序看到它們。

3)對於副本因子為n的主題,我們可以承受n-1個伺服器發生故障而保證提交到日誌的訊息不會丟失。

Apache Kafka教程A系列 介紹

在大資料中,使用了大量的資料。關於資料,我們有兩個主要挑戰。第乙個挑戰是如何收集大量資料,第二個挑戰是分析收集的資料。為了克服這些挑戰,您必須使用訊息傳遞系統。卡夫卡專為分布式高吞吐量系統而設計。卡夫卡傾向於非常好地取代傳統的資訊 者。與其他訊息系統相比,kafka具有更好的吞吐量,內建分割槽,複製...

apache kafka系列之遷移與擴容工具用法

參考官網site 說明 當我們對kafka集群擴容時,需要滿足2點要求 將指定topic遷移到集群內新增的node上。將topic的指定partition遷移到新增的node上。假如現在乙個kafka集群執行三個broker,broker.id依次為101,102,103,後來由於業務資料突然暴增,...

apache kafka系列之遷移與擴容工具用法

參考官網site 說明 當我們對kafka集群擴容時,需要滿足2點要求 將指定topic遷移到集群內新增的node上。將topic的指定partition遷移到新增的node上。假如現在乙個kafka集群執行三個broker,broker.id依次為101,102,103,後來由於業務資料突然暴增,...