控制台生产者中的领导者不可用Kafka

时间:2016-03-04 05:32:10

标签: apache-kafka producer

我正在尝试使用Kafka。所有配置都正确完成但是当我尝试从控制台生成消息时,我不断收到错误

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

public class UniqueList<T> extends ArrayList<T> {

    private static final long serialVersionUID = 1L;

    /** Unique elements SET */
    private final Set<T> set=new HashSet();

    /** Used by addAll methods */
    private Collection<T> addUnique(Collection<? extends T> col) {
        Collection<T> unique=new ArrayList();
        for(T e: col){
            if (set.add(e)) unique.add(e);
        }
        return unique;
    }

    @Override
    public boolean add(T e) {
        return set.add(e) ? super.add(e) : false;
    }

    @Override
    public boolean addAll(Collection<? extends T> col) {
        return super.addAll(addUnique(col));
    }

    @Override
    public void add(int index, T e) {
        if (set.add(e)) super.add(index, e);
    }

    @Override
    public boolean addAll(int index, Collection<? extends T> col) {
        return super.addAll(index, addUnique(col));
    }

}

kafka版本:2.11-0.9.0.0

26 个答案:

答案 0 :(得分:72)

它可能与您advertised.host.name中的server.properties设置有关。

可能发生的是,您的制作人正试图找出谁是某个分区的领导者,找出其advertised.host.nameadvertised.port并尝试连接。 如果未正确配置这些设置,则可能会认为领导者不可用。

答案 1 :(得分:60)

我尝试了此处列出的所有建议。对我有用的是转到server.properties并添加:

port = 9092
advertised.host.name = localhost 

listenersadvertised_listeners注释掉。

答案 2 :(得分:36)

我让kafka作为Docker容器运行,类似的消息充斥着日志 KAFKA_ADVERTISED_HOST_NAME被设为'kafka'。

在我的情况下,错误的原因是'kafka'容器本身中'kafka'缺少/etc/hosts记录。
因此,例如,在'kafka'容器内运行ping kafka将失败并显示ping: bad address 'kafka'

就Docker而言,通过为容器指定hostname来解决此问题。

实现它的选项:

答案 3 :(得分:29)

What solved it for me is to set listeners like so:

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

This makes KAFKA broker listen to all interfaces.

答案 4 :(得分:15)

我正在使用kafka_2.12-0.10.2.1:

vi config / server.properties

添加以下行:

listeners=PLAINTEXT://localhost:9092
  • 无需更改advertised.listeners,因为它会获取值 来自std listener property。

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

  • 它使用&#34;听众的价值&#34;如果已配置

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

停止Kafka经纪人:

bin/kafka-server-stop.sh

重启经纪人:

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

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

答案 5 :(得分:12)

当我们尝试订阅尚未创建的主题时,我们倾向于收到此消息。我们通常依赖于在我们部署的环境中先验创建的主题,但我们有针对dockerized kafka实例运行的组件测试,每次都会启动干净。

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

答案 6 :(得分:11)

在与Kafka一起工作的过去两个星期中,我一直在目睹同样的问题,从那以后,我一直在阅读这篇Stackoverflow的帖子。

  

经过2周的分析,我推断出我的情况   尝试针对不存在的主题产生消息

在我的情况下,结果是Kafka发回错误消息,但在 同时,之前不存在的主题。因此,如果我在此事件之后尝试再次向该主题发出任何消息,则该错误将不再显示为已创建的主题。

请注意:可能是我的特定Kafka安装配置为在不存在的情况下自动创建该主题,这解释了为什么在我的情况下我仅在一开始:您的配置可能会有所不同,在这种情况下,您将一遍又一遍地出现相同的错误。

此致

Luca Tampellini

答案 7 :(得分:8)

此警告的另一种可能性(在0.10.2.1中)是您尝试对刚刚创建的主题进行轮询,并且该主题分区的领导者尚未可用,您正处于领导选举的中间

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

答案 8 :(得分:6)

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

您必须:

  1. hostname添加到pod规范中,就像kafka可以找到的那样。
    1. 如果使用hostPort,则需要hostNetwork: truednsPolicy: ClusterFirstWithHostNet
    2. 原因是因为Kafka需要与自己交谈,并且它决定使用'advertised'监听器/主机名来查找自己,而不是使用localhost。 即使您有一个服务指出广告主机名在广告连播中,它也不会从广告连播中看到。我真的不知道为什么会这样,但至少有一种解决方法。

      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
      

答案 9 :(得分:5)

添加此项,因为它可能会帮助其他人。常见问题可能是advertised.host.name的配置错误。使用Docker-compose设置Docker时,除非您同时设置主机名,否则KAFKA_ADVERTISED_HOST_NAME内的服务名称将无效。 docker-compose.yml示例:

  kafka:
    image: wurstmeister/kafka
    ports:
      - "9092:9092"
    hostname: kafka
    environment:
      KAFKA_ADVERTISED_HOST_NAME: kafka
      KAFKA_CREATE_TOPICS: "test:1:1"
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

上述没有hostname: kafka的人可以在尝试连接时发出LEADER_NOT_AVAILABLE。 您可以找到有效docker-compose配置here

的示例

答案 10 :(得分:3)

就我而言,它在家里可以正常工作,但是当我连接到办公室网络时,它在办公室就无法使用。

因此修改了config / server.properties listeners = PLAINTEXT://:9092到listeners = PLAINTEXT:// localhost:9092

就我而言,我正在描述消费者群

答案 11 :(得分:2)

由于我希望我的kafka经纪人与远程制作人和消费者联系,所以我不希望advertised.listener被注释掉。就我而言,(在kubernetes上运行kafka),我发现我的kafka pod没有分配任何群集IP。通过从services.yml中删除行clusterIP: None,kubernetes将内部ip分配给kafka pod。这解决了我的LEADER_NOT_AVAILABLE问题以及kafka生产者/消费者的远程连接问题。

答案 12 :(得分:2)

我在config/server.properties中添加了以下这一行,解决了上述类似问题。希望这有帮助,它在server.properties文件中有很好的文档,在修改之前尝试阅读和理解。 advertised.listeners=PLAINTEXT://<your_kafka_server_ip>:9092

答案 13 :(得分:2)

当LEADER_NOT_AVAILABLE错误抛出时,只需重新启动kafka代理:

/bin/kafka-server-stop.sh

接着是

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

(注意:Zookeeper必须在这个时候运行,如果你做其他事情它不会工作)

答案 14 :(得分:2)

我正在使用docker-compose使用wurstmeister/kafka图像构建Kafka容器。将KAFKA_ADVERTISED_PORT: 9092属性添加到我的docker-compose文件可以解决此错误。

答案 15 :(得分:1)

将侦听器设置添加到配置目录中的server.properties文件后,问题得以解决。 listeners = PLAINTEXT:// localhost(或您的服务器):9092 进行此更改后,重新启动kafka。使用的版本2.11

答案 16 :(得分:1)

对于那些在Kafka ssl设置中挣扎并看到此LEADER_NOT_AVAILABLE错误的人。可能被破坏的原因之一是密钥库和信任库。在密钥库中,您需要拥有服务器的私钥+签名服务器证书。在客户端信任库中,您需要具有中间CA证书,以便客户端可以对kafka服务器进行身份验证。如果您将使用ssl进行interbroker通信,则需要在服务器的server.properties中设置此信任库,以便它们可以相互进行身份验证。

最后一件我错误地错过了,并且让我花了很多时间来找出这个LEADER_NOT_AVAILABLE错误可能意味着什么。希望这可以帮助某人。

答案 17 :(得分:1)

如果在本地计算机上运行kafka,请尝试使用以下行更新$ KAFKA_DIR / config / server.properties: listeners=PLAINTEXT://localhost:9092,然后重新启动kafka。

答案 18 :(得分:1)

如果您反复收到这样的错误消息:

Error while fetching metadata with correlation id 3991 : {your.topic=LEADER_NOT_AVAILABLE}

Discovered group coordinator 172.25.1.2:9092 (id: 2147483645 rack: null) (org.apache.kafka.clients.consumer.internals.AbstractCoordinator:677)
(Re-)joining group (org.apache.kafka.clients.consumer.internals.AbstractCoordinator:509)
Group coordinator 172.25.1.2:9092 (id: 2147483645 rack: null) is unavailable or invalid, will attempt rediscovery (org.apache.kafka.clients.consumer.internals.AbstractCoordinator:729)
Discovered group coordinator 172.25.40.219:9092 (id: 2147483645 rack: null) (org.apache.kafka.clients.consumer.internals.AbstractCoordinator:677)
Group coordinator 172.25.1.2:9092 (id: 2147483645 rack: null) is unavailable or invalid, will attempt rediscovery (org.apache.kafka.clients.consumer.internals.AbstractCoordinator:729)

然后,您需要在kafka server.properties中配置这样的侦听器设置:

 listeners=PLAINTEXT://your.server.ip:9092

这是在Apacke Kafka 2.5.0和融合平台5.4.1上尝试过的解决方案。

答案 19 :(得分:0)

我今天遇到了同样的问题。我为解决这个错误所做的是在class Struct(object): # hit def __init__(self, content=None): # hit if content is not None: # partial hit self.content = content # missed s = Struct() # hit 文件中进行微妙的修改:

将第/etc/hosts行更改为127.0.0.1 localhost localhost.localdomain

(假设10.0.11.12 localhost localhost.localdomain是Kafka服务器侦听的主机IP地址之一)

答案 20 :(得分:0)

尝试使用此侦听器= PLAINTEXT:// localhost:9092 一定有帮助

非常感谢

答案 21 :(得分:0)

我知道这是很久以前发布的,我想分享我如何解决它。
因为我有我的办公室笔记本电脑(已配置 VPN和代理)。
我检查了环境变量 NO_PROXY

> echo %NO_PROXY%

返回空值
现在我用 localhost 127.0.0.1

设置了NO_PROXY
> set NO_PROXY=127.0.0.1,localhost  

如果要附加到现有值,则

> set NO_PROXY=%NO_PROXY%,127.0.0.1,localhost  

此后,我重新启动了zookeeper和kafka
像魅力一样

答案 22 :(得分:0)

对我来说,我没有为Kafka实例指定经纪人ID。 在Docker环境中重新启动时,有时会从zookeeper获得新的ID。 如果您的经纪人ID大于1000,则只需指定环境变量KAFKA_BROKER_ID

使用它可以查看代理,主题和分区。

brew install kafkacat
kafkacat -b [kafka_ip]:[kafka_poot] -L

答案 23 :(得分:0)

以上答案中提到的广告收听者可能是原因之一。其他可能的原因是:

  1. 该主题可能尚未创建。您可以使用bin/kafka-topics --list --zookeeper <zookeeper_ip>:<zookeeper_port>
  2. 进行检查
  3. 检查您提供给生产者的引导服务器以获取元数据。如果引导服务器不包含有关该主题的最新元数据(例如,当丢失其Zookeeper声明时)。您必须添加多个引导服务器。

此外,请确保将通告的侦听器设置为IP:9092,而不是localhost:9092。后者意味着只能通过本地主机访问代理。

遇到错误时,我记得在引导服务器列表(或代理列表)中使用了 PLAINTEXT://<ip>:<PORT> ,而且很奇怪。

bin/kafka-console-producer --topic sample --broker-list PLAINTEXT://<IP>:<PORT>

答案 24 :(得分:0)

对我来说,原因是使用了不属于Kafka软件包的特定Zookeeper。该Zookeeper已经安装在计算机上用于其他用途。显然,Kafka不适用于任何Zookeeper。切换到Kafka随附的Zookeeper为我解决了。为了不与现有的Zookeeper冲突,我不得不修改配置以使Zookeeper在其他端口上监听:

[root@host /opt/kafka/config]# grep 2182 *
server.properties:zookeeper.connect=localhost:2182
zookeeper.properties:clientPort=2182

答案 25 :(得分:0)

对我来说,这是由于错过配置而发生的 Docker端口(9093)
Kafka命令端口&#34; bin / kafka-console-producer.sh --broker-list localhost: 9092 - topic TopicName&#34;
我检查了我的配置以匹配端口,现在一切正常