Confluent Schema Registry对接Amazon MSK架构注册超时问题排查
问题详情
我尝试将Confluent Schema Registry与Amazon MSK(托管Kafka)配合使用,使用以下Docker命令启动Schema Registry:
docker run -e 'SCHEMA_REGISTRY_KAFKASTORE_TOPIC=_mySchemas' \ -e 'SCHEMA_REGISTRY_KAFKASTORE_BOOTSTRAP_SERVERS=PLAINTEXT://my.cluster.kafka.us-east-1.amazonaws.com:9092' \ -e 'SCHEMA_REGISTRY_HOST_NAME=localhost' \ -p 8081:8081 \ -it confluentinc/cp-schema-registry:7.5.0 # 也尝试过5.1.2、5.4.0、6.1.0等旧版本
服务启动正常,日志输出:
[2023-09-13 14:27:49,015] INFO Server started, listening for requests... (io.confluent.kafka.schemaregistry.rest.SchemaRegistryMain)
但执行官方快速开始的测试架构注册请求时,60秒后收到错误响应:
{"error_code":50003,"message":"Error while forwarding register schema request to the leader"}
服务器日志核心错误为连接http://10.202.47.204:8081超时:
[2023-09-13 14:39:49,216] ERROR Failed to send HTTP request to endpoint: http://10.202.47.204:8081/subjects/Kafka-key/versions?normalize=false (io.confluent.kafka.schemaregistry.client.rest.RestService) java.net.SocketTimeoutException: connect timed out ...
已确认Schema Registry与Kafka通信正常:成功创建_mySchemas主题并写入NOOP消息,无Kafka连接错误。
问题根源
Schema Registry会将自身的节点地址存储到Kafka的元数据中(即使是单节点部署)。你设置了SCHEMA_REGISTRY_HOST_NAME=localhost,但Docker容器内部的localhost与外部主机的localhost属于不同网络空间;同时Schema Registry会把容器的内部IP(如日志中的10.202.47.204)注册到Kafka元数据,处理请求时会尝试转发到该内部IP,但外部请求或容器自身的客户端无法访问这个地址,最终导致连接超时。
解决步骤
修正
SCHEMA_REGISTRY_HOST_NAME配置
将该参数设置为容器可被外部访问的真实地址:- 本地测试场景:使用你的主机物理IP(不要用
localhost); - EC2部署场景:使用EC2的私有IP或弹性IP(需确保安全组允许8081端口的入站流量)。
修改后的Docker命令示例:
docker run -e 'SCHEMA_REGISTRY_KAFKASTORE_TOPIC=_mySchemas' \ -e 'SCHEMA_REGISTRY_KAFKASTORE_BOOTSTRAP_SERVERS=PLAINTEXT://my.cluster.kafka.us-east-1.amazonaws.com:9092' \ -e 'SCHEMA_REGISTRY_HOST_NAME=你的主机IP/EC2私有IP' \ -p 8081:8081 \ -it confluentinc/cp-schema-registry:7.5.0- 本地测试场景:使用你的主机物理IP(不要用
添加
SCHEMA_REGISTRY_LISTENERS配置(推荐)
指定Schema Registry监听容器的所有网络接口,确保外部请求能通过端口映射正常访问:docker run -e 'SCHEMA_REGISTRY_KAFKASTORE_TOPIC=_mySchemas' \ -e 'SCHEMA_REGISTRY_KAFKASTORE_BOOTSTRAP_SERVERS=PLAINTEXT://my.cluster.kafka.us-east-1.amazonaws.com:9092' \ -e 'SCHEMA_REGISTRY_HOST_NAME=你的主机IP/EC2私有IP' \ -e 'SCHEMA_REGISTRY_LISTENERS=http://0.0.0.0:8081' \ -p 8081:8081 \ -it confluentinc/cp-schema-registry:7.5.0清理旧元数据
如果Kafka中已存在_mySchemas主题,里面可能留存了旧的节点地址信息,需删除该主题后重新启动Schema Registry:kafka-topics.sh --bootstrap-server my.cluster.kafka.us-east-1.amazonaws.com:9092 --delete --topic _mySchemas验证网络连通性
确保主机/EC2的安全组、防火墙允许8081端口的入站和出站流量;可在容器内部执行curl http://你的主机IP:8081/subjects,验证是否能正常访问Schema Registry接口。
内容的提问来源于stack exchange,提问作者noamtm

