1. Kafka架構(gòu)

Kafka

Kafka 中文官方文檔

一、介紹

Apache Kafka? 是 一個(gè)分布式流處理平臺(tái),構(gòu)造實(shí)時(shí)流數(shù)據(jù)管道。

1.Kafka作為一個(gè)集群,運(yùn)行在一臺(tái)或者多臺(tái)服務(wù)器上.
2.Kafka 通過(guò) topic 對(duì)存儲(chǔ)的流數(shù)據(jù)進(jìn)行分類。
3.每條記錄中包含一個(gè)key,一個(gè)value和一個(gè)timestamp(時(shí)間戳)。

kafka的核心API

Producer API:允許一個(gè)應(yīng)用程序發(fā)布一串流式的數(shù)據(jù)到一個(gè)或者多個(gè)Kafka topic。
Consumer API:允許一個(gè)應(yīng)用程序訂閱一個(gè)或多個(gè) topic ,并且對(duì)發(fā)布給他們的流式數(shù)據(jù)進(jìn)行處理。
Streams API:允許一個(gè)應(yīng)用程序作為一個(gè)流處理器,消費(fèi)一個(gè)或者多個(gè)topic產(chǎn)生的輸入流,然后生產(chǎn)一個(gè)輸出流到一個(gè)或多個(gè)topic中去,在輸入輸出流中進(jìn)行有效的轉(zhuǎn)換。
Connector API:允許構(gòu)建并運(yùn)行可重用的生產(chǎn)者或者消費(fèi)者,將Kafka topics連接到已存在的應(yīng)用程序或者數(shù)據(jù)系統(tǒng)。連接到一個(gè)關(guān)系型數(shù)據(jù)庫(kù),捕捉表(table)的變更內(nèi)容。

Topic與Offset

Topic 就是數(shù)據(jù)主題,是數(shù)據(jù)記錄發(fā)布的地方,可以用來(lái)區(qū)分業(yè)務(wù)系統(tǒng)。

Kafka中的Topics總是多訂閱者模式,一個(gè)topic可以擁有一個(gè)或者多個(gè)消費(fèi)者來(lái)訂閱它的數(shù)據(jù)。消費(fèi)者可以采取修改Offset的方式來(lái)控制消費(fèi)數(shù)據(jù)的位置。

對(duì)于每一個(gè)topic, Kafka集群都會(huì)維持一個(gè)分區(qū)日志,如圖所示:
[圖片上傳失敗...(image-90ecbe-1575963276366)]

每個(gè)分區(qū)都是有序且順序不可變的記錄集,并且不斷地追加到結(jié)構(gòu)化的commit log文件。分區(qū)中的每一個(gè)記錄都會(huì)分配一個(gè)id號(hào)來(lái)表示順序,我們稱之為offset,offset 用來(lái)唯一的標(biāo)識(shí)分區(qū)中每一條記錄。

kafka的數(shù)據(jù)存儲(chǔ)時(shí)效--Kafka的性能和數(shù)據(jù)大小無(wú)關(guān),所以長(zhǎng)時(shí)間存儲(chǔ)數(shù)據(jù)沒(méi)有什么問(wèn)題
Kafka 集群保留所有發(fā)布的記錄—無(wú)論他們是否已被消費(fèi)—并通過(guò)一個(gè)可配置的參數(shù)——保留期限來(lái)控制。
    如果保留策略設(shè)置為2天,一條記錄發(fā)布后兩天內(nèi),可以隨時(shí)被消費(fèi),兩天過(guò)后這條記錄會(huì)被拋棄并釋放磁盤(pán)空間。

[圖片上傳失敗...(image-3bb679-1575963276366)]

二、Kakfa 架構(gòu)

kafka 集群:一個(gè)kafka集群由多臺(tái)服務(wù)器組成,也就是多個(gè)broker。

Broker:一個(gè)kafka服務(wù)器是一個(gè)broker。一個(gè)broker有多個(gè)Topic。

Topic:相當(dāng)于消息系統(tǒng)中的一個(gè)隊(duì)列queue,也是數(shù)據(jù)主題。一個(gè)topic有多個(gè)partition。

Partition:每個(gè)partition是一個(gè)有序的隊(duì)列。partition中的每條消息都會(huì)被分配一個(gè)有序的id(offset)。kafka只保證按一個(gè)partition中的順序?qū)⑾l(fā)給consumer,不保證一個(gè)topic的整體(多個(gè)partition間)的順序。

Offset:某個(gè)Topic下的某個(gè)Partition分區(qū)數(shù)據(jù)被某個(gè)消費(fèi)者組所消費(fèi)的位置。kafka的存儲(chǔ)文件都是按照offset.kafpartition可能對(duì)應(yīng)多個(gè)broker。沒(méi)有Replcation的情況下,一旦broker宕機(jī),其上所有的broker都不可以被消費(fèi),同時(shí)producer也不能再將數(shù)據(jù)存于其上的patition。引入replication之后,同一個(gè)partition可能會(huì)有多個(gè)replication,而這時(shí)需要在這些replication之間選出一個(gè)leader,producer和consumer只與這個(gè)leader交互,其它replication作為follower從leader 中復(fù)制數(shù)據(jù)。
Producer :消息生產(chǎn)者,就是向kafka broker發(fā)消息的客戶端。

Consumer :消息消費(fèi)者,向kafka broker取消息的客戶端。

[圖片上傳失敗...(image-86267a-1575963276367)]

若一個(gè)Topic的分區(qū)數(shù)為5,副本數(shù)為3。則需要放置共15個(gè)分區(qū)的數(shù)據(jù)。Broker的數(shù)量為5,則分布為
第一個(gè)分區(qū)(編號(hào)為0)的第一個(gè)副本放置位置是隨機(jī)從 brokerList 選擇的。
其他分區(qū)的第一個(gè)副本放置位置相對(duì)于第0個(gè)分區(qū)依次往后移。也就是如果我們有5個(gè)Broker,5個(gè)分區(qū)。
    假設(shè)第一個(gè)分區(qū)放在第四個(gè) Broker 上
    那么第二個(gè)分區(qū)將會(huì)放在第五個(gè) Broker 上
    第三個(gè)分區(qū)將會(huì)放在第一個(gè) Broker 上
    第四個(gè)分區(qū)將會(huì)放在第二個(gè) Broker 上
    依次類推...
剩余的副本相對(duì)于第一個(gè)副本放置位置其實(shí)是由 nextReplicaShift 決定的,而這個(gè)數(shù)也是隨機(jī)產(chǎn)生的。
第一個(gè)放置的分區(qū)副本一般都是 Leader,其余的都是 Follow 副本。
如果我們考慮機(jī)架的話,Leader與Follow會(huì)在不同的機(jī)架上。

Kafka消息的消費(fèi)順序保證

Kafka的topic中的partition是一個(gè)并行的概念。

Kafka能夠?yàn)橐粋€(gè)消費(fèi)者池提供順序保證和負(fù)載平衡,是通過(guò)將topic中的partition分配給消費(fèi)者組中的消費(fèi)者來(lái)實(shí)現(xiàn)的, 以便每個(gè)分區(qū)由消費(fèi)組中的一個(gè)消費(fèi)者消耗。通過(guò)這樣,我們能夠確保消費(fèi)者是該分區(qū)的唯一讀者,并按順序消費(fèi)數(shù)據(jù)。 眾多分區(qū)保證了多個(gè)消費(fèi)者實(shí)例間的負(fù)載均衡。但請(qǐng)注意,消費(fèi)者組中的消費(fèi)者實(shí)例個(gè)數(shù)不能超過(guò)分區(qū)的數(shù)量。

Kafka 作為存儲(chǔ)系統(tǒng)

數(shù)據(jù)寫(xiě)入Kafka后被寫(xiě)到磁盤(pán),并且進(jìn)行備份以便容錯(cuò)。直到完全備份,Kafka才讓生產(chǎn)者認(rèn)為完成寫(xiě)入,即使寫(xiě)入失敗Kafka也會(huì)確保繼續(xù)寫(xiě)入

生產(chǎn)者

生產(chǎn)者可以將數(shù)據(jù)發(fā)布到所選擇的topic(主題)中。生產(chǎn)者負(fù)責(zé)將記錄分配到topic的哪一個(gè) partition(分區(qū))中??梢允褂醚h(huán)的方式來(lái)簡(jiǎn)單地實(shí)現(xiàn)負(fù)載均衡,也可以根據(jù)某些語(yǔ)義分區(qū)函數(shù)(例如:記錄中的key)來(lái)完成。

消費(fèi)者

消費(fèi)者使用一個(gè) 消費(fèi)組 名稱來(lái)進(jìn)行標(biāo)識(shí),發(fā)布到topic中的每條記錄被分配給訂閱消費(fèi)組中的一個(gè)消費(fèi)者實(shí)例.消費(fèi)者實(shí)例可以分布在多個(gè)進(jìn)程中或者多個(gè)機(jī)器上。

如果所有的消費(fèi)者實(shí)例在同一消費(fèi)組中,消息記錄會(huì)負(fù)載平衡到每一個(gè)消費(fèi)者實(shí)例.

如果所有的消費(fèi)者實(shí)例在不同的消費(fèi)組中,每條消息記錄會(huì)廣播到所有的消費(fèi)者進(jìn)程.
[圖片上傳失敗...(image-2a0944-1575963276367)]

如圖,這個(gè) Kafka 集群有兩臺(tái) server 的,四個(gè)分區(qū)(p0-p3)和兩個(gè)消費(fèi)者組。消費(fèi)組A有兩個(gè)消費(fèi)者,消費(fèi)組B有四個(gè)消費(fèi)者。

通常情況下,每個(gè) topic 都會(huì)有一些消費(fèi)組,一個(gè)消費(fèi)組對(duì)應(yīng)一個(gè)"邏輯訂閱者"。一個(gè)消費(fèi)組由許多消費(fèi)者實(shí)例組成,便于擴(kuò)展和容錯(cuò)。這就是發(fā)布和訂閱的概念,只不過(guò)訂閱者是一組消費(fèi)者而不是單個(gè)的進(jìn)程。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容