【问题标题】:Kafka docker and LEADER_NOT_AVAILABLE卡夫卡码头工人和 LEADER_NOT_AVAILABLE
【发布时间】:2019-01-31 17:15:28
【问题描述】:

我使用以下 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

【问题讨论】:

  • 你在哪里使用 XML 来分​​配东西?
  • 我使用 io.fabric8 docker-maven-plugin
  • 啊,local.ip 被 Maven 分配为什么?因为我知道,例如,如果您将容器主机名设置为 kafka,并使用PLAINTEXT://kafka:9092,那么它至少会在您转发端口后进行外部连接
  • 看看我的回答是否有帮助stackoverflow.com/a/51634499/2308683

标签: docker apache-kafka


【解决方案1】:

来自这个很棒的post,下面是关于这些属性的一个很好的解释:

LISTENER 是 Kafka 绑定的接口。 ADVERTISED_LISTENERS 是客户端可以连接的方式。

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

因此,您必须在您的应用程序中使用您在 LISTENER 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的工具。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多