Kafka注册Schema Registry超时:等待ZooKeeper创建/brokers/ids失败
问题分析与解决方案
核心问题
你遇到的TimeoutException是因为Schema Registry启动时,Kafka还未在Zookeeper中完成/brokers/ids节点的注册,再加上配置中的几处错误共同导致的:
1. 镜像版本不兼容
混用wurstmeister的Kafka镜像(2.4.0)和Confluent的Schema Registry镜像(5.3.1),两者版本不匹配会引发通信兼容性问题。Confluent的Schema Registry需要搭配同版本的Confluent Kafka使用。
2. Kafka配置错误
KAFKA_ADVERTISED_HOST_NAME参数被设置为kafka:29092,这是错误的——该参数仅需填写主机名kafka,端口信息已经在KAFKA_ADVERTISED_LISTENERS中定义,错误配置会导致Kafka在Zookeeper中注册的broker地址异常,Schema Registry无法识别。
3. 容器启动顺序≠服务就绪
depends_on仅保证容器启动顺序,不代表Zookeeper和Kafka服务完全就绪。Schema Registry启动时,Kafka可能还未完成在Zookeeper的注册流程。
修正后的Docker Compose配置
替换为同版本的Confluent Kafka镜像,修正错误配置,并增加超时和健康检查:
version: "3.1" services: zookeeper: image: confluentinc/cp-zookeeper:5.3.1 hostname: zookeeper ports: - 2181:2181 container_name: zookeeper environment: ZOOKEEPER_CLIENT_PORT: 2181 ZOOKEEPER_TICK_TIME: 2000 healthcheck: test: ["CMD", "zkServer.sh", "status"] interval: 10s timeout: 5s retries: 5 kafka: container_name: dvs-kafka image: confluentinc/cp-kafka:5.3.1 hostname: kafka depends_on: zookeeper: condition: service_healthy ports: - 29092:29092 environment: KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092 KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:29092 KAFKA_ZOOKEEPER_CONNECTION_TIMEOUT_MS: 30000 KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false" healthcheck: test: ["CMD", "kafka-topics.sh", "--list", "--zookeeper", "zookeeper:2181"] interval: 10s timeout: 5s retries: 5 schema-registry: image: confluentinc/cp-schema-registry:5.3.1 hostname: schema-registry depends_on: kafka: condition: service_healthy container_name: schema-registry ports: - "8081:8081" environment: SCHEMA_REGISTRY_HOST_NAME: schema-registry SCHEMA_REGISTRY_KAFKASTORE_CONNECTION_URL: "zookeeper:2181" SCHEMA_REGISTRY_KAFKASTORE_INIT_TIMEOUT_MS: 60000
关键修正点说明
- 统一镜像版本:将Kafka换成Confluent官方的
cp-kafka:5.3.1,和Schema Registry版本保持一致,避免兼容性问题。 - 修正Kafka监听配置:
KAFKA_LISTENERS设置为PLAINTEXT://0.0.0.0:29092,允许容器内部和外部访问;移除错误的KAFKA_ADVERTISED_HOST_NAME参数。 - 增加健康检查:给Zookeeper和Kafka添加健康检查,确保服务完全就绪后再启动Schema Registry,解决启动时序问题。
- 延长Schema Registry初始化超时:通过
SCHEMA_REGISTRY_KAFKASTORE_INIT_TIMEOUT_MS将超时时间从默认的40000ms延长到60000ms,给Kafka足够的注册时间。
内容的提问来源于stack exchange,提问作者nivendha
相关产品推荐
相关产品推荐

