领头人不在游戏机生产商Kafka

dzhpxtsq  于 2021-06-07  发布在  Kafka
关注(0)|答案(25)|浏览(432)

我想用Kafka。
所有的配置都做得很好,但是当我试图从控制台生成消息时,我总是得到以下错误

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

0yg35tkg

0yg35tkg16#

对于任何试图在Kubernetes身上运行Kafka并遇到这个错误的人来说,这就是最终为我解决这个问题的原因:
你必须:
添加 hostname 按照吊舱的规格,这样Kafka才能找到自己。

如果使用 hostPort ,那么你需要 hostNetwork: true 以及 dnsPolicy: ClusterFirstWithHostNet 原因是kafka需要与自己对话,它决定使用“广告”侦听器/主机名来查找自己,而不是使用localhost。即使您有一个将播发的主机名指向pod的服务,也无法从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
gz5pxeao

gz5pxeao17#

在我的情况下,它在家里运行良好,但在办公室,当我连接到办公网络的那一刻,它就失败了。
因此将config/server.properties listeners=plaintext://:9092修改为listeners=plaintext://localhost:9092
在我的例子中,我在描述消费者群体时

beq87vna

beq87vna18#

下面这一行是我加进去的 config/server.properties ,解决了我的问题类似于上述问题。希望这有帮助,它在server.properties文件中有很好的文档记录,请在修改此文件之前阅读并理解。 advertised.listeners=PLAINTEXT://<your_kafka_server_ip>:9092

nkoocmlb

nkoocmlb19#

此警告的另一种可能性(在0.10.2.1中)是,您尝试对刚刚创建的主题进行投票,而此主题分区的领导人还不可用,您正在进行领导人选举。
在主题创建和轮询之间等待一秒钟是一种解决方法。

wn9m85ua

wn9m85ua20#

我正在使用docker compose构建kafka容器,使用 wurstmeister/kafka 形象。添加 KAFKA_ADVERTISED_PORT: 9092 我的财产 docker-compose 文件为我解决了这个错误。

11dmarpk

11dmarpk21#

加上这个,因为它可以帮助别人。一个常见的问题可能是对 advertised.host.name . docker使用docker compose设置内部服务的名称 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 此处配置

wbrvyc0a

wbrvyc0a22#

在config目录下的server.properties文件中添加侦听器设置后,问题得到解决。听众=plaintext://localhost(或您的服务器):9092在此更改后重新启动kafka。版本2.11

toiithl6

toiithl623#

在过去的两周里,我和Kafka一起工作的时候也看到过同样的问题,从那以后我一直在读这个stackoverflow的帖子。
经过两周的分析,我推断在我的例子中,这种情况发生在试图向一个不存在的主题生成消息时。
在我的例子中,结果是Kafka发回了一个错误消息,但同时创建了以前不存在的主题。因此,如果在此事件之后再次尝试生成指向该主题的任何消息,则错误将不再显示为已创建的主题。
请注意:这可能是我的Kafka安装配置为自动创建主题时,相同的不存在;这应该可以解释为什么在我的例子中,在重置主题之后,每个主题只能看到一次问题:您的配置可能不同,在这种情况下,您会不断收到相同的错误。
当做,
卢卡坦佩利尼

ha5z0ras

ha5z0ras24#

对于那些挣扎于Kafkassl设置和看到这个领导人不可用的错误。可能被破坏的原因之一是密钥库和信任库。在密钥库中,需要有服务器的私钥+已签名的服务器证书。在客户机信任库中,您需要具有中介ca证书,以便客户机可以对kafka服务器进行身份验证。如果要使用ssl进行代理间通信,则还需要在代理的server.properties中设置此信任库,以便它们可以相互验证。
最后一段我被错误地遗漏了,让我花了好几个小时才发现这个领导不可用的错误可能意味着什么。希望这能帮助别人。

rn0zuynd

rn0zuynd25#

对我来说,解决这个问题的办法是让听众这样:

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

这使得kafka代理侦听所有接口。

相关问题