Apache Kafka核心概念-多圖-形象易懂(入門教程輕鬆學)

本入門教程,涵蓋Kafka核心內容,經過實例和大量圖表,幫助學習者理解,任何問題歡迎留言。算法

目錄:編程

本章是學習kafka的核心章節,涵蓋內容比較多,在理解上有必定的難度,須要反覆閱讀理解,才能參透Kafka的設計思想。安全

一、Kafka集羣結構

在第一章我給出過一個消息系統通用的結構圖,也就是下圖:學習

實際上kafka的結構圖是有些區別的,如今咱們看下面的圖:spa

producer和consumer想必你們都很熟悉,一個生產消息,一個消費掉消息。這裏就再也不作太多解釋。.net

此圖和第一張圖能夠看到有幾個區別:設計

一、多了zookeeper集羣,經過前幾章的學習咱們已經知道kafka是配合zookeeper進行工做的。3d

二、kafka集羣中能夠看到有若干個Broker,其中一個broker是leader,其餘的broker是follower日誌

三、consumer外面包裹了一層Consumer group。server

咱們先講解一下Broker和consumer group的概念,以及Topic。

 

Broker

一個Borker就是Kafka集羣中的一個實例,或者說是一個服務單元。鏈接到同一個zookeeper的多個broker實例組成kafka的集羣。在若干個broker中會有一個broker是leader,其他的broker爲follower。leader在集羣啓動時候選舉出來,負責和外部的通信。當leader死掉的時候,follower們會再次經過選舉,選擇出新的leader,確保集羣的正常工做。

 

Consumer Group

Kafka和其它消息系統有一個不同的設計,在consumer之上加了一層group。同一個group的consumer能夠並行消費同一個topic的消息,可是同group的consumer,不會重複消費。這就比如多個consumer組成了一個團隊,一塊兒幹活,固然幹活的速度就上來了。group中的consumer是如何配合協調的,其實和topic的分區相關聯,後面咱們會詳細論述。

若是同一個topic須要被屢次消費,能夠經過設立多個consumer group來實現。每一個group分別消費,互不影響。

經過本節學習,咱們從全局的層面瞭解了kafka的結構,接下來咱們會深刻到kafka內部,來看看它是怎麼工做的。

 

Topic

kafka中消息訂閱和發送都是基於某個topic。好比有個topic叫作NBA賽事信息,那麼producer會把NBA賽事信息的消息發送到此topic下面。全部訂閱此topic的consumer將會拉取到此topic下的消息。Topic就像一個特定主題的收件箱,producer往裏丟,consumer取走。

 

二、Kafka核心概念簡介

kafka採用分區(Partition)的方式,使得消費者可以作到並行消費,從而大大提升了本身的吞吐能力。同時爲了實現高可用,每一個分區又有若干份副本(Replica),這樣在某個broker掛掉的狀況下,數據不會丟失。

接下來咱們詳細分析kafka是如何基於Partition和Replica工做的。

 

分區(Partition)

大多數消息系統,同一個topic下的消息,存儲在一個隊列。分區的概念就是把這個隊列劃分爲若干個小隊列,每個小隊列就是一個分區,以下圖:

這樣作的好處是什麼呢?其實從上圖已經能夠看出來。無分區時,一個topic只有一個消費者在消費這個消息隊列。採用分區後,若是有兩個分區,最多兩個消費者同時消費,消費的速度確定會更快。若是以爲不夠快,能夠加到四個分區,讓四個消費者並行消費。分區的設計大大的提高了kafka的吞吐量!!

咱們再結合下圖繼續講解Partition。

此圖包含以下幾個知識點:

一、一個partition只能被同組的一個consumer消費(圖中只會有一個箭頭指向一個partition)

二、同一個組裏的一個consumer能夠消費多個partition(圖中第一個consumer消費Partition 0和3)

三、消費效率最高的狀況是partition和consumer數量相同。這樣確保每一個consumer專職負責一個partition。

四、consumer數量不能大於partition數量。因爲第一點的限制,當consumer多於partition時,就會有consumer閒置。

五、consumer group能夠認爲是一個訂閱者的集羣,其中的每一個consumer負責本身所消費的分區

 

爲了加深理解,我舉個吃蘋果的例子。

問題:有一籃子蘋果,你如何把這一籃子蘋果儘量快的吃完?

辦法一:

我一我的,一個一個蘋果吃,以下圖。這樣顯然很慢,我吃完一個才能拿下一個。

辦法二:

我再找兩我的來一塊吃,第一我的拿走一個去吃,而後第二我的拿一個去吃,接着第三我的拿一個去吃,如此循環。速度確定快了,可是三我的仍是會排隊等待。三我的排隊時間可能很短,可是若是叫了100我的幫忙吃呢?會有大量時間消耗在排隊上。

辦法三:

我仍是找兩我的來一塊吃,但我把蘋果提早分到三個盤子裏,每人分一個盤子,本身吃本身的,這樣不但能三我的同時吃蘋果,還無須排隊。速度顯然是最快的。

辦法三正是kafka所採用的設計方式,盤子就是partition,每一個人就是一個consumer,每一個蘋果就是一條message。辦法三每一個盤子中蘋果的消費是有序的,而辦法二的消費是徹底無序的。

相信經過這個例子你必定能充分理解partition的概念,以及爲何kafka會如此設計。

關於partition暫時說到這裏,接下來介紹副本。

 

副本(Replica)

提到副本,確定就會想到正本。副本是正本的拷貝。在kafka中,正本和副本都稱之爲副本(Repalica),但存在leader和follower之分。活躍的稱之爲leader,其餘的是follower。

每一個分區的數據都會有多份副本,以此來保證Kafka的高可用。

Topic、partition、replica的關係以下圖:

topic下會劃分多個partition,每一個partition都有本身的replica,其中只有一個是leader replica,其他的是follower replica。

消息進來的時候會先存入leader replica,而後從leader replica複製到follower replica。只有複製所有完成時,consumer才能夠消費此條消息。這是爲了確保意外發生時,數據能夠恢復。consumer的消費也是從leader replica讀取的。

因而可知,leader replica作了大量的工做。因此若是不一樣partition的leader replica在kafka集羣的broker上分佈不均勻,就會形成負載不均衡。

kafka經過輪詢算法保證leader replica是均勻分佈在多個broker上。以下圖。

能夠看到每一個partition的leader replica均勻的分佈在三個broker上,follower replica也是均勻分佈的。

關於Replica,有以下知識點:

一、Replica均勻分配在Broker上,同一個partition的replica不會在同一個borker上

二、同一個partition的Replica數量不能多於broker數量。多個replica爲了數據安全,一臺server存多個replica沒有意義。server掛掉,上面的副本都要掛掉。

三、分區的leader replica均衡分佈在broker上。此時集羣的負載是均衡的。這就叫作分區平衡

分區平衡是個很重要的概念,接下來咱們就來說解分區平衡。

 

分區平衡

在講分區平衡前,先講幾個概念:

一、AR: assigned replicas,已分配的副本。每一個partition都有本身的AR列表,裏面存儲着這個partition最初分配的全部replica。注意AR列表不會變化,除非增長分區。

二、PR(優先replica):AR列表中的第一個replica就是優先replica,並且永遠是優先replica。最初,優先replica和leader replica是同一個replica。

三、ISR:in sync replicas,同步副本。每一個partition都有本身的ISR列表。ISR是會根據同步狀況動態變化的。

最初ISR列表和AR列表是一致的,但因爲某個節點死掉,或者某個節點的follower replica落後leader replica太多,那麼該節點就會被從ISR列表中移除。此時,ISR和AR就再也不一致

接下來咱們經過一個例子來理解分區平衡。

一、根據以上信息,一個擁有3個replica的partition,最初是下圖的樣子。

能夠看到AR和ISR保持一致,而且初始時刻,優先副本和leader副本都指向replica 0.

二、接下來,replica 0所在的機器下線了,那麼狀況會變成以下圖所示:

能夠看到replica 0已經從ISR中移除掉了。同時,因爲從新選舉,leader副本變成了replica 1,而優先副本仍是replica 0。優先副本是不會改變的。

因爲最初時,leader副本在broker均勻分佈,分區是平衡的。但此時,因爲此partition的leader副本換成了另一個,因此此時分區平衡已經被破壞。

三、replica 0所在的機器修復了,又從新上線,狀況以下圖:

能夠看到replica 0從新回到ISR列表中,不過此時他沒能恢復leader的身份。只能做爲follower當一名小弟。

此時分區依舊是不平衡的。那是否意味着分區永遠都會不平衡下去呢?不是的。

四、kafka會定時觸發分區平衡操做,也能夠主動觸發分區平衡。這就是所謂的分區平衡操做,操做完後以下圖。

能夠看到此時leader副本經過選舉,會從新變回來replica 0,由於replica 0是優先副本,其實優先的含義就是選擇leader時被優先選擇。這樣整個分區又回到了初始狀態,而初始時,leader副本是均勻分佈的。此時已經分區平衡了。

因而可知,分區平衡操做就是使leader副本和優先副本保持一致的操做。能夠把優先副本理解爲分區的平衡狀態位,平衡操做就是讓leader副本歸位。

 

Partition的讀和寫

經過以前的學習,咱們知道topic下劃分了多個partition,消息的生產和消費最終都是發生在partition之上。下圖是一個三個partition的topic的讀寫示意。

咱們先看右邊的producer,能夠看到寫的時候,採用round-robin算法,輪詢往每一個partition寫入。

而在消費者端,每一個consumer都維護一個offset值,指向的是它所消費到的消息座標。

咱們先看group A的三個consumer,他們分別獨立消費不一樣的三個partition。每一個consumer維護了本身的offset。

咱們再看group B,能夠看到兩個group是並行消費整個topic,同一條消息會被不一樣group消費到。

 

此處有以下知識點:

一、每一個partition都是有序的不可變的。

二、Kafka能夠保證partition的消費順序,但不能保證topic消費順序。

三、不管消費與否,保留週期默認兩天(可配置)。

四、每一個consumer維護的惟一元數據是offset,表明消費的位置,通常線性向後移動。

五、consumer也能夠重置offset到以前的位置,能夠以任何順序消費,不必定線性後移。

 

回顧

本章是理解kafka設計的核心,經過本章學習你應該理解以下知識點:

  1. producer
  2. consumer
  3. consumer group
  4. broker
  5. 分區(partition)
  6. 副本(replica)
  7. 分區平衡
  8. 消息讀寫

若是對上面提到的知識點還有不清晰的地方,請再複習,或者找其它學習資料進行學習。

下一步:開始kafka核心組件和流程-控制器的學習