Kafka簡介和架構

一、簡介

Kafka是一個分佈式消息隊列。Kafka對消息保存時根據Topic進行歸類,發送消息者稱爲Producer,消息接受者稱爲Consumer,此外kafka集羣有多個kafka實例組成,每個實例(server)稱爲broker。無論是kafka集羣,還是consumer都依賴於zookeeper集羣保存一些meta信息,來保證系統可用性。

二、優點(相比較於Flume)

在企業中必須要清楚流式數據採集框架flume和kafka的定位是什麼:

flume:★ 適合多個生產者;適合下游數據消費者不多的情況;適合數據安全性要求不高的操作;適合與Hadoop生態圈對接的操作。爲什麼只適合多個生產者,適合下游不多的消費者呢?因爲,有多個消費者則就會有多個channel,而channel一般都是內存channel,這樣所佔資源很大。 

kafka:適合數據下游消費衆多的情況;適合數據安全性要求較高的操作,支持replication。爲什麼適合數據下游消費衆多?因爲有就算有多個消費者,kafka裏面存的數據是一樣的,不會再增加副本。

因此我們常用的一種模型是:

線上數據 --> flume --> kafka  --> HDFS:所以一般情況下,企業用flume收集日誌數據,然後下游sink選擇kafka。兩者的具體的整合見https://blog.csdn.net/student__software/article/details/81486566

三、架構

1、結構名詞解釋:

1)Producer :消息生產者,就是向kafka broker發消息的客戶端;

2)Consumer :消息消費者,向kafka broker取消息的客戶端;

3)Topic :可以理解爲一個隊列;

4) Consumer Group (CG):這是kafka用來實現一個topic消息的廣播(發給所有的consumer)和單播(發給任意一個consumer)的手段。一個topic可以有多個CG。topic的消息會複製(不是真的複製,是概念上的)到所有的CG,但每個partion只會把消息發給該CG中的一個consumer。如果需要實現廣播,只要每個consumer有一個獨立的CG就可以了。要實現單播只要所有的consumer在同一個CG。用CG還可以將consumer進行自由的分組而不需要多次發送消息到不同的topic;

5)Broker :一臺kafka服務器就是一個broker。一個集羣由多個broker組成。一個broker可以容納多個topic;

6)Partition:爲了實現擴展性,一個非常大的topic可以分佈到多個broker(即服務器)上,一個topic可以分爲多個partition,每個partition是一個有序的隊列。partition中的每條消息都會被分配一個有序的id(offset)。kafka只保證按一個partition中的順序將消息發給consumer,不保證一個topic的整體(多個partition間)的順序;

7)Offset:kafka的存儲文件都是按照offset.kafka來命名,用offset做名字的好處是方便查找。例如你想找位於2049的位置,只要找到2048.kafka的文件即可。當然the first offset就是00000000000.kafka。

2、內部結構注意

1)、消費者和生產者能操作的最小單元是分區,也就是不可能只消費一條數據

2)、消費者組是邏輯概念,只是一個標記而已,具體的修改在config的server.properties中的設置int類型的broker_id

3 )、同一個消費者組裏面不能是同時消費者消費消息,只能有一個消費者去消費,第二,同一個消費者組裏面是不會重複消費消息的,第三,同一個消費者組的一個消費者不是以一條一條數據爲單元的,是以分區爲單元,就相當於消費者和分區建立某種socket,進行傳輸數據,所以,一旦建立這個關係,這個分區的內容只能是由這個消費者消費。

4)、Zookeeper保存kafka的集羣狀態信息的,包括每個broker,爲什麼?,因爲zk和broker建立監聽,一旦有一個broker宕機了,另一個備份就可以變爲領導,第二,zk保存消費者的消費信息,爲什麼要保存?就是爲了消費者下一次再次消費可以得知offset這個偏移量,consumer信息高版本在本地維護

5)、爲什麼說kafka是分佈式模型呢?首先,同一個kafka集羣有共同擁有一個topic, 而同一個topic又擁有不同的分區,不同的分區可以分佈在不同的borker上也就是不同的機子上,所以,分區是分佈式的,則數據也是分佈式的,kafka就是分佈式

6)、在不加上leader和fllower的概念的前提下,kafka的同一個topic裏的分區號是不同,一定不能重複。

7)、除了分區是分佈式的,還有消費者也是分佈式的,比如,消費者組裏的消費者可以在不同的機器上,有什麼好處?消費的方式可以是存儲可以是計算,如果是放在一臺機子上,Io等壓力很大,

8)、kafka上面的所有想到的角色都是分佈式的,不管是消費者還是生產者還是分區,他們之間溝通的唯一橋樑就是zookeeper

9)、強調:kafka分區內有序,整體不一定有序。

10)、消費者組的概念很重要,下圖解釋和同一組和不同組的使用情景

怎麼實現消費者消費不同的數據? 將消費者放在同一組,但是生產環境一般要求消費者消費的數據一樣且多個,比如一個寫到hdfs,一個放到spark計算,這樣就得要求不同的消費者在不同的消費者組裏。

簡單的說就是隊列裏面的數據,如果想讓不同的消費者讀不同的數據,就把他們放在同一個組裏,否則放在不同組。

 

發佈了53 篇原創文章 · 獲贊 37 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章