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

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


当前回答

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

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

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

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

其他回答

这是我在config/server中添加的。属性,这解决了我的问题类似上述问题。希望这有助于,它在服务器中有很好的文档。属性文件,在修改此文件之前,请尝试阅读和理解。 advertised.listeners =明文:/ / < your_kafka_server_ip >: 9092

对我来说,原因是使用了一个特定的Zookeeper,这不是Kafka包的一部分。该Zookeeper已经安装在机器上用于其他目的。显然卡夫卡不会和任何一个动物园管理员合作。切换到卡夫卡附带的Zookeeper为我解决了这个问题。为了不与现有的Zookeeper发生冲突,我不得不修改我的配置,让Zookeeper监听不同的端口:

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

对于任何试图在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

试试这个监听器=PLAINTEXT://localhost:9092 一定很有帮助

非常感谢

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

可能发生的情况是,您的生产者试图找出谁是给定分区的领导者,找出它的advertised.host.name和advertised。端口并尝试连接。 如果这些设置没有正确配置,那么可能会认为领导者不可用。