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

Vis*_*esh 147 producer apache-kafka

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

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

kafka版本:2.11-0.9.0.0

有人可以帮忙,因为我无法在任何地方找到任何解决方案吗?

Ale*_*aga 81

它可能与advertised.host.name你的设置有关server.properties.

什么可能发生的是,你的制作人试图找出谁是给定分区中的佼佼者,计算出其advertised.host.nameadvertised.port和尝试连接.如果未正确配置这些设置,则可能会认为领导者不可用.

  • 将此设置为我的 IP 地址而不是 AWS 生成的公共主机名解决了我遇到的许多问题。 (3认同)
  • 这为我解决了错误..但是 server.properties 中的注释说,如果未配置advertisement.host.name,它将使用host.name。并且host.name是在server.properties文件中配置的。 (2认同)

小智 69

我尝试了这里列出的所有建议.对我有用的是去server.properties并添加:

port = 9092
advertised.host.name = localhost 
Run Code Online (Sandbox Code Playgroud)

离开listenersadvertised_listeners注释掉.

  • 不要使用 - "port","advertised.host.name"是不推荐使用的配置.https://kafka.apache.org/documentation/#brokerconfigs (9认同)
  • 解决方案适合我([vikas'解决方案链接](http://stackoverflow.com/a/40732119/3057986))只想在MAC上添加它``server.properties`文件位于`/ usr/local的/ etc /卡夫卡/` (5认同)
  • 对我有用的是``advertised.listeners = PLAINTEXT://my.ip:9092`` (2认同)

Vla*_*rin 37

我让kafka作为Docker容器运行,类似的消息充斥着日志.
KAFKA_ADVERTISED_HOST_NAME被设置为"卡夫卡".

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

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

实现它的选项:


小智 34

为我解决的是设置如下的监听器:

advertised.listeners = PLAINTEXT://my.public.ip:9092
listeners = PLAINTEXT://0.0.0.0:9092
Run Code Online (Sandbox Code Playgroud)

这使得KAFKA经纪人可以监听所有接口.

  • 这应该是公认的答案.适用于多节点配置,非常有意义. (2认同)

小智 22

我正在使用kafka_2.12-0.10.2.1:

vi config/server.properties

添加以下行:

listeners=PLAINTEXT://localhost:9092
Run Code Online (Sandbox Code Playgroud)
  • 无需更改advertised.listeners,因为它从std listener属性中获取值.

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

  • 如果配置,它使用"侦听器"的值

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

停止卡夫卡经纪人:

bin/kafka-server-stop.sh
Run Code Online (Sandbox Code Playgroud)

重启经纪人:

bin/kafka-server-start.sh -daemon config/server.properties
Run Code Online (Sandbox Code Playgroud)

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


Luc*_*ini 17

在与卡夫卡合作的过去两周里,我一直在目睹同样的问题,从那以后一直在阅读这篇Stackoverflow的帖子.

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

在我的案例中,结果是Kafka发回错误消息,但同时创建了之前不存在的主题.因此,如果我在此事件之后尝试再次为该主题生成任何消息,则该错误将不再显示为已创建的主题.

请注意:可能是我的特定Kafka安装被配置为在不存在的情况下自动创建主题,这解释了为什么在我的情况下我在一开始只看到一次问题:您的配置可能不同并且在那种情况下你会一遍又一遍地犯同样的错误.

问候,

卢卡坦佩利尼


Rya*_*Kay 12

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

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


小智 8

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

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


Yog*_*wda 8

就我而言,它在家里运行良好,但在我连接到办公室网络的那一刻,它在办公室出现故障。

所以将 config/server.properties listeners=PLAINTEXT://:9092 修改为 listeners=PLAINTEXT://localhost:9092

就我而言,我在描述消费者组时得到了


Chr*_*ris 6

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

你必须要么:

  1. 添加hostname到pod规范,kafka可以找到自己的方式.

要么

  1. 如果使用hostPort,那么你需要hostNetwork: truednsPolicy: ClusterFirstWithHostNet

这是因为Kafka需要与自己交谈,并决定使用'广告'的监听器/主机名来查找自己,而不是使用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
Run Code Online (Sandbox Code Playgroud)

  • 1.不起作用%错误:本地:主机解析失败:kafka-cluster:9092/1001:无法解析'kafka-cluster:9092':提供了nodename或servname,或者未知 (2认同)

Pai*_*izo 6

添加此内容可能会帮助其他人。常见问题可能是的配置错误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
Run Code Online (Sandbox Code Playgroud)

上面没有尝试连接时hostname: kafka会发出一个LEADER_NOT_AVAILABLE。您可以在此处找到有效docker-compose配置的示例


MrK*_*lli 6

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