Docker Compose搭建3节点Kafka集群时Kafka Connect无法连接Broker
问题根因
- 核心配置错误:Kafka Broker配置了两套监听器,
LISTENER_DOCKER_INTERNAL是给同一Docker网络内的容器通信用的,对应broker1端口19092、broker2端口19093、broker3端口19094;LISTENER_DOCKER_EXTERNAL是给宿主机外部访问用的,对应映射到宿主机的9092/9093/9094端口。你在kafka-connect服务里把CONNECT_BOOTSTRAP_SERVERS配成了broker1:9092,但broker1容器内部根本没有监听9092端口,自然连不上。 - 版本不兼容:集群其余Confluent组件(ZooKeeper、Broker、Schema Registry)全是5.4.2版本,你自定义的Kafka Connect镜像用了5.0.0版本的基础镜像,还装了5.5.0版本的JDBC插件,版本差太大会导致通信协议不兼容,加剧连接问题。
- 配置格式错误:
CONNECT_REST_PORT参数只需要填写端口数值即可,你填成了完整URLhttp://kafka-connect:8083,会导致Connect REST接口启动异常。
修复步骤
- 修改docker-compose.yml中kafka-connect服务的环境变量配置:
environment: CONNECT_REST_ADVERTISED_HOST_NAME: kafka-connect # 用容器内部通信端口,同时把3个broker都加上避免单点故障 CONNECT_BOOTSTRAP_SERVERS: "broker1:19092,broker2:19093,broker3:19094" # 只填端口号,不要加http前缀和主机名 CONNECT_REST_PORT: 8083 CONNECT_GROUP_ID: kafka-connect CONNECT_CONFIG_STORAGE_TOPIC: kafka-connect-configs # 副本因子和集群配置对齐为3,避免单节点故障丢数据 CONNECT_CONFIG_STORAGE_REPLICATION_FACTOR: 3 CONNECT_OFFSET_FLUSH_INTERVAL_MS: 10000 CONNECT_OFFSET_STORAGE_TOPIC: kafka-connect-offsets CONNECT_OFFSET_STORAGE_REPLICATION_FACTOR: 3 CONNECT_STATUS_STORAGE_TOPIC: kafka-connect-status CONNECT_STATUS_STORAGE_REPLICATION_FACTOR: 3 CONNECT_KEY_CONVERTER: org.apache.kafka.connect.storage.StringConverter CONNECT_VALUE_CONVERTER: io.confluent.connect.avro.AvroConverter CONNECT_VALUE_CONVERTER_SCHEMA_REGISTRY_URL: http://schema-registry:8081 CONNECT_INTERNAL_KEY_CONVERTER: "org.apache.kafka.connect.json.JsonConverter" CONNECT_INTERNAL_VALUE_CONVERTER: "org.apache.kafka.connect.json.JsonConverter" CONNECT_ZOOKEEPER_CONNECT: 'zookeeper:2181' CONNECT_PLUGIN_PATH: "/usr/share/java,/usr/share/confluent-hub-components" CONNECT_LOG4J_LOGGERS: org.apache.zookeeper=ERROR,org.I0Itec.zkclient=ERROR,org.reflections=ERROR
- 修改自定义Kafka Connect镜像的Dockerfile,对齐全集群版本:
# 基础镜像版本和集群其余Confluent组件保持一致 FROM confluentinc/cp-kafka-connect-base:5.4.2 ENV CONNECT_PLUGIN_PATH="/usr/share/java,/usr/share/confluent-hub-components" # JDBC插件版本也对齐到5.4.2,避免版本冲突 RUN confluent-hub install --no-prompt confluentinc/kafka-connect-jdbc:5.4.2
修改完成后重新构建镜像:
docker build -t kafka-connect-jdbc .
- 重启整个集群栈:
# 清理之前的异常容器 docker-compose down # 重新启动所有服务 docker-compose up -d
启动后等待30-60秒让所有组件就绪,再查看Kafka Connect日志就不会出现Broker不可用的报错了。
补充:docker-compose的
depends_on配置只会等待容器进程启动,不会等待容器内的服务完全就绪,如果后续仍偶发启动时连接失败,可以给Kafka Connect服务加启动延迟,或者配置健康检查依赖,等Broker完全可用后再启动Connect。
内容的提问来源于stack exchange,提问作者ABC
相关产品推荐
相关产品推荐

