TimeoutException:获取主题元数据Kafka时超时

Posted

技术标签:

【中文标题】TimeoutException:获取主题元数据Kafka时超时【英文标题】:TimeoutException: Timeout expired while fetching topic metadata Kafka 【发布时间】:2019-06-12 18:15:06 【问题描述】:

我一直在尝试使用 Kubernetes 在本地部署带有模式注册表的 Kafka。但是,模式注册表 pod 的日志显示此错误消息:

ERROR Server died unexpectedly:  (io.confluent.kafka.schemaregistry.rest.SchemaRegistryMain:51)
org.apache.kafka.common.errors.TimeoutException: Timeout expired while fetching topic metadata

这种行为的原因可能是什么? ' 为了在本地运行 Kubernetes,我使用 Minikube 版本 v0.32.0 和 Kubernetes 版本 v1.13.0

我的 Kafka 配置:

apiVersion: v1
kind: Service
metadata:
  name: kafka-1
spec:
  ports:
    - name: client
      port: 9092
  selector:
    app: kafka
    server-id: "1"
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kafka-1
spec:
  selector:
    matchLabels:
      app: kafka
      server-id: "1"
  replicas: 1
  template:
    metadata:
      labels:
        app: kafka
        server-id: "1"
    spec:
      volumes:
        - name: kafka-data
          emptyDir: 
      containers:
        - name: server
          image: confluent/kafka:0.10.0.0-cp1
          env:
            - name: KAFKA_ZOOKEEPER_CONNECT
              value: zookeeper-1:2181
            - name: KAFKA_ADVERTISED_HOST_NAME
              value: kafka-1
            - name: KAFKA_BROKER_ID
              value: "1"
          ports:
            - containerPort: 9092
          volumeMounts:
            - mountPath: /var/lib/kafka
              name: kafka-data
---
apiVersion: v1
kind: Service
metadata:
  name: schema
spec:
  ports:
    - name: client
      port: 8081
  selector:
    app: kafka-schema-registry
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kafka-schema-registry
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kafka-schema-registry
  template:
    metadata:
      labels:
        app: kafka-schema-registry
    spec:
      containers:
        - name: kafka-schema-registry
          image: confluent/schema-registry:3.0.0
          env:
            - name: SR_KAFKASTORE_CONNECTION_URL
              value: zookeeper-1:2181
            - name: SR_KAFKASTORE_TOPIC
              value: "_schema_registry"
            - name: SR_LISTENERS
              value: "http://0.0.0.0:8081"
          ports:
            - containerPort: 8081

动物园管理员配置:

apiVersion: v1
kind: Service
metadata:
  name: zookeeper
spec:
  ports:
    - name: client
      port: 2181
  selector:
    app: zookeeper
---
apiVersion: v1
kind: Service
metadata:
  name: zookeeper-1
spec:
  ports:
    - name: client
      port: 2181
    - name: followers
      port: 2888
    - name: election
      port: 3888
  selector:
    app: zookeeper
    server-id: "1"
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: zookeeper-1
spec:
  selector:
    matchLabels:
      app: zookeeper
      server-id: "1"
  replicas: 1
  template:
    metadata:
      labels:
        app: zookeeper
        server-id: "1"
    spec:
      volumes:
        - name: data
          emptyDir: 
        - name: wal
          emptyDir:
            medium: Memory
      containers:
        - name: server
          image: elevy/zookeeper:v3.4.7
          env:
            - name: MYID
              value: "1"
            - name: SERVERS
              value: "zookeeper-1"
            - name: JVMFLAGS
              value: "-Xmx2G"
          ports:
            - containerPort: 2181
            - containerPort: 2888
            - containerPort: 3888
          volumeMounts:
            - mountPath: /zookeeper/data
              name: data
            - mountPath: /zookeeper/wal
              name: wal

【问题讨论】:

顺便提一下,confluent/ Docker 镜像已被弃用。并且confluentinc/ 是首选。之前提到过,您在使用 Helm 图表时遇到问题吗? docs.confluent.io/current/installation/installing_cp/… Helm 图表没有问题。我需要在没有 Helm 的情况下部署自定义 Kafka 解决方案,这就是我尝试这样做的原因 我没有看到任何看起来非常定制的东西。 Kafka 确实只安装了一种方式,可能配置值会有所改变,但是任何围绕 Kafka+Schema Registry 构建的自定义应用程序都可以在单独的 YAML 文件中定义 【参考方案1】:
org.apache.kafka.common.errors.TimeoutException: Timeout expired while fetching topic metadata

在尝试连接到期望 SSL 连接的代理并且客户端配置未指定时可能发生;

security.protocol=SSL 

【讨论】:

@AdrianMitev 我使用的是 spring-boot Kafka,所以我最终使用了默认的 spring-boot application-properties 来设置连接。我的错误来自于尝试创建 @Configuration 类来创建连接,这给了我超时错误。 这为我解决了。代理(我无法控制)配置为仍使用端口9092,但启用了 SSL。我以为它是明文。谢谢,安德斯! 谢谢!就我而言,我在 Kubernetes 中错误配置了一个服务,如果通过 SSL 连接,该服务需要一个包含 API 密钥的可选环境变量,而我的密码命名错误。因为我随后将它指向了一个 SSL 端点,所以我最终得到了这个超时。虽然我不熟悉 Kafka 协议,但我希望客户端在等待服务器打招呼,而服务器希望客户端执行 SSL 握手。【参考方案2】:

有一次我通过重启我的机器解决了这个问题,但它又发生了,我不想重启我的机器,所以我用 server.properties 文件中的这个属性修复了它

advertised.listeners=PLAINTEXT://localhost:9092

【讨论】:

【参考方案3】:

Kafka 获取主题元数据失败的原因有两个:

原因 1 如果引导服务器不接受您的连接,这可能是由于某些代理问题,例如 *** 或某些服务器级安全组。

原因 2:安全协议不匹配,其中预期可能是 SASL_SSL,而实际可能是 SSL。或相反,也可以是 PLAIN。

【讨论】:

【参考方案4】:

即使创建了所有 SSL 配置和主题,我也遇到了同样的问题。经过长时间的研究,我启用了spring调试日志。内部错误是 org.springframework.jdbc.CannotGetJdbcConnectionException。当我签入其他线程时,他们说 Spring Boot 和 Kafka 依赖项不匹配会导致超时异常。所以我将 Spring Boot 从 2.1.3 升级到了 2.2.4。现在没有报错,kafka连接成功。可能对某人有用。

【讨论】:

【参考方案5】:

对于可能遇到此问题的其他人,可能是因为主题不是在 kafka 代理机器上创建的。 因此,请确保按照代码库中的说明在服务器上创建适当的主题。

【讨论】:

以上是关于TimeoutException:获取主题元数据Kafka时超时的主要内容,如果未能解决你的问题,请参考以下文章

向 kafka 主题发送消息时出现 TimeoutException

R语言对NASA元数据进行文本挖掘的主题建模分析

为什么我的kafkajs客户端(Node.js / express.js)在获取主题元数据时抛出'TypeError:topic.forEach不是函数?

在 Selenium 中使用无头选项时出现 TimeoutException

如何从 .mp3 文件中获取元数据并使用 FFmpeg 将其作为文本放入视频中?

Caused by: com.alibaba.dubbo.remoting.TimeoutException: Waiting server-side response timeout by scan