【问题标题】:TimeoutException: Timeout expired while fetching topic metadata KafkaTimeoutException:获取主题元数据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 文件中定义

标签: kubernetes apache-kafka apache-zookeeper confluent-schema-registry


【解决方案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 如果引导服务器不接受您的连接,这可能是由于某些代理问题,例如 VPN 或某些服务器级安全组。

    原因 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 代理机器上创建的。 因此,请确保按照代码库中的说明在服务器上创建适当的主题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-10-07
          • 2020-09-18
          • 2019-11-22
          • 2021-03-19
          • 1970-01-01
          • 2019-12-25
          • 2019-10-13
          • 2020-08-07
          相关资源
          最近更新 更多