卡夫卡码头工人和LEADER_NOT_AVAILABLE

时间:2018-08-25 13:24:20

标签: docker apache-kafka

我使用以下Kafka Docker映像:https://hub.docker.com/r/wurstmeister/kafka/

我可以使用以下属性启动Apache Kafka:

<KAFKA_ADVERTISED_HOST_NAME>${local.ip}</KAFKA_ADVERTISED_HOST_NAME>
<KAFKA_ADVERTISED_PORT>${kafka.port}/KAFKA_ADVERTISED_PORT>     
<KAFKA_ZOOKEEPER_CONNECT>zookeeper:2181</KAFKA_ZOOKEEPER_CONNECT>   
<KAFKA_MESSAGE_MAX_BYTES>15000000</KAFKA_MESSAGE_MAX_BYTES>

但是尝试将消息发送到主题时,我看到以下警告:

WARN 9248 --- [ad | producer-1] org.apache.kafka.clients.NetworkClient   : [Producer clientId=producer-1] Error while fetching metadata with correlation id 4 : {post.sent=LEADER_NOT_AVAILABLE}

我在互联网上看到几篇文章,告诉您此问题可能与诸如KAFKA_ADVERTISED_HOST_NAMEKAFKA_ADVERTISED_PORT之类的旧属性有关,我应该重新配置为KAFKA_ADVERTISED_LISTENERSKAFKA_LISTENERS 。但是,当我使用以下属性启动Kafka容器时:

<KAFKA_ADVERTISED_LISTENERS>PLAINTEXT://${local.ip}:${kafka.port}</KAFKA_ADVERTISED_LISTENERS>
<KAFKA_LISTENERS>PLAINTEXT://${local.ip}:${kafka.port}</KAFKA_LISTENERS>                            
<KAFKA_ZOOKEEPER_CONNECT>zookeeper:2181</KAFKA_ZOOKEEPER_CONNECT>   
<KAFKA_MESSAGE_MAX_BYTES>15000000</KAFKA_MESSAGE_MAX_BYTES>

我的应用程序无法连接到Kafka:

2018-08-25 16:20:57.407  INFO 17440 --- [           main] o.a.kafka.common.utils.AppInfoParser     : Kafka version : 1.1.0
2018-08-25 16:20:57.408  INFO 17440 --- [           main] o.a.kafka.common.utils.AppInfoParser     : Kafka commitId : fdcf75ea326b8e07
2018-08-25 16:20:58.513  WARN 17440 --- [| adminclient-1] org.apache.kafka.clients.NetworkClient   : [AdminClient clientId=adminclient-1] Connection to node -1 could not be established. Broker may not be available.
2018-08-25 16:20:59.567  WARN 17440 --- [| adminclient-1] org.apache.kafka.clients.NetworkClient   : [AdminClient clientId=adminclient-1] Connection to node -1 could not be established. Broker may not be available.

如何正确重新配置Docker Kafka以便能够使用KAFKA_ADVERTISED_LISTENERSKAFKA_LISTENERS

1 个答案:

答案 0 :(得分:0)

从这个很棒的 post 中,这里有一个关于这些属性的很好的解释:

<块引用>

LISTENERS 是 Kafka 绑定的接口。 ADVERTISED_LISTENERS 是客户端连接的方式。

当您的应用程序连接到来自LISTENER的地址之一时,Kafka将通讯者KAFKA_ADVERTISED_LISTENER返回到您选择的那个LISTENER。返回的 KAFKA_ADVERTISED_LISTENER 是您的应用程序将真正用于与 Kafka 通信的地址。

因此,您必须在您的应用程序中使用您在 LISTENERS Kafka 属性上为 PLAINTEXT 设置的内容

按原样使用此配置:

<KAFKA_ADVERTISED_LISTENERS>PLAINTEXT://${local.ip}:${kafka.port}</KAFKA_ADVERTISED_LISTENERS>
<KAFKA_LISTENERS>PLAINTEXT://${local.ip}:${kafka.port}</KAFKA_LISTENERS>

您必须在您的应用程序中使用:

正如您在 Kafka docker ${local.ip}:${kafka.port} 上使用的那样,您必须获取分配的 kafka docker 容器 IP 并在您的应用程序中使用它强>.

为了填充此场景的变量,假设您的 kafka docker 容器 IP 为 192.250.0.1,使用的 kafka 端口为 9092,因此您的应用程序 bootstrap.servers 属性将为:192.250.0.1:9092

这是一个命令,用于查看当您尝试使用 kafka 的侦听器之一进行连接时 Kafka 返回给您的内容:

$ kafkacat -b 192.250.0.1:9092 -L

kafkacat 是一个非常有用的测试和调试 kafka 的工具。