在當今世界,即時資料推動業務決策和消費者體驗,掌握 Kafka 對於使用大規模資料系統的任何人都至關重要。無論您是建立可擴展的資料管道、支援分析還是開發即時應用程式,Kafka 都是這一切的核心。但卡夫卡到底是什麼?它是如何運作的?為什麼它在處理海量資料流方面如此受歡迎?
在這份綜合指南中,我們將揭開 Kafka 的神秘面紗,從設定具有多個代理的 Kafka 叢集到理解分區、消費者偏移和複製等複雜概念。無論您是剛入門還是希望提高自己的技能,本指南都將帶您了解 Kafka 的每個關鍵方面,您需要了解這些方面,才能像專業人士一樣處理即時資料挑戰。
讓我們深入了解吧!
Apache Kafka 是一個強大的分散式事件流平台,廣泛用於即時資料處理。對於初學者來說,Kafka 的術語可能會讓人感到不知所措,但它們是理解 Kafka 工作原理的關鍵。在本部落格中,我們將揭開 Kafka 概念的神秘面紗,例如群集、代理、生產者、消費者、主題、分區、流和連接,並以簡單、分步的方式介紹它們的功能。
Kafka是一個分散式系統,旨在高效處理大資料流。它充當中間人,實現不同系統之間的即時資料交換。想像一個報紙遞送系統:生產者是印刷機,消費者是讀者,Kafka 是確保報紙按時送達的遞送系統。
Kafka 叢集是一組協同工作的 Kafka Broker。
每個broker都是一個Kafka伺服器,負責處理來自客戶端的讀寫請求並儲存資料。
為了容錯和可擴展性,多個代理程式在叢集中進行協作。
範例:想像一下多個倉庫一起工作來儲存和分發產品。這些倉庫就是你的broker,集合系統就是Kafka叢集。
Broker 是單一 Kafka 伺服器。
每個代理程式都有一個唯一的 ID,並負責儲存特定部分的資料。
代理根據主題和分區在它們之間分發傳入的資料(訊息)。
即使一個代理程式發生故障,叢集也可以使用其他代理程式上儲存的複製資料進行復原。
生產者是向 Kafka 發送新資料的應用程式或系統。
在我們的類比中,將生產者視為報紙的出版商。
它將資料傳送到 Kafka 叢集內的特定主題。
例如:
天氣應用程式向 Kafka 發送即時溫度資料。
一個電子商務網站記錄使用者活動以進行即時分析。
Consumer 是一個從 Kafka 讀取資料的應用程式。
消費者訂閱特定主題並處理傳入的資料。
例如,股票交易應用程式可能會使用即時市場資料來更新用戶螢幕上的價格。
主題是訊息發送到的類別或提要名稱。
主題就像資料庫中的表或檔案系統中的資料夾。
生產者將資料傳送到主題,消費者從中讀取資料。
例子:
「天氣」主題包含與天氣相關的更新。
「股票價格」主題儲存即時市場資料。
分區將主題分解為較小的部分,以實現可擴展性和容錯能力。
每個主題分為一個或多個分區。
範例:將分區視為主題中的一本書的頁面。
每個頁面都包含主題資料的一部分。
分區的好處:
並行處理:多個消費者可以同時從分區讀取。
容錯:跨分區複製資料,以便在發生故障時進行恢復。
分區資料順序
Kafka 確保在每個分區內維護訊息的順序,但不會在整個主題中維護訊息的順序。
Kafka Connect 可讓您將 Kafka 與其他系統集成,而無需編寫程式碼。
它用於將資料移入和移出 Kafka,例如從資料庫匯入資料或將資料匯出到資料倉儲。
範例:如果您想將 MySQL 資料庫中的資料同步到 Kafka 中進行即時處理,Kafka Connect 可以處理此問題,而無需您編寫複雜的腳本。
Kafka Streams 是一個用於建立流程處理應用程式的函式庫。
它允許您在資料流經 Kafka 時對其進行轉換、聚合或過濾。
範例:假設您有一個購買資料流。您可以使用 Kafka Streams 計算即時銷售趨勢,例如每分鐘的總收入。
以下是如何在系統上設定 Kafka 的簡要概述:
1.下載Apache Kafka
造訪Apache Kafka 網站並下載最新版本。
將下載的檔案解壓縮到電腦上的資料夾。
並儲存在“C”資料夾中
2.執行Zookeeper
Kafka 依靠 Zookeeper 來管理其代理商。
使用提供的 shell 腳本啟動 Zookeeper
我的檔案位置是C:\kafka_2.13-3.9.0\bin\windows
我從這裡執行所有命令。
zookeeper-server-start.bat ..\..\config\zookeeper.properties
3.啟動Kafka Broker
kafka-server-start.bat ..\..\config\server.properties
4.建立主題
kafka-topics.bat --create --topic my-topic --bootstrap-server localhost:9092 --replication-factor 1 --partitions 3
執行上述命令後,您將看到顯示此訊息:
5.訊息的生產與消費
kafka-console-producer.bat --broker-list localhost:9092 --topic my-topic
kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic my-topic --from-beginning
現在,您將開啟以下 4 個命令提示字元:
讓我們圍繞生產者和消費者進行操作:
在生產者提示中,我生產了芒果和gauva等資料,您將看到消費者正在成功消費資料!
kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic my-topic
所以,在這裡我們將從我們開始的地方獲取資料:只有 satafal 和蘋果的消費者伺服器我們才會得到:
在 Kafka 設定中,訊息排序、分區和鍵的使用在管理資料流和確保資料完整性方面發揮關鍵作用。下面,我們討論 Kafka 訊息在有鍵和無鍵的情況下如何表現,然後是使用命令列實現這些概念的實際步驟。
了解訊息分區和排序
1.無鑰匙:
當您傳送沒有金鑰的訊息時,Kafka 會使用循環策略將它們指派給分割區。這確保了負載平衡,但不維護跨分區的訊息順序。
例:一個主題有兩個分區(P1、P2)。訊息M1、M2、M3、M4交替分發:
M1 -> P1
M2 -> P2
M3 -> P1
M4 -> P2
在這種情況下,消費者從隨機分區讀取訊息,導致訊息排序不可靠。
2.帶鑰匙:
當使用金鑰發送訊息時,Kafka 透過對金鑰應用雜湊演算法來確定目標分區。具有相同密鑰的訊息始終發送到同一分區,以確保這些密鑰的有序傳遞。
當使用密鑰發送訊息時,將保持排序,因為它們位於同一分區中
如果沒有金鑰,我們就無法保證訊息的排序,因為消費者同時從所有分割區輪詢訊息。
例子:
鍵:order123,訊息:M1、M2、M3 -> 全部轉到相同分割區(例如,P1)。
鍵:userXYZ,訊息:M4、M5 -> 這些將會轉到另一個分割區(例如,P2)。
實用的命令列步驟
1.啟動卡夫卡:
確保 Kafka 代理和 ZooKeeper 正在執行。
zookeeper-server-start.bat ..\..\config\zookeeper.properties
kafka-server-start.bat ..\..\config\server.properties
2.建立主題:
建立一個名為 my_topic 的主題,有 4 個分區
kafka-topics.bat --create --topic fruits --bootstrap-server localhost:9092 --replication-factor 1 --partitions 4
3.啟動生產者與消費者
製片:
kafka-console-producer.bat --broker-list localhost:9092 --topic fruits --property "key.separator=-" --property "parse.key=true"
消費者:
kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic fruits --from-beginning -property "key.separator=-" --property "print.key=false"
若要傳送帶有鍵的訊息,請指定由分隔符號分隔的鍵和值對
輸入鍵值對,例如:
hello-apple
hello-banana
hello-kiwi
bye-mango
bye-gauva
5.消費訊息:
若要消費訊息,請使用 Kafka 消費者。對於訂購消費:
重點
使用鍵來確保分區內的訊息排序。
了解權衡:循環確保均勻分佈,而鍵允許排序,但可能導致分區負載不均勻。
利用 Kafka 的消費者偏移管理進行可靠的處理。
進階概念:消費者群體和抵消
Kafka 使用消費者偏移量來追蹤訊息消費的進度。
1.偏移量和可靠性:
Kafka 維護一個內部主題 (__consumer_offsets),用於儲存消費者群組已處理的每個分區的最新偏移量。如果消費者失敗並重新啟動,它將從最後提交的偏移量恢復。
2.消費群:
同一組內的多個消費者之間劃分分區消費,確保資料處理的高效率。不同組別的消費者可以獨立消費同一主題的訊息。
執行zookeeper和伺服器:
zookeeper-server-start.bat ..\..\config\zookeeper.properties
kafka-server-start.bat ..\..\config\server.properties
kafka-topics.bat --bootstrap-server localhost:9092 --list
現在讓我們來看看消費者組:
kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic my-topic --from-beginning
一旦您啟動消費者 kafka 就會將其分組到消費者群組並使用新的唯一 id 建立
kafka-consumer-groups.bat --bootstrap-server localhost:9092 --list
讓我們再次啟動消費者,它將建立另一個消費者群組並列出這些:
kafka-topics.bat --describe --topic my-topic --bootstrap-server localhost:9092
開始製作人:
kafka-console-producer.bat --broker-list localhost:9092 --topic my-topic
並在 3 個不同的提示下使用相同的命令啟動 3 個消費者:
kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic my-topic --group console-consumer-93231
現在我們有 3 個消費者和 1 個生產者
我生產資料1,2,3,4 -> 圖中右上角已經消耗了資料
然後我停止左下角消費者 ->
然後我產生資料 5,6,7,8 -> right-bottom-corner cosumer cosumes 資料
Kafka 是一個強大的分散式事件流平台,其工作原理是允許應用程式即時發布和訂閱記錄流。要了解如何針對生產環境有效擴展 Kafka,設定具有多個代理程式的 Kafka 叢集至關重要。在本部落格中,我們將根據 YouTube 上的影片教學課程,引導您完成使用三個代理設定 Kafka 叢集的過程。
第 1 步:了解 Kafka 集群
Kafka 叢集本質上是 Kafka 代理的集合,它們協同工作以提供高度可用且容錯的訊息系統。每個代理管理一部分資料,主題跨集群中的代理劃分為多個分區。複製可確保每個分區在多個代理之間進行複製,以實現容錯。
第 2 步:設定代理配置
啟動 Kafka 代理程式的過程涉及為叢集中的每個代理程式配置 server.properties 檔案。以下是配置三個代理程式的方法:
1.建立三個設定檔:對於三個代理,您需要建立三個不同的server.properties
文件,每個文件都有獨特的配置:
經紀商 ID (0, 1, 2)
用於通訊的連接埠號
用於儲存日誌的日誌目錄
例子:
Broker 0:server.0.properties,具有 Broker ID 0、連接埠 9092 和唯一的日誌目錄。
代理 1:server.1.properties,代理 ID 為 1、連接埠 9093 和另一個日誌目錄。
代理 2:server.2.properties,代理 ID 為 2、連接埠 9094 和單獨的日誌目錄。
2.設定代理:每個server.properties 檔案必須指定唯一的代理ID、連接埠和日誌目錄。您可以使用 Visual Studio Code 等文字編輯器編輯設定檔來修改它們。
3.啟動代理:設定檔準備好後,您可以使用以下命令執行 Kafka 伺服器來啟動每個代理:
例如:
代理 0: kafka-server-start.bat ..\..\config\server1.properties
代理 1: kafka-server-start.bat ..\..\config\server1.properties
代理 2: kafka-server-start.bat ..\..\config\server1.properties
啟動代理後,您將看到它們在各自的連接埠上執行,準備接受連線。
步驟3:建立主題並設定複製因子
代理程式執行後,就可以建立 Kafka 主題並配置其複製因子。複製因子定義跨代理維護主題分區的數量。
你必須讓你的動物園管理員處於運作狀態:
zookeeper-server-start.bat ..\..\config\zookeeper.properties
以下是建立複製因子為 3 和 3 個分區的主題的方法:
kafka-topics.bat --create --topic gadgets --bootstrap-server localhost:9092,localhost:9093,localhost:9094 --replication-factor 3 --partitions 3
在此範例中,複製因子為 3 可確保主題的資料在群集中的所有三個代理之間複製。這對於容錯至關重要,因為即使一個代理程式發生故障,Kafka 也能保持資料可用性。
第 4 步:生產與消費訊息
建立主題後,您可以透過產生和使用訊息來測試設定。
1.Producer:使用Kafka Producer向主題發送訊息:
kafka-console-producer.bat --bootstrap-server localhost:9092,localhost:9093,localhost:9094 --topic gadgets
您可以發送諸如“Hello”、“Laptop”、“Mouse”和“Monitor”等訊息,它們將發佈到主題的分區。
2.Consumer:使用Kafka Consumer從主題讀取訊息:
kafka-console-consumer.bat --bootstrap-server localhost:9092,localhost:9093,localhost:9094 --topic gadgets --from-beginning
您將在C:\tmp\kafka-logs
中看到建立了 3 個資料夾,在C:\tmp\kafka-logs1
和C:\tmp\kafka-logs2
中也建立了相同的資料夾
正如您在教程中看到的,資料將在代理之間複製。例如,如果訊息發送到分區 0,它將被複製到代理 0 和 1。
第 5 步:了解同步副本 (ISR)
在 Kafka 中,同步副本 (ISR) 是關鍵概念。它指的是給定分區的副本集,這些副本完全趕上該分區的領導者。分區領導者負責處理該分區的所有讀寫請求。
1.ISR如何運作:Kafka中的每個分區都有一個領導者和多個追隨者(副本)。領導者管理資料,追隨者複製資料。 ISR 確保資料在代理之間正確複製。
2.故障轉移機制:如果ISR中的一個broker發生故障,Kafka會自動將其中一個follower提升為新的leader,確保資料始終可用。這對於保持高可用性和可靠性至關重要。
您可以使用以下命令檢查主題的 ISR 狀態:
kafka-topics.bat --describe --topic gadgets --bootstrap-server localhost:9092,localhost:9093,localhost:9094
第 6 步:測試故障轉移
若要測試故障轉移機制,您可以關閉叢集中的一個代理程式並觀察 ISR 如何調整。每個分區的領導者都會發生變化,ISR 將確保副本始終是最新的。
結論
在本教程中,我們成功設定了一個包含三個代理程式的 Kafka 集群,建立了一個複製因子為 3 的主題,並測試了訊息的產生和消費。了解 Kafka 如何管理複製、分區和故障轉移對於建立可靠且可擴展的事件驅動系統至關重要。透過 Kafka 容錯機制的強大功能,您可以放心地部署 Kafka 叢集來處理高吞吐量、即時資料流。
您可以透過瀏覽下一個影片來繼續學習,了解 Kafka 中同步副本 (ISR) 的重要性,該影片進一步解釋了 Kafka 如何確保跨代理的資料一致性和可用性。
我已經解釋了上面列出的關鍵主題,但為了清楚起見,這裡對每個主題進行了簡要總結:
1.Kafka集群、Kafka Broker、生產者、消費者:
Kafka 叢集:一組 Kafka 代理,它們協同工作來處理大量資料流。 Kafka 叢集允許分散式處理和擴展。
Kafka Broker: Kafka 代理是 Kafka 生態系統中的伺服器,用於儲存資料並服務客戶端請求(如生產者和消費者)。
生產者:生產者向 Kafka 主題發送訊息。它可以寫入一個主題的多個分區。
消費者:消費者從 Kafka 主題讀取訊息。消費者可以加入消費者群組來分散式處理訊息。
2.Kafka主題和分區:
主題:生產者向其發送訊息以及消費者從中讀取訊息的類別或提要名稱。主題是 Kafka 用來組織訊息的主要機制。
分區:一個主題可以有多個分區,以允許並行處理和資料複製。每個分割區都是一個有序日誌,有助於跨 Kafka 代理程式分發資料。
3.如何從命令列發送Kafka訊息(帶Key):
Kafka 提供了命令列工具(例如kafka-console-producer
和kafka-console-consumer
),允許使用者發送和消費訊息。生產者可以包含訊息的金鑰,該金鑰可用於路由到特定分區。
4.了解消費者抵銷、消費者群體和...
消費者偏移量: Kafka 使用偏移量來追蹤每個消費者的進度,該偏移量指示日誌中的位置(消費者目前正在讀取的訊息)。
消費者組:一組共同消費主題資料的消費者。 Kafka 確保每個分區一次只能由一組中的一個消費者讀取。如果多個消費者在一個群組中,主題的分區將在他們之間分割。
5.掌握卡夫卡的藝術:逐步的消費者抵銷和...
這將涉及了解如何管理消費者偏移量,要么依靠 Kafka 的預設偏移量管理,要么根據業務邏輯手動提交偏移量。適當的偏移管理可確保消費者在發生故障後可以從正確的點恢復讀取。
6.Kafka基礎:理解細分,...
Kafka 將訊息分段儲存在日誌檔案中。每個分區的日誌被分成多個段以處理高效的儲存和檢索。隨著時間的推移,舊的段將根據保留策略等配置設定被刪除。
7.如何使用 3 個 Broker 建立 Kafka 叢集:了解複製因子
這涉及到設定一個具有多個代理(如 3 個)的 Kafka 集群,其中每個代理存儲一部分資料。複製因子決定了每個分區在代理之間存在多少副本,從而確保高可用性和容錯能力。
8.Kafka中的ISR(同步副本):
ISR(同步副本)是指完全追上領導者副本的分區副本集(即,它們具有相同的資料)。 ISR 確保只有最新的副本才有資格成為分區的領導者。
這些主題構成了理解和使用 Apache Kafka 所需的核心知識,無論您是設定 Kafka 叢集、產生和消費訊息,還是處理消費者群組、複製和偏移等更高級的概念。
如果您想深入研究任何特定主題或需要更詳細的範例,您可以查看此部落格( 使用 ASP.NET Core 的 .NET 6 中的 Kafka 生產者和消費者範例)!
快樂學習!