Apache Kafka – 叢集架構

banq發表於2024-03-27

Apache Kafka 到目前為止已經非常適合開發可靠的網際網路規模的流應用程式,這些應用程式還具有容錯能力,並且能夠處理實時和可擴充套件的需求。在本文中,我們將重點介紹 Java 中的 Kafka 叢集架構。

在本文中,我們將瞭解 Apache Kafka – 叢集架構。

在深入研究叢集架構之前,我們先了解一下 Apache Kafka 的一些基本概念,打好基礎。

1. 釋出-訂閱模型
Kafka 採用釋出-訂閱模型,其中資料生產者將記錄釋出到主題,資料消費者訂閱這些主題以接收和處理資料。生產者和消費者的這種解耦允許可擴充套件且靈活的資料處理。

2. Topic主題和分割槽
主題是對資料進行分類和組織的邏輯通道。在每個主題中,資料被進一步劃分為多個分割槽,從而實現跨多個代理的並行處理和高效負載分配。

3. 代理broker
代理(經紀者)是儲存和管理資料的單個 Kafka 伺服器。他們負責處理資料複製、客戶端通訊,並確保 Kafka 叢集的整體健康狀況。

Kafka叢集架構的關鍵元件
Kafka叢集架構的關鍵元件涉及以下內容:
Brokers——Kafka叢集中的節點
代理的職責:

  • 資料儲存:Broker提供資料儲存能力;因此,他們為Kafka叢集提供了分散式儲存質量。
  • 複製:代理負責資料複製,這是培育高可用性系統的冗餘保證。
  • 代理溝通:代理是中間人,透過充當此過程中的連結來幫助將資料從供應商轉移到消費者。

代理之間的溝通和協調:
  • 代理間通訊:執行容錯且可擴充套件的分散式系統(例如 Kafka 叢集)需要代理之間進行有效的通訊,以實現同步和負載平衡。
  • 叢集後設資料管理:代理集中控制與主題、分割槽和消費者組的後設資料相關的資料集,以確保單一的叢集狀態。

<font>// Code example for creating a Kafka producer and sending a message<i>
KafkaProducer<String, String> producer = new KafkaProducer<>(props);
ProducerRecord<String, String> record = new ProducerRecord<>(
"example-topic", "key", "Hello, Kafka!");
producer.send(record);
producer.close();


Topic主題 – 資料組織的邏輯通道
Kafka 中主題的作用:

  • 資料組織:Kafka 在該主題下的功能之一是其分類和預測技術。
  • 可擴充套件的資料組織:主題作為分發資料集的框架,透過訊息提供並行化。

主題分割槽策略:
  • 分割槽邏輯:分割槽攜帶來自分割槽邏輯的標籤或鍵,這是將訊息扔到更多推送的方法。
  • 平衡工作負載:基本的是Broker內的平均工作負載分配,這有助於處理快速資料。

分割槽——增強並行性和可擴充套件性
分割槽邏輯:

  • 確定性分割槽:分割槽演算法可能是確定性的,否則系統可以在一致的基礎上將訊息分配給分割槽。
  • 基於金鑰的分割槽:明文分割槽的金鑰將用於確定分割槽,這保證了相同金鑰的訊息始終進入同一分割槽,因此具有不同金鑰的訊息會進入不同的分割槽。

分割槽在資料分佈中的重要性:
  • 並行處理:分割槽訊息可以導致處理工作負載的並行執行,從而提高鏈路容量。
  • 負載分配:分割槽實現多個代理之間的混合資料工作負載,使後者不會成為瓶頸並最大限度地減少使用的資源。

複製——確保容錯
複製在 Kafka 中的作用:

  • 資料永續性:重複使資料持久化,確保每個分割槽的不同副本儲存在不同的代理中。
  • 高可用性:複製是一項用於提供高系統可用性的功能,因為這允許系統在某些代理效能不佳甚至出現故障時繼續執行。

領導者-跟隨者複製模型:
  • Leader-Replica 關係:每個分割槽有一個頭,以及與其相等的追隨者數量。Leader 的任務是處理資料寫入,Follower 然後複製需要容錯的資料。
  • 故障轉移機制:這種共識如何發揮作用?一個追隨者崛起並取代先前停止執行的領導者,從而使系統迴圈繼續執行和資料完整性。

<font>// 建立 Kafka Consumer 並訂閱主題的程式碼示例<i>
KafkaConsumer<String, String> Consumer = new KafkaConsumer<>(props); 
Consumer.subscribe(Collections.singletonList(
"example-topic")); 
while (true) { 
    ConsumerRecords<String, String> 記錄 = Consumer.poll(Duration.ofMillis(100)); 
    for (ConsumerRecord<String, String> record :records) { 
        System.out.printf(
"收到訊息:key=%s,value=%s%n", record.key(), record.value()); 
    }


Kafka叢集內的資料流
瞭解生產者和消費者的工作流程對於掌握 Kafka 叢集內資料傳輸的動態至關重要。
– 生產者 – 啟動資料流:
kafka的生產者:

  • 資料啟動:Kafka 消費者的主要工作圍繞消費資料,透過生產者將記錄推送到分配的主題來促進資料的消費。
  • 非同步訊息傳遞:生產者可以傳送非同步訊息,並且由於叢集外決策不需要 Kafka 叢集確認,因此它們的操作可以繼續進行而不會出現任何中斷。

向主題釋出訊息:
  • 主題規範:品牌釋出訊息時,生產者負責設定主題,資料將在主題中儲存和處理。
  • 記錄格式:訊息的結構為鍵、值及其各自的後設資料。換句話說,鍵是識別符號,值是訊息內容,後設資料是附加在記錄上的資訊。

<font>// Java 中的 Kafka Producer 示例<i>
Properties props = new Properties(); 
props.put(
"bootstrap.servers", "localhost:9092"); 
props.put(
"key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); 
props.put(
"value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); 

KafkaProducer<String, String> 生產者 = new KafkaProducer<>(props); 

// 向“example-topic”主題傳送訊息<i>
ProducerRecord<String, String> record = new ProducerRecord<>(
"example-topic", "key", "Hello, Kafka!"); 
producer.send(record);

// Closing the producer<i>
producer.close();


消費者 – 處理大量資料
消費者在Kafka中的角色:

  • 資料消費:透過訂閱,消費者處理Kafka中生產者通道交換的資料,成為Kafka生態系統的關鍵角色。
  • 並行處理:消費者可以透過利用消費者網路同時進行系統化,從而在使用目錄或資料庫的相同基礎上實現快速且詳細的處理。

訂閱主題:
  • 主題訂閱:與廣播模型相反,消費者訂閱感興趣的特定主題,並且只會將其實際目的所需的資料流接收到其終端系統中。
  • 消費者組動態:多個訂閱者可以建立一個聯合消費者組來共同接收主題,而不受其他人的干擾。
  • 並行處理的消費者組: 並行處理的消費者組:
  • 組協調:消費者組負責併發方面,並確保訊息一次僅由一個而不是所有消費者處理。
  • 並行擴充套件:消費者群體並行擴充套件的能力會對質量產生影響,使更多的消費者能夠加入並提高處理能力。

維持消費者抵消:
  • 偏移跟蹤:訊息偏移是消費者記錄本身,現有偏移表明每個分割槽上最後一條訊息的位置。
  • 容錯:跟蹤偏移量將使消費者能夠及時瞭解最後消費的訊息,因此如果處理失敗,他們可以從離開的地方繼續處理。該選項是容錯的。

<font>// Java 中的 Kafka Consumer 示例<i>
Properties props = new Properties(); 
props.put(
"bootstrap.servers", "localhost:9092"); 
props.put(
"group.id", "example-group"); 
props.put(
"key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); 
props.put(
"value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); 

KafkaConsumer<String, String> Consumer = new KafkaConsumer<>(props); 

// 訂閱“example-topic”主題<i>
consumer.subscribe(Collections.singletonList(
"example-topic")); 

// 輪詢訊息<i>
while (true) {
    ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
    for (ConsumerRecord<String, String> record : records) {
       
// Process the received message<i>
        System.out.printf(
"Received message: key=%s, value=%s%n", record.key(), record.value());
    }
}


在 Kafka 叢集中實現可擴充套件性和容錯性
Apache Kafka 的成功在於其水平擴充套件和保持容錯能力。
透過資料分割槽實現可擴充套件性:

  • 並行處理:資料分割槽是跨多個代理對訊息進行並行資料處理的有效工具,因此也增強了系統的可擴充套件性。
  • 負載平衡:透過分割槽進行流量控制,平衡處理器之間的工作負載,從而實現資源的最佳利用並避免系統瓶頸。

<font>// Creating a topic with three partitions<i>
AdminClient adminClient = AdminClient.create(props);
NewTopic newTopic = new NewTopic(
"example-topic", 3, (short) 1);
adminClient.createTopics(Collections.singletonList(newTopic));

透過複製確保容錯:

  • 資料永續性:複製的工作方式類似於修復津貼,每個副本都保留多個分割槽。
  • 連續執行:如果一組複製代理中的一個代理發生冗餘效能故障,具有冗餘資料的其他代理將不自覺地開始工作和連結交換以提供無縫服務。

從節點故障中無縫恢復的策略:
  • 副本追趕:如果代理根據其恢復策略發生故障,領導節點將與其副本聯絡,以確保後者符合其當前狀態。
  • 動態重新分配:Zookeeper 或其他機制在可用代理上重新分配故障分割槽。分割槽以可互換的方式分配給可用的代理,這有助於快速恢復操作。

結論
總之,Apache Kafka的叢集架構可以被認為是一個複雜的生態系統,允許構建強大且可擴充套件的資料管道。從代理、主題和分割槽等核心元件,到使 Kafka 能夠高效處理實時資料的生產者和消費者的動態工作流程,每一個部分都發揮著重要作用。

隨著 Kafka 快速發展並適應新版本和最佳實踐,正在研究實時資料處理問題的工程師和架構師需要考慮到這一點。透過對 Kafka 叢集內的技術細節的深刻理解,您可以釋放這個令人難以置信的分散式流平臺的全部功能,建立不僅可靠而且能夠承受當今資料密集型應用程式日益複雜的動態的資料管道。

相關文章