我试着用卡夫卡。 所有配置都正确完成,但当我试图从控制台产生消息时,我一直得到以下错误

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

Kafka版本:2.11-0.9.0.0


当前回答

以我为例,它在家里工作得很好,但在办公室里,当我连接到办公室网络时,它就不行了。

所以修改了config/server.properties 监听器=明文://:9092 to监听器=明文://localhost:9092

在我的例子中,我是在描述消费者群体时得到的

其他回答

因为我想让我的kafka代理连接到远程生产者和消费者,所以我不想做广告。要注释掉的侦听器。在我的情况下,(在kubernetes上运行kafka),我发现我的kafka pod没有分配任何集群IP。通过从服务中删除行clusterIP: None。呵呵,kubernetes给kafka pod分配了一个内部ip。这解决了我的LEADER_NOT_AVAILABLE问题,也解决了kafka生产者/消费者的远程连接问题。

对于我来说,我没有为Kafka实例指定代理id。 当它在Docker环境中重启时,有时会从zookeeper获取一个新的id。 如果您的代理id大于1000,只需指定环境变量KAFKA_BROKER_ID。

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

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

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

你必须:

将主机名添加到pod规范中,这样kafka就可以找到自己。

or

如果使用hostPort,则需要hostNetwork: true和dnsPolicy: ClusterFirstWithHostNet

这样做的原因是因为Kafka需要与自身对话,它决定使用“广告”侦听器/主机名来找到自己,而不是使用localhost。 即使您有一个将所广告的主机名指向pod的Service,它在pod中也不可见。我真的不知道为什么会这样,但至少有一个变通办法。

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

在过去的两周里,当我和Kafka一起工作时,我一直在目睹同样的问题,从那时起我就一直在阅读这篇Stackoverflow的帖子。

经过2周的分析,我推断在我的情况下会发生这种情况 当尝试向不存在的主题生成消息时。

在我的例子中,结果是Kafka返回了一个错误消息,但在 同时,以前不存在的话题。因此,如果我尝试在此事件之后再次对该主题产生任何消息,错误将不再出现,因为主题已被创建。

请注意:这可能是我的特定Kafka安装配置为自动创建主题时,同样的不存在;这应该解释了为什么在我的情况下,我可以看到的问题只有一次为每个主题重置主题:你的配置可能是不同的,在这种情况下,你会一直收到相同的错误一遍又一遍。

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

在我的例子中,错误的原因是在“kafka”容器本身中缺少“kafka”的/etc/hosts记录。 因此,例如,在'kafka'容器中运行ping kafka将失败,使用ping: bad address 'kafka'

在Docker中,这个问题可以通过指定容器的主机名来解决。

实现它的选项:

Docker run——hostname… Docker运行-add-host… docker-compose中的主机名 AWS EC2任务定义中的主机名