kafka is a distributed, partitiononed,replicated commited logservice.
kafka是乙個分布式的、易擴充套件的、安全性高的訊息服務系統。
kafka提供了類似於jms的特性,但在設計實現上又完全不同,它並不是基於jms規範實現的(kafka的實現不包含事務特性性)。
kafka對訊息的儲存時以topic進行歸類的,向topic傳送訊息的稱謂producer,從topic接受訊息的稱謂consumer。
kafka集群由多個service組成,每個service在kafka集群中被稱作broker。
kafka集群的作用就是儲存從producer發過來的訊息,然後按照一定的規則將訊息傳送給consumer。
無論是kafka集群本身,還是producer 或者consumer,均依賴於zookeeper來管理集群中的資訊同步。
下圖為kafka基本結構組成圖:
對於consumer而言,他需要儲存消費訊息的offset,對於offset的儲存和使用,由consumer來控制;當consumer正常消費訊息時,offset將會「線性的」向前驅動,即,訊息將依照順序被消費。實際上,consumer也可以通過指定offset來消費特定的訊息(offset將會儲存在zookeeper中,參見下文)。
kafka集群幾乎不需要維護任何producer和consumer的狀態訊息,這些訊息由zookeeper來維護儲存,因此,producer和consumer的客戶端非常輕量級,他們可以隨意的加入或者離開,不會對集群造成額外的影響。
partition的設計目的有多個,最根本的原因是kafka基於檔案儲存,通過分割槽,可以將日誌內容分布到多個broker上,避免檔案尺寸達到單機的儲存上線。可以將乙個topic劃分成多個partitions,這樣既可以降低對單機磁碟容量的要求,又可以提高系統訊息的讀寫速率。此外,越多的partition意味著可以容納更多的consumer,更有效的提公升併發效能。
乙個topic的多個partition被分配在kafka集群的多個broker上,每個broker負責partitions中訊息的讀寫操作;此外,kafka還可以配置partition需要的備份個數(replicas),每個partition將會被備份到多個broker中,這樣就增強了系統的可靠性。
基於replicated方案,那麼就意味著需要對多個備份進行排程,每個partition都有乙個broker為「leader」,其餘都為「follower」。leader負責所有的讀寫操作,如果leader失效,那麼將會有其他的follower被選舉為新的leader;follower只是單純的和leader進行訊息同步即可。由此可見,部署leader的broker承載了partition全部的請求壓力,因此,從集群的整體角度考慮,有多少個partition,就有多少個leader,kafka將會將這些leader均衡的分配在broker上,來確保集群整體的吞吐量和穩定性。
producer將訊息發布到指定的topic中,同時,producer還需要指定該訊息屬於哪個partition
本質上kafka只支援topic,每乙個consumer屬於乙個consumer group,每個consumer group可以包含多個consumer。傳送到topic的訊息只會被訂閱該topic的每個group中的乙個consumer消費。
如果所有的consumer都具有相同的group,這種情況和queue很相似,訊息將會在consumer之間均衡分配;
如果所有的consumer都在不同的group中,這種情況就是廣播模式,訊息會被傳送到所有訂閱該topic的group中,那麼所有的consumer都會消費到該訊息。
kafka的設計原理決定,對於同乙個topic,同乙個group中consumer的數量不能多於partition的數量,否則就會有consumer無法獲取到訊息。
傳送到partition中的訊息將會按照它的接受順序追加到日誌中;
對於消費者而言,它的訊息消費順序是和日誌中的順序一致的;
如果partition的replicationfactor為n,那麼就允許n-1個broker失效。
對於一些常規的訊息系統,kafka是個不錯的選擇,partition/replication和容錯,使得kafka具有良好的擴充套件性和安全性。不過到目前為止,kafka並沒有提供jms中的「事務性」「訊息傳輸擔保機制(訊息確認機制)」「訊息分組」等企業級特性;kafka只能作為常規的訊息系統,在一定程度上,尚未確定訊息傳送與接收的絕對可靠。
kafka可以作為「**活性追蹤」的最佳工具;可以將網頁/使用者操作等資訊傳送到kafka,進行實時監控或者離線分析等。
kafka設計初衷是希望作為乙個統一的資訊收集平台,能夠事實的收集和反饋資訊,並且能夠支撐較大的資料量,且具備良好的容錯能力。
生產者
負載均衡:producer將會和topic下的所有partition leader保持socket連線;訊息由producer直接通過socket傳送個broker,中間不會經過任何「訊息路由」,實際上,訊息被傳送給哪個broker由producer端決定。如果乙個訊息有多個partitions,那麼在producer端實現訊息「均衡分發」是很有必要的。
其中partition leader位置(host:port)儲存在zookeeper中,producer作為zookeeper client,已經註冊了watch用來監聽partition leader的變更事件。
非同步傳送:將多條訊息暫且儲存在producer的buffer中,當達到一定的數量閾值時,將他們一起批量傳送給broker,延遲批量傳送實際上是提高了網路效率。不過也存在一些隱患,比如當producer失效時,那些尚未傳送出去的訊息將會丟失。
消費者
consumer端向broker傳送fatch請求,並告訴其獲取訊息的offset,此後,consumer會獲得一定數量的訊息,consumer端也可以通過重置offset來重新獲取想要的訊息。
在jms中,topic模型是基於push方式的,即broker將訊息推送給consumer端。不過在kafka中,採用的是pull模型,即consumer在和broker建立連線後,主動去pull(也就是fatch)訊息;這種模式有自己的優點,首先,consumer可以根據自己的消費需求去fatch合適的訊息並進行處理,此外,消費者可以良好的控制消費訊息的數量。
在kafka中,partition中的訊息只有乙個consumer在消費,不存在訊息狀態的控制,也沒有複雜的訊息確認機制,可見,kafka broker是相當輕量級的。當訊息被consumer接收後,consumer在本地儲存最後消費訊息的offset,並間歇性的向zookeeper註冊offset。由此可見,consumer也是輕量級的。
kafka將每個partition資料複製到多個broker上,任何乙個partition都有乙個leader和多個follower(可以沒有)。備份的個數可以通過broker的配置檔案進行配置。leader處理所有的read-write請求,follower只需要和leader保持資訊同步即可,leader負責跟蹤所有的follower狀態資訊,如果follower落後太多或者失效,leader將會把它從replicas同步列表中刪除。當所有的follower將一條訊息儲存成功,該訊息才被認為是傳送成功(committed),此時,consumer才能消費它。即使只有乙個replicas存活,仍然可以保證訊息的正常傳送和接受,只要zookeeper集群存活即可。(不同於其他分布式儲存,需要多數派存活)
當leader失效時,需要在follower中選擇乙個新的leader(此選舉並非通過zookeeper進行選舉的),可能此時的follower落後於leader,因此需要乙個「up-to-date」的follower。選擇新的leader時也需要同時兼顧乙個問題,那就是broker上leader的數量,如果乙個server上有多個leader,意味著此service將承受更多的io壓力,所以在選舉時,需要考慮leader的「負載平衡」。
Kafka 基礎概念理解
producer 訊息生產者,向 kafka broker 發訊息的客戶端。consumer 訊息消費者,從 kafka broker 取訊息的客戶端。consumer group 消費者組 cg 消費者組內每個消費者負責消費不同分割槽的資料,提高消費能力。乙個分割槽只能由組內乙個消費者消費,消費者...
Kafka 基礎概念及架構
kafka是 個分布式 分割槽的 多副本的 多 產者 多訂閱者,基於zookeeper協調的分布式 志系統 也可以當做mq系統 常 可以 於web nginx 志 訪問 志,訊息服務等等。kafka主要應 場景 志收集系統和訊息系統 kafka主要設計目標 kafka訊息傳遞模式 發布 訂閱模式 不...
Kafka學習整理一 基礎概念
kafka中包含以下基礎概念 1.topic 話題 kafka中用於區分不同類別資訊的類別名稱。由producer指定 2.producer 生產者 將訊息發布到kafka特定的topic的物件 過程 3.consumers 消費者 訂閱並處理特定的topic中的訊息的物件 過程 4.broker ...