kafka角色模型與核心概念

2021-10-06 21:39:38 字數 4249 閱讀 8480

kafka主要有三大作用,其中訊息系統和流式處理是我們最常用的

訊息系統:kafka作為訊息中介軟體,具有mq的系統解耦、流量削峰、緩衝、非同步通訊等特性

儲存系統:kafka與其他訊息系統不同的是,它能夠把訊息持久化到磁碟,有效的降低了訊息丟失風險, 只要把資料保留策略設定為永久,即訊息永不過期,可以作為長期的資料儲存系統來使用。 

流式處理:kafka支援流式處理框架(sparkstreaming、storm、flink等),提供了完整的流式處理類庫,比如視窗、連線、變換、聚合等各類操作。

先來看一張kafka的體系結構圖 

乙個典型的kafka體系架構包括若**roker、若干producer、若干consumer,以及乙個zookeeper集群。zookeeper集群管理kafka集群元資料,leder的選舉,訊息offset的維護。producer把訊息傳送到broker,broker負責將收到的訊息儲存到磁碟中,而consumer訂閱broker並拉取訊息消費。

kafka中主要包括以下角色模型及概念生產者,負責建立訊息,一般是本地客戶端,由研發人員手動編寫**實現訊息生產,把訊息投遞kafka中

訊息者,負責接收訊息,一般是本地客戶端,由研發人員手動編寫**實現,連線到kafka獲取訊息,進行訊息費

消費者組,kafka中存在消費者組的概念,每個消費者都屬於乙個對應的消費者組,可以存在多個消費者組。乙個分割槽只能被同乙個消費者組的乙個消費者消費,乙個消費者組內的同乙個消費者可以消費多個分割槽。下圖中有兩個消費者組a和b。分割槽p0和p1同時由消費者組a和b的各自的消費者消費,即p0對c0和c4,p1對c1和c5。而p2和p3 分別對應c2和c3,即同乙個分割槽只能由同乙個消費者組內的乙個消費者消費

儲存訊息的節點。就kafka而言,broker可以視為乙個kafka服務節點或例項。乙個或多個broker例項組成了乙個kafka集群

主題,kafka中的訊息儲存以主題單位進行分類儲存。生產者將訊息傳送到特定的主題, 消費者訂閱對應的主題並進行消費訊息,即每條訊息都要屬於某乙個topic,要落於某個topic之上。

partition即分割槽,topic-主題只是乙個邏輯上的概念,乙個topic可以分為多個partition,乙個partition只能屬於乙個topic,乙個topic下的不同partition可以儲存在多個broker之上,但乙個partition只能儲存在乙個broker之上。

每個partition是通過segment分段機制儲存的,訊息順序追加到乙個partition下乙個log日誌檔案中,同時並分配乙個offset,即偏移量,offset是乙個分區內的唯一標識,順序遞增,因此kafka中乙個partition下的訊息是有序的

為了保證訊息的可靠性,kafka為分割槽引入了多副本replica機制,通過增加副本數量提高容災能力。乙個分割槽中的所有副本統稱為ar(assigned replicas),每個分割槽中有leader與follower兩種角色副本,二者之間是主從關係,乙個分割槽只有乙個leader,通常多個follower。

下圖是由3個副本組成的isr集合,每個partition乙個leader和連個follower。

(1)分割槽的isr集機制

所有與leader保持同步副本組成了isr(in-sync-replicas),isr集合是ar集合的乙個子集。訊息讀寫請求先發往leader,再同步到follower,在同步期間,follower副本較之leader往往具有一定的滯後,具體滯後標準引數可配置。與leader滯後過多的follower副本組成osr(out-of-sync replicas), 因此ar由isr和osr兩部分組成。正常情況下,所有的follower副本都應該與leader副本保持一致,即沒有滯後副本,osr集合為空。

(2)leader對isr的維護

leader負責維護和跟蹤isr集中所有follower副本的滯後狀態,當follower滯後太多時,leader會把follower從isr集中剔除掉,將其移入osr集中,當滯後狀態又重新追上leader時,再從osr集中恢復到isr集合中。當leader發生故障時,只有在isr中集合的副本才有資格參與新leader的選舉。

下圖是follower副本都滯後leader,所有副本在圖中中configs下的replicas,在isr中只剩下leader,滯後的follower副本在osr中,不過osr集合在zookeeper檢視時候並不展示

(3)有效訊息水位-hw

hw:即high watermark,俗稱高水位,它標識了乙個特定的訊息偏移量(offset),在offset之前的訊息才有效讀取,消費者只能拉取到這個offset之前的訊息。

lso:log start offset 即訊息開始的offset。

leo:是log end offset的縮寫,它標識當前日誌檔案中下一條待寫入訊息的offset,即當前分割槽中最後一條訊息的offset值加1。分割槽中每個副本的都會維護自身的leo,而isr集合中副本中最小的leo即為分割槽的hw。消費者只能消費hw水位之下的訊息,即hw之下的訊息被認為是可靠訊息。

如果乙個topic對應乙個檔案或多個檔案,那訊息只能分布在乙個broker之上 ,那麼這個儲存訊息的檔案(可能有多個)所對應的broker機器的io將成為效能瓶頸,而分割槽正是為了解決大量寫下的單機io瓶頸問題。每條訊息被傳送到topic之前,會根據分割槽規則,有選擇的儲存在哪個分割槽,使訊息不只是往乙個broker上寫,就降低了單個broker的io寫頻率,也充分利用了多機提高了訊息寫入吞吐量。

kafka採用的是:主動pull,即producer將訊息推送到broker,consumer主動從broker拉取訊息進行消費

原因主要有以下兩點:

首先,主要是避免push模式下,當producer推送的速率遠大於consumer消費的速率時,consumer承受不住壓力而崩潰或訊息丟失而重新推送,浪費資源

再者,push模式下,broker不知道下游consumer消費能力和消費策略的情況下,不知道採用立即推送單條訊息還是快取並批量推送,因此採用哪種策略可能都不合適而pull模式下,consumer可以自主決定是否批量的從broker拉取資料,根據自己的消費能力去決定資料拉取策略。

(1)topic分割槽

不同分割槽分布在不同broker上,解決大量寫下的單機io瓶頸問題,利用多機進行分布式儲存來提高吞吐量。

(2)檔案分段

(3)順序讀寫

(4)緩衝並批量傳送

(5)零拷貝

參見:為了實現producer的冪等性,kafka引入了producer id(即pid)和sequence_number

producer id:生產者的唯一標識,每個新的producer在初始化的時候會被分配乙個唯一的pid,對使用者隱藏。

sequencenumbler:每個生產者,對同乙個topic下的不同分割槽,分別對應乙個從0開始單調遞增的sequencenumber

對於kafka來說,要解決的是生產者傳送訊息的冪等問題,即只要區分來自生產者的每條訊息是否重複。

kafka通過為每條訊息增加乙個sequencenumbler(簡稱sn),乙個topic下分割槽的sn從0遞增,sn保證了乙個或多個生產者對乙個topic的同乙個分割槽訊息不重複

broker端在快取中儲存了這sequencenumber,對於接收的每條訊息,如果其sn比broker快取中sn大於1,則接受它,否則將其丟棄。但是,只能保證單個producer對於同乙個的exactly once語義。不能保證同乙個producer乙個topic不同的partion冪等

Kafka系列 Kafka核心概念

kafka系列文章 kafka系列 入門及應用場景 部署 簡單測試 bin kafka topics.sh create zookeeper 192.168.137.141 2181,192.168.137.142 2181,192.168.137.143 2181 kafka replicatio...

kafka核心概念與應用場景

kafka的主要特點 kafka是分布式發布 訂閱訊息系統。它最初由linkedin公司開發,之後成為apache專案的一部分。kafka是乙個分布式的,可劃分的,冗餘備份的永續性的日誌服務,它主要用於處理活躍的流式資料。kafka的架構 kafka的整體架構非常簡單,是顯式分布式架構,produc...

Kafka核心概念及核心機制

broker 程序 producer 生產者 flume consumer 消費者 ss spark streaming,topic 主題 分割槽 副本數 資料夾 partition 分割槽乙個分割槽可以有多個副本 重點解析 1.乙個組內,共享乙個公共的groupid 2.組內的所有消費者協調一起,...