在流式計算中,kafka是用來緩存數據的,storm經過消費kafka的數據進行計算。kafka的初心是,爲處理實時數據提供一個統1、高通量、低等待的平臺;算法
一、kafka是一個分佈式消息隊列:kafka對消息保存是根據topic主題進行歸類,發送消息者稱爲producer,消息接受者稱爲consumer,此外kafka集羣有多個kafka實例組成,每一個實例(server)稱爲broker;緩存
二、kafka的結構關係:kafka集羣是有多個broker實例組成,一個broker實例包含多個不一樣的topic主題,一個topic主題又有多個分區partition,一個partition分區就是一個消息隊列,partition分區能夠有0到多個備份,分佈在broker集羣上,partition分區有主從之分,是經過zookeeper選舉來肯定;服務器
三、kafka的核心概念:分佈式
一、Broker:每一個kafka server稱爲一個Broker,多個borker組成kafka cluster。一個機器上能夠部署一個或者多個Broker,這多個Broker鏈接到相同的ZooKeeper就組成了Kafka集羣。工具
二、主題Topic性能
Kafka的核心抽象概念記錄流 – 主題,主題是一種分類或發佈的一系列記錄的名義上的名字。Kafka的主題始終是支持多用戶訂閱的; 也就是說,一個主題能夠有零個,一個或多個消費者訂閱寫入的數據。一個Broker上能夠建立一個或者多個Topic。同一個topic能夠在同一集羣下的多個Broker中分佈。固然,Topic只是一個名義上的組件,真正在Broker間分佈式的Partition。spa
三、分區與日誌命令行
一個主題對應多個分區,一個分區對應一個日誌,Kafka會爲每一個topic維護了多個分區(partition),每一個分區會映射到一個邏輯的日誌(log)文件。每一個分區是一個有序的,不可變的消息序列,新的消息不斷追加到這個有組織的有保證的日誌上。分區會給每一個消息記錄分配一個順序ID號 – 偏移量, 可以惟一地標識該分區中的每一個記錄。日誌分區是分佈式的存在於一個kafka集羣的多個broker上。每一個partition會被複制多份存在於不一樣的broker上。這樣作是爲了容災。具體會複製幾份,會複製到哪些broker上,都是能夠配置的。通過相關的複製策略後,每一個topic在每一個broker上會駐留一到多個partition:代理
四、保留策略與Offset日誌
Kafka集羣保留全部發布的記錄,無論這個記錄有沒有被消費過,Kafka提供可配置的保留策略去刪除舊數據(還有一種策略根據分區大小刪除數據)。例如,若是將保留策略設置爲兩天,在記錄公佈後兩天內,它可用於消費,以後它將被丟棄以騰出空間。Kafka的性能跟存儲的數據量的大小無關, 因此將數據存儲很長一段時間是沒有問題的。
事實上,保留在每一個消費者元數據中的最基礎的數據就是消費者正在處理的當前記錄的偏移量(offset)或位置(position)。這種偏移是由消費者控制:一般偏移會隨着消費者讀取記錄線性前進,但事實上,由於其位置是由消費者進行控制,消費者能夠在任何它喜歡的位置讀取記錄。例如,消費者能夠恢復到舊的偏移量對過去的數據再加工或者直接跳到最新的記錄,並消費從「如今」開始的新的記錄。
這些功能的結合意味着,實現Kafka的消費者的代價都是很小的,他們能夠增長或者減小而不會對集羣或其餘消費者有太大影響。例如,你可使用咱們的命令行工具去追隨任何主題,並且不會改變任何現有的消費者消費的記錄。
五、Leader與Followers
一個Topic可能有不少分區,以便它可以支持海量的的數據,更重要的意義是分區是進行並行處理的基礎單元。日誌的分區會跨服務器的分佈在Kafka集羣中,每一個分區能夠配置必定數量的副本分區提供容錯能力。爲了保證較高的處理效率,消息的讀寫都是在固定的一個副本上完成。這個副本就是所謂的Leader,而其餘副本則是Follower,而Follower則會按期地到Leader上同步數據。
(1)leader處理全部的讀取和寫入分區的請求,而followers被動的從領導者拷貝數據。
(2)若是leader失敗了,followers之一將自動成爲新的領導者。
(3)每一個服務器可能充當一些分區的leader和其餘分區的follower,這樣的負載就會在集羣內很好的均衡分配。
(4)一個分區在同一時刻只能有一個消費者實例進行消費。
能夠看見咱們一共有3個分區分別是0,1,2, replica 有2個:
partition 0 的leader在broker1, follower在broker2
partition 1 的leader在broker2, follower在broker0
partition 2 的leader在broker0, follower在brokder1
一個broker中不會出現兩個同樣的Partition,replica會被均勻的分佈在各個kafka server(broker)上 。Kafka並不容許replicas 數設置大於 broker數,由於在一個broker上若是有2個replica實際上是沒有意義的,由於再多的replica同時在一臺broker上,隨着該broker的crash,一塊兒不可用。
(1)Leader選舉與ISR
若是某個分區所在的服務器除了問題,不可用,kafka會從該分區的其餘的副本中選擇一個做爲新的Leader。以後全部的讀寫就會轉移到這個新的Leader上。如今的問題是應當選擇哪一個做爲新的Leader。顯然,只有那些跟Leader保持同步的Follower才應該被選做新的Leader。
Kafka會在Zookeeper上針對每一個Topic維護一個稱爲ISR(in-sync replica,已同步的副本)的集合,該集合中是一些分區的副本。只有當這些副本都跟Leader中的副本同步了以後,kafka纔會認爲消息已提交,並反饋給消息的生產者。若是這個集合有增減,kafka會更新zookeeper上的記錄。若是某個分區的Leader不可用,Kafka就會從ISR集合中選擇一個副本做爲新的Leader。顯然經過ISR,kafka須要的冗餘度較低,能夠容忍的失敗數比較高。假設某個topic有f+1個副本,kafka能夠容忍f個服務器不可用。
(2)爲何不用少數服從多數的方法
少數服從多數是一種比較常見的一致性算法和Leader選舉法。它的含義是隻有超過半數的副本同步了,系統纔會認爲數據已同步;選擇Leader時也是從超過半數的同步的副本中選擇。這種算法須要較高的冗餘度。譬如只容許一臺機器失敗,須要有三個副本;而若是隻容忍兩臺機器失敗,則須要五個副本。而kafka的ISR集合方法,分別只須要兩個和三個副本。
(3)若是全部的ISR副本都失敗了怎麼辦
此時有兩種方法可選,一種是等待ISR集合中的副本復活,一種是選擇任何一個當即可用的副本,而這個副本不必定是在ISR集合中。這兩種方法各有利弊,實際生產中按需選擇。若是要等待ISR副本復活,雖然能夠保證一致性,但可能須要很長時間。而若是選擇當即可用的副本,則極可能該副本並不一致。
6 生產者和消費者
(1)生產者
生產者發佈數據到他們所選擇的主題。生產者負責選擇把記錄分配到主題中的哪一個分區。這可使用輪詢算法( round-robin)進行簡單地平衡負載,也能夠根據一些更復雜的語義分區算法(好比基於記錄一些鍵值)來完成。
(2)消費者
消費者以消費羣(consumer group)的名稱來標識本身,每一個發佈到主題的消息都會發送給訂閱了這個主題的消費羣裏面的一個消費者實例,即一個消費羣只發送一次。消費者的實例能夠在單獨的進程或單獨的機器上。