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
为什么我的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