领袖在控制台制作人中没有可用的Kafka

我正在尝试使用卡夫卡。 所有configuration都正确完成,但是当我试图从控制台产生消息时,我不断收到以下错误

WARN Error while fetching metadata with correlation id 39 : {4-3-16-topic1=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient) 

任何人都可以请帮助,因为我无法find任何地方的解决scheme?

这可能与server.properties advertised.host.name设置有关。

可能发生的事情是,你的制作人试图找出谁是给定分区的领导者,找出它的advertised.host.nameadvertised.port并尝试连接。 如果这些设置configuration不正确,则可能认为领导者不可用。

我尝试了这里列出的所有build议。 什么对我来说是去server.properties并添加:

 port = 9092 advertised.host.name = localhost 

留下listenersadvertised_listeners注释。

我有kafka作为Docker容器运行,类似的消息泛滥到日志。
KAFKA_ADVERTISED_HOST_NAME被设置为“kafka”。

在我的情况下,错误的原因是'kafka'容器中'kafka'丢失的/etc/hostslogging。
所以,例如,在'kafka'容器中运行ping kafka将会失败,并且ping: bad address 'kafka'

在Docker方面,通过指定容器的hostname来解决这个问题。

实现它的选项:

  • docker run --hostname ...
  • docker run -it --add-host ...
  • docker-compose中的hostname
  • AWS EC2任务定义中的hostname

我正在使用kafka_2.12-0.10.2.1:

vi config / server.properties

添加下面的行:

 listeners=PLAINTEXT://localhost:9092 
  • 不需要更改advertised.listeners,因为它从std listener属性中获取值。

经纪人的主机名和港口将向生产者和消费者宣传。 如果没有设置,

  • 它使用“侦听器”的值,如果configuration

。 否则,它将使用从java.net.InetAddress.getCanonicalHostName()返回的值。

停止卡夫卡经纪人:

 bin/kafka-server-stop.sh 

重新启动经纪人:

 bin/kafka-server-start.sh -daemon config/server.properties 

现在你不应该看到任何问题。

对于任何试图在kubernetes上运行kafka并遇到这个错误的人来说,终于为我解决了这个问题:

你必须:

  1. hostname添加到pod规范,这样kafka可以find它自己。

要么

  1. 如果使用hostPort ,则需要hostNetwork: truednsPolicy: ClusterFirstWithHostNet

原因是因为Kafka需要与自己交谈,并决定使用“广告”的侦听器/主机名来查找自己,而不是使用本地主机。 即使您拥有一个指向广告主机名称的服务,也不能从广告联盟中看到该服务。 我不知道为什么是这样,但至less有一个解决方法。

 apiVersion: extensions/v1beta1 kind: Deployment metadata: name: zookeeper-cluster1 namespace: default labels: app: zookeeper-cluster1 spec: replicas: 1 selector: matchLabels: app: zookeeper-cluster1 template: metadata: labels: name: zookeeper-cluster1 app: zookeeper-cluster1 spec: hostname: zookeeper-cluster1 containers: - name: zookeeper-cluster1 image: wurstmeister/zookeeper:latest imagePullPolicy: IfNotPresent ports: - containerPort: 2181 - containerPort: 2888 - containerPort: 3888 --- apiVersion: v1 kind: Service metadata: name: zookeeper-cluster1 namespace: default labels: app: zookeeper-cluster1 spec: type: NodePort selector: app: zookeeper-cluster1 ports: - name: zookeeper-cluster1 protocol: TCP port: 2181 targetPort: 2181 - name: zookeeper-follower-cluster1 protocol: TCP port: 2888 targetPort: 2888 - name: zookeeper-leader-cluster1 protocol: TCP port: 3888 targetPort: 3888 --- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: kafka-cluster namespace: default labels: app: kafka-cluster spec: replicas: 1 selector: matchLabels: app: kafka-cluster template: metadata: labels: name: kafka-cluster app: kafka-cluster spec: hostname: kafka-cluster containers: - name: kafka-cluster image: wurstmeister/kafka:latest imagePullPolicy: IfNotPresent env: - name: KAFKA_ADVERTISED_LISTENERS value: PLAINTEXT://kafka-cluster:9092 - name: KAFKA_ZOOKEEPER_CONNECT value: zookeeper-cluster1:2181 ports: - containerPort: 9092 --- apiVersion: v1 kind: Service metadata: name: kafka-cluster namespace: default labels: app: kafka-cluster spec: type: NodePort selector: app: kafka-cluster ports: - name: kafka-cluster protocol: TCP port: 9092 targetPort: 9092 

为我解决这个问题就是设置听众这样的:

 advertised.listeners = PLAINTEXT://my.public.ip:9092 listeners = PLAINTEXT://0.0.0.0:9092 

这使得KAFKA经纪人听所有的接口。

当我们尝试订阅尚未创build的主题时,我们倾向于收到此消息。 我们通常依赖于在我们的部署环境中先验创build的主题,但是我们有组件testing,针对一个docker化的kafka实例运行,每次开始清理。

在这种情况下,我们在testing设置中使用AdminUtils来检查主题是否存在,如果不存在则创build它。 有关设置AdminUtils的更多信息,请参阅其他堆栈溢出。

我今天遇到同样的问题。 我所做的解决此错误的方法是在/etc/hosts文件中进行微妙的修改:

将行127.0.0.1 localhost localhost.localdomain更改为10.0.11.12 localhost localhost.localdomain

(假设10.0.11.12是Kafka服务器监听的主机的一个IP地址)

此警告的另一种可能性(在0.10.2.1中)是,您尝试对刚刚创build的主题进行轮询,并且此主题分区的负责人尚未提供,则您正处于领导层选举中。

在主题创build和轮询之间等待一秒钟是一种解决方法。

我正在使用wurstmeister/kafka -compose来构build使用wurstmeister/kafka图像的Kafka容器。 将KAFKA_ADVERTISED_PORT: 9092属性添加到我的KAFKA_ADVERTISED_PORT: 9092 docker-compose文件中为我解决了这个错误。

对于所有那些与Kafka SSL设置挣扎,看到这个LEADER_NOT_AVAILABLE错误。 其中一个可能被破坏的原因是密钥库和信任库。 在密钥库中,您需要拥有服务器的私钥+签名的服务器证书。 在客户端信任库中,您需要有中间的CA证书,以便客户端可以validationkafka服务器。 如果您将使用SSL进行经纪人间通信,则需要在经纪人的server.properties中设置此信任库,以便彼此进行身份validation。

最后一块,我错误地失踪,并导致我很多痛苦的小时,找出这个LEADER_NOT_AVAILABLE错误可能意味着什么。 希望这可以帮助别人。

Interesting Posts