簡體   English   中英

卡夫卡領導人選舉導致Kafka Streams崩潰

[英]Kafka leader election causes Kafka Streams crash

我有一個Kafka Streams應用程序消耗並生成具有3個代理的Kafka集群,復制因子為3.除了消費者偏移主題(50個分區)之外,所有其他主題每個只有一個分區。

當代理嘗試首選副本時,Streams應用程序(運行在與代理完全不同的實例上)失敗並顯示錯誤:

Caused by: org.apache.kafka.streams.errors.StreamsException: task [0_0] exception caught when producing
    at org.apache.kafka.streams.processor.internals.RecordCollectorImpl.checkForException(RecordCollectorImpl.java:119)
    ...
    at org.apache.kafka.streams.processor.internals.StreamTask.process(StreamTask.java:197)
Caused by: org.apache.kafka.common.errors.NotLeaderForPartitionException: This server is not the leader for that topic-partition.

Streams應用程序嘗試成為分區的領導者是正常的,因為它在不屬於Kafka集群的服務器上運行?

我可以通過以下方式重現此行為:

  1. 殺死其中一個經紀人(其他2個接管者作為所有分區的領導者,按照預期將殺死的經紀人作為他們的領導者)
  2. 讓遇難的經紀人重新振作起來
  3. 使用bin/kafka-preferred-replica-election.sh --zookeeper localhost觸發首選副本領導者選舉bin/kafka-preferred-replica-election.sh --zookeeper localhost

我的問題似乎與報告的失敗類似,所以我想知道這是否是一個新的Kafka Streams錯誤。 我的完整堆棧跟蹤與報告的失敗中鏈接的要點完全相同( 此處 )。

另一個可能有趣的細節是,在領導者選舉期間,我在經紀人的controller.log中獲取這些消息:

[2017-04-12 11:07:50,940] WARN [Controller-3-to-broker-3-send-thread], Controller 3's connection to broker BROKER-3-HOSTNAME:9092 (id: 3 rack: null) was unsuccessful (kafka.controller.RequestSendThread)
java.io.IOException: Connection to BROKER-3-HOSTNAME:9092 (id: 3 rack: null) failed
    at kafka.utils.NetworkClientBlockingOps$.awaitReady$1(NetworkClientBlockingOps.scala:84)
    at kafka.utils.NetworkClientBlockingOps$.blockingReady$extension(NetworkClientBlockingOps.scala:94)
    at kafka.controller.RequestSendThread.brokerReady(ControllerChannelManager.scala:232)
    at kafka.controller.RequestSendThread.liftedTree1$1(ControllerChannelManager.scala:185)
    at kafka.controller.RequestSendThread.doWork(ControllerChannelManager.scala:184)
    at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:63)

我最初認為這個連接錯誤是罪魁禍首,但是在領導者選舉崩潰Streams應用程序之后,如果我重新啟動Streams應用程序,它會正常工作直到下一次選舉,而我根本沒有觸及經紀人。

所有服務器(3個Kafka代理和Streams應用程序)都在EC2實例上運行。

現在已在0.10.2.1中修復。 如果你不能選擇它,請確保在stream config中設置如下兩個參數:

final Properties props = new Properties();
...
props.put(ProducerConfig.RETRIES_CONFIG, 10);  
props.put(ConsumerConfig.MAX_POLL_INTERVAL_MS_CONFIG, Integer.toString(Integer.MAX_VALUE));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM