分布式流平臺Kafka

2020-12-04 計算機java編程

提到Kafka很多人的第一印象就是它是一個消息系統,但Kafka發展至今,它的定位已遠不止於此,而是一個分布式流處理平臺。對於一個流處理平臺通常具有三個關鍵能力:

1. 發布和訂閱消息流,在這一點上它與消息隊列或企業消息系統類似

2. 以容錯的持久化方式存儲消息流

3. 在消息流產生時處理它們

目前,Kafka通常應用於兩大類應用:

1. 構建實時的流數據管道,可靠地在系統和應用程式之間獲取數據

2. 構建實時流的應用程式,對數據流進行轉換或響應

下面我們來一起看一下,Kafka是如何實現以上所說的功能的?首先了解Kafka幾個特性:

Kafka作為一個集群運行在一個或多個伺服器上,這些伺服器可以跨越多個數據中心Kafka集群存儲的數據流是以topic為類別的每個消息(也叫記錄record)是由一個key,一個value和一個時間戳構成Kafka四個核心API

Producer API,允許應用程式發布消息到1個或多個topicConsumer API,允許應用程式訂閱一個或多個topic,並處理它們訂閱的消息Streams API,允許應用程式充當一個流處理器,從1個或多個topic消費輸入流,並產生一個輸出流到1個或多個輸出topic,有效地將輸入流轉換到輸出流Connector API,允許構建運行可重複使用的生產者或消費者,將topic和現有的應用程式或數據系統連接起來。例如,一個關係型資料庫的連接器可以捕獲到該庫下每一個表的變化

Client和Server之間的通訊,是通過一條簡單的、高性能支持多語言的TCP協議。並且該協議保持與老版本的兼容。Kafka提供了Java客戶端。除了Java 客戶端外,客戶端還支持其他多種語言。

Topic和Log

Topic是發布的消息的類別名,可以用來區分來自不同系統的消息。Kafka中的topic可以有多個訂閱者:即一個topic可以有零個或多個消費者訂閱消費消息。

對於每一個topic,Kafka集群維護一個分區日誌,如下圖:

每一個分區都是一個順序的、不可變的序列數據, 並且不斷的以結構化的提交log方式追加。分區中的每條消息都被分配了稱之為offset的序列號,在每個分區中offset是唯一的,通過它可以定位一個分區中的唯一一條記錄。 無論消息是否被消費,Kafka集群都會持久的保存所有發布的消息,直到過期。Kafka的性能和數據大小無關,所以長時間存儲數據沒有什麼問題。

實際上,每個消費者所持有的僅有的元數據就是offset,也就是消費者消費在這個log中的位置。這個offset由消費者控制:一般情況下,當消費者消費消息的時候,offset隨之線性的增加。但是因為實際offset由消費者控制,消費者可以任意指定它的消費位置。同時,一個消費者消費消息不會影響其他的消費者。

Kafka中採用分區的設計主要有兩個目的:第一,當日誌大小超過了單臺伺服器的限制,允許日誌進行擴展。每個單獨的分區都必須受限於主機的文件限制,不過一個主題可能有多個分區,因此可以處理大量的數據。第二,分區可以作為並行處理的單元。

分布式

log的分區被分布到集群中的多個伺服器上。每個伺服器處理它分到的分區,根據配置每個分區還可以有多個副本作為備份容錯。

每個分區有一個leader,零個或多個follower。leader處理此分區的所有讀寫請求,而follower被動的同步leader數據。如果leader宕機,其它的一個follower會被推舉為新的leader。一臺伺服器可能同時是一個分區的leader,另一個分區的follower。這樣可以在集群中進行負載均衡,避免所有的請求都只讓一臺或者某幾臺伺服器處理。

Geo-Replication

Kafka MirrorMaker為集群提供了geo-replication即異地數據同步技術的支持。藉助MirrorMaker,消息可以跨多個數據中心或雲區域進行複製。你可以在active/passive場景中用於備份和恢復; 或者在active/active場景中將數據置於更接近用戶的位置,或者支持數據本地化。

生產者

生產者可以採用輪詢、隨機等策略來決定將數據發布到所選擇的topic中的某個partition上。

消費者

消費者使用一個消費者組名稱來進行標識,發布到topic中的每條記錄被分配給訂閱消費組中的一個消費者實例,消費者實例可以分布在多個進程中或者多個機器上。

如果所有的消費者實例在同一個消費者組中,消息記錄會負載平衡到每一個消費者實例。

如果所有的消費者實例在不同的消費者組中,每條消息記錄會廣播到所有的消費者進程。

如圖,這個Kafka集群有兩臺server,四個分區和兩個消費者組。消費組A有兩個消費者,消費組B有四個消費者。

通常情況下,每個 topic 都會有一些消費組,一個消費組對應一個"邏輯訂閱者"。一個消費組由許多消費者實例組成,便於擴展和容錯。這就是發布和訂閱的概念,只不過訂閱者是一組消費者而不是單個的進程。

在Kafka中實現消費的方式是將日誌中的分區劃分到每一個消費者實例上,以便在任何時間,每個實例都是分區唯一的消費者。維護消費者組中的消費關係由Kafka協議動態處理。如果新的實例加入組,他們將從組中其他成員處接管一些分區;如果一個實例消失,擁有的分區將被分發到剩餘的實例。

Kafka只保證分區內的記錄是有序的,而不保證topic中不同分區的順序。如果想保證全局有序,那麼只能有一個分區,但是這樣處理的性能會大幅降低。

Kafka的幾個確定性

1. 生產者發送消息到特定的topic的分區上,消息將會按照它們發送的順序依次追加,也就是說,如果一個消息M1和M2使用相同的producer發送,M1先發送,那麼M1將比M2的offset小,並且優先的出現在日誌中

2. 消費者消費的消息也是按照消息在日誌中存儲的順序

3. 如果一個topic配置了複製因子為N, 那麼可以允許N-1臺伺服器宕機而不丟失任何已經提交的消息

Kafka作為一個消息系統

傳統的消息系統有兩種模式:隊列和發布-訂閱。在隊列模式中,很多消費者從伺服器讀取消息並且每個消息只被其中一個消費者讀取;在發布-訂閱模式中消息則被廣播給所有的消費者。這兩種模式都有優缺點,隊列的優點是允許多個消費者瓜分處理數據,這樣可以擴展處理。但是,隊列不支持多個訂閱者,一旦消費者讀取該消息後,該消息就沒了。而發布-訂閱允許你廣播數據到多個進程,但是無法進行擴展處理,因為每條消息都會發送給所有的訂閱者。

Kafka中消費者組有兩個概念:在隊列中消費者組允許同名的消費者組成員瓜分處理;在發布訂閱中允許你廣播消息給多個消費者組。

Kafka的優勢在於每個topic都支持擴展處理以及允許多訂閱者模式。

Kafka有比傳統的消息系統更強的順序保證

傳統的消息系統按順序保存數據,如果多個消費者從隊列消費,則伺服器按存儲的順序發送消息,儘管伺服器按順序發送,但消息是異步傳遞到消費者,因此消費者消費到的消息可能是無序的。這意味著在並行消費的情況下,順序就無法保證。消息系統常常通過僅設1個消費者來解決這個問題,但是這意味著無法並行處理數據,性能也就相應降低。

Kafka中的partition就是一個並行處理單元。Kafka通過將topic中的一個partition分配給消費者組中的一個消費者進行消費,保證了消費的順序保證和負載均衡。但是Kafka只能保證一個partition被順序消費,並不能保證全局有序消費,除非只有一個partition。此外,相同的消費者組中如果有比分區數更多的消費者,則多出的消費者會處於空閒狀態,不處理消息。

Kafka作為一個存儲系統

寫入到Kafka的數據會被寫到磁碟並且備份以保證容錯性,並可以通過應答機制,確保消息寫入。

Kafka使用的磁碟結構,具有很好的擴展性,使得50kb和50TB的數據在伺服器上表現一致。你可以認為kafka是一種高性能、低延遲的提交日誌存儲、備份和傳播功能的分布式文件系統,並且可以通過客戶端來控制讀取數據的位置。

Kafka的流處理

Kafka流處理不僅僅用來讀寫和存儲流式數據,它最終的目的是為了能夠進行實時的流處理。

在Kafka中,流處理持續獲取輸入topic的數據,進行處理加工,然後寫入輸出topic。例如,一個零售APP,接收銷售和出貨的輸入流,統計數量或調整價格後輸出一系列流數據。

可以直接使用producer和consumer API進行簡單的處理。但是對於複雜的數據轉換,Kafka提供了更強大的streams API,可用於構建聚合計算或join多個流。這一功能有助於解決此類應用面臨的硬性問題:如處理無序的數據,消費者代碼更改的再處理,執行狀態計算等。

sterams API建立在Kafka的核心之上:使用producer和consumer API作為輸入,利用Kafka做狀態存儲,使用相同的消費者組機制在流處理器實例之間進行容錯保障。

寫在最後

消息傳遞、存儲和流處理的組合是Kafka作為流式處理平臺的關鍵特性。

像HDFS這樣的分布式文件系統允許存儲靜態文件來進行批處理。這樣系統可以有效地存儲和處理歷史數據。而傳統的企業消息系統允許在你訂閱之後處理將來的數據,並在這些數據到達時處理它。Kafka結合了這兩種能力,這種組合對於Kafka作為流處理應用和流數據管道平臺是至關重要的。

通過消息存儲和低延遲訂閱,流應用程式可以以同樣的方式處理歷史和將來的數據。一個單一的應用程式可以處理歷史數據,並且可以持續不斷地處理以後到達的數據,而不是在到達最後一條記錄時就結束進程。這是一個廣泛的流處理概念,其中包含批處理以及消息驅動應用程式。

同樣,作為流數據管道,能夠訂閱實時事件使得Kafk具有非常低的延遲;同時Kafka還具有可靠存儲數據的特性,可用來存儲重要的支付數據或者與離線系統進行交互,系統可間歇性地加載數據,也可在停機維護後再次加載數據。流處理功能使得數據可以在到達時轉換數據。

相關焦點

  • ELK + Filebeat + Kafka 分布式日誌管理平臺搭建
    1 工作流程在這之前,我寫了三篇文章關於日誌系統平臺的搭建,我這邊現簡單列出這幾種的工作流程1.1 ELKELK + Filebeat + Kafka 分布式日誌管理平臺搭建2.1 ELFK的搭建docker 安裝ELFK 實現日誌統計
  • 使用Kafka Streams創建流數據管道
    創建基於規則的流數據拓撲什麼是流拓撲?拓撲是通過流(邊緣)連接的流處理器(節點)的有向無環圖(DAG)。 DAG的一些關鍵特徵是它是有限的,並且不包含任何循環。創建流式拓撲可以使數據處理器成為小型,專注的微服務,可以輕鬆地對其進行分配和擴展,並可以並行執行其工作。為什麼要使用kafka Streams?
  • Apache Kafka是 一個分布式流處理平臺. 這到底意味著什麼呢?
    我們知道流處理平臺有以下三種特性:可以讓你發布和訂閱流式的記錄。這一方面與消息隊列或者企業消息系統類似。可以儲存流式的記錄,並且有較好的容錯性。可以在流式記錄產生時就進行處理。Kafka適合什麼樣的場景?它可以用於兩大類別的應用:構造實時流數據管道,它可以在系統或應用之間可靠地獲取數據。
  • 大數據開發:Apache Kafka分布式流式系統
    Kafka在大數據流式處理場景當中,正在受到越來越多的青睞,尤其在實時消息處理領域,kafka的優勢是非常明顯的。相比於傳統的消息中間件,kafka有著更多的潛力空間。今天的大數據開發分享,我們就主要來講講Apache Kafka分布式流式系統。
  • Kafka 2.2.0基礎入門
    Kafka 2.2.0基礎入門 編者: wRitchie(吳理琪) 來源:http://www.bj9420.com簡介 Apache Kafka® 是 一個分布式流處理平臺。流處理平臺有以下三種特性:1. 可以發布和訂閱流式的記錄。這一方面與消息隊列或者企業消息系統類似。 2. 可以儲存流式的記錄,並且有較好的容錯性。 3. 可以在流式記錄產生時就進行處理。 Kafka適合什麼樣的場景?可以用於兩大類別的應用:1. 構造實時流數據管道,它可以在系統或應用之間可靠地獲取數據。
  • 如何在Kubernetes上運行高可用的Kafka
    > Photo by Ayaz Lalani on Unsplash Apache Kafka是最流行的基於事件的分布式流平臺之一儘管功能非常強大,但Kafka同樣複雜,需要運行高度可用的強大平臺。 大多數時候,工程師們都在努力給Kafka伺服器餵水和澆水,站起來維護它並不是小菜一碟。隨著微服務的流行和大多數公司採用分布式計算,將Kafka作為核心消息傳遞骨幹站具有其優勢。 Kubernetes是運行基於容器的微服務的流行選擇,而使用Kafka作為事件平臺是另一種選擇。
  • 生產環境使用Apache Kafka和Redis的流架構
    它適用於近實時系統,在該系統中,需要處理大量事件流,並將結果提交給大量的訂戶,每個訂戶都接收自己的流視圖。流發布者:它接受WebSockets連接,負載均衡,單個連接可以在任何計算機上運行。Apache KafkaApache Kafka允許以容錯,分布式的方式將輸入的數據流和計算結果存儲在管道的後續階段
  • 快速入門kafka之 kafka優點及技術架構
    kafka優點**可靠性強**:分布式的,分區,複製和容錯**可擴展性**:無需停機進行擴展。**耐用性**:消息會儘可能快速的保存在磁碟上,持久化。** 日誌收集:收集各個業務的數據發送到kafka TOPIC裡** 流式處理**:數據實時打入kafka,實時計算框架(sparkstreaming flink)實時在kafka中消費數據Kafka技術架構(宏觀)
  • Kafka-Manager - 一站式 Kafka 管控平臺
    Kafka 是一個高吞吐量的分布式發布訂閱消息系統,目前被廣泛使用在消息傳遞和日誌收集等系統中,提供了系統模塊解耦、數據冗餘、削峰、順序保證、異步通信等特性。當在團隊中大量使用 Kafka 時,其管理和監控就變得比較困難了。
  • Kafka支持的分布式架構超越經典軟體設計的五個原因
    從長遠來看,可以肯定的是,分布式系統的成本要比大型機架構中的MIPS(每秒數百萬條指令)支付的成本低。另一方面,就創建平臺本身和支持與業務相關的服務所需的基礎結構而言,前期成本可能非常昂貴。 即使是很長的路要走,一旦他們啟動並運行,成本將隨著時間的推移而大大降低。 總體而言,這些系統的成本低於大型機系統。當我們談論整體系統時,大型機平臺有許多相似之處。
  • Kafka實時API探秘
    Apache Kafka提供了一個可伸縮的事件流平臺,你可以用它來構建強大的基於事件的應用程式。Kafka通過Kafka Streams API提供流式處理能力。ksqlDB是一個專門為流式處理應用程式而構建的事件流資料庫。它提供了一個基於SQL的API來查詢和處理Kafka中的數據。
  • Kafka 知識腦圖 - 分布式日誌收集系統
    Kafka分布式日誌系統kafka-topics.sh --zookeeper localhost/myKafka --alter --topic myTop1 --partitions 2 複製代碼kafka-console-producer.sh : 生產消息 # 開啟生產者 kafka-console-producer.sh --topic topic_1 --broker-list localhost
  • 淺談kafka
    該項目的目標是為處理實時數據提供一個統一、高通量、低等待的平臺。Kafka是一個分布式消息隊列:生產者、消費者的功能。它提供了類似於JMS的特性,但是在設計實現上完全不同,此外它並不是JMS規範的實現。
  • 這份記載著KAFKA的精髓筆記,阿里P8都對它愛不釋手
    Kafka起初是由LinkedIn 公司採用Scala 語言開發的一個多分區、多副本且基於ZooKeeper協調的分布式消息系統,現已被捐獻給Apache基金會。目前Kafka已經定位為一個分布式流式處理平臺,它以高吞吐、可持久化、可水平擴展、支持流數據處理等多種特性而被廣泛使用。目前越來越多的開源分布式處理系統如Cloudera、Storm、Spark、 Flink 等都支持與Kafka集成。
  • 玩了分布式這麼久,你不會連Kafka都不清楚吧
    圖片來自 Pexels什麼是 KafkaKafka 是一個分布式流式平臺,它有三個關鍵能力:訂閱發布記錄流,它類似於企業中的消息隊列或企業消息傳遞系統。以容錯的方式存儲記錄流。實時記錄流。Kafka 的應用:作為消息系統。作為存儲系統。作為流處理器。
  • kafka連載(kafka的簡介)
    kafka是一種分布式的,基於發布/訂閱的消息管理系統。具備快速、可擴展、可持久化的特點。又因為具有強大的實時性的消息處理能力,所以很多公司都採用它來作為消息中間件。kafka提供了異步通信、緩衝或者峰值處理能力,以及基本的容災擴展、解耦合、數據持久化的能力。具體能力我不在這一一贅述。
  • 單機版kafka集群部署
    前言 分布式消息隊列是大型分布式系統不可缺少的中間件,主要解決應用耦合、異步消息、流量削鋒等問題。實現高性能、高可用、可伸縮和最終一致性架構。Kafka 是由 LinkedIn 開發的一個分布式的消息系統,使用 Scala 編寫,它以可水平擴展和高吞吐率而被廣泛使用。
  • 主流消息中間件優劣:ActiveMQ,RabbitMQ,Kafka,RocketMQ
    消息中間件消息中間件利用高效可靠的消息傳遞機制進行平臺無關的數據交流,並基於數據通信來進行分布式系統的集成。通過提供消息傳遞和消息排隊模型,它可以在分布式環境下擴展進程間的通信。消息中間件應用場景消息中間件適用於需要可靠的數據傳送的分布式環境。
  • 分布式消息系統之Kafka
    今天我們要給大家補的知識點便是分布式消息系統Kafka。通過流API,可順利的從topic中消費輸入流,生產輸出流,在流處理中,通過Kafkastreams api也將數據提供到大數據平臺、Cassandra、spark中進行數據分析。
  • ApacheKafka社區中千金難求的一份最火卡夫卡實戰筆記
    開篇我想說Kafka是由Apache軟體基金會開發的一個開源流處理平臺,由Scala和Java編寫。Kafka是一種高吞吐量的分布式發布訂閱消息系統,它可以處理消費者在網站中的所有動作流數據。 這種動作(網頁瀏覽,搜索和其他用戶的行動)是在現代網絡上的許多社會功能的一個關鍵因素。 這些數據通常是由於吞吐量的要求而通過處理日誌和日誌聚合來解決。 對於像Hadoop一樣的日誌數據和離線分析系統,但又要求實時處理的限制,這是一個可行的解決方案。