You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kafka生产者报INVALID_REPLICATION_FACTOR错误求助

问题根源

你遇到的INVALID_REPLICATION_FACTOR错误,核心原因是两个Broker处于独立的Docker网络中,无法互相发现和通信,导致每个Broker都认为集群中只有自己在线。虽然ZK里的主题元数据显示副本配置正确,但实际运行时Broker无法感知到另一个节点的存在,因此判定副本因子2超过了可用Broker数量,触发错误。

另外你的配置里还有一个拼写错误:KAFKA_ZOOKEEPER_CONNECT中的host.docker.internel少了一个字母a,应该是host.docker.internal,这可能会影响Broker与ZK的稳定连接。


解决步骤

1. 创建共享Docker网络

两个Broker属于独立的docker-compose项目,默认会使用各自的私有网络,互相无法访问。先创建一个全局共享网络:

docker network create kafka-cluster-network

2. 修改Broker的docker-compose配置

分别修改两个Broker的docker-compose文件,加入共享网络,并修正内部监听器的通告地址:

Broker 1的docker-compose.yml

version: "3"
services:
  broker1:
    image: confluentinc/cp-kafka:7.3.2
    container_name: kd-broker-1
    ports:
      - "9093:9093"
      - "9094:9094"
    environment:
      KAFKA_BROKER_ID: 1
      # 修正ZK连接的拼写错误
      KAFKA_ZOOKEEPER_CONNECT: "host.docker.internal:2181"
      KAFKA_LISTENERS: INTERNEL://:9092, EXTERNEL://:9093, DEVELOPMENT://:9094
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNEL:PLAINTEXT,EXTERNEL:PLAINTEXT, DEVELOPMENT:PLAINTEXT
      # 修改INTERNEL监听器的通告地址为容器名,让其他Broker能访问
      KAFKA_ADVERTISED_LISTENERS: INTERNEL://kd-broker-1:9092, EXTERNEL://host.docker.internal:9093, DEVELOPMENT://localhost:9094
      KAFKA_INTER_BROKER_LISTENER_NAME: INTERNEL
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 2
    # 加入共享网络
    networks:
      - kafka-cluster-network

networks:
  kafka-cluster-network:
    external: true

Broker 2的docker-compose.yml

version: "3"
services:
  broker2:
    image: confluentinc/cp-kafka:7.3.2
    container_name: kd-broker-2
    ports:
      - "9095:9095"
      - "9096:9096"
    environment:
      KAFKA_BROKER_ID: 2
      # 修正ZK连接的拼写错误
      KAFKA_ZOOKEEPER_CONNECT: "host.docker.internal:2181"
      KAFKA_LISTENERS: INTERNEL://:9092, EXTERNEL://:9095, DEVELOPMENT://:9096
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNEL:PLAINTEXT,EXTERNEL:PLAINTEXT, DEVELOPMENT:PLAINTEXT
      # 修改INTERNEL监听器的通告地址为容器名
      KAFKA_ADVERTISED_LISTENERS: INTERNEL://kd-broker-2:9092, EXTERNEL://host.docker.internal:9095, DEVELOPMENT://localhost:9096
      KAFKA_INTER_BROKER_LISTENER_NAME: INTERNEL
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 2
    # 加入共享网络
    networks:
      - kafka-cluster-network

networks:
  kafka-cluster-network:
    external: true

3. 重启集群

先停止并删除现有Broker容器,然后重新启动:

# 停止并删除Broker1容器
docker-compose -f broker1-compose.yml down
# 启动Broker1
docker-compose -f broker1-compose.yml up -d

# 停止并删除Broker2容器
docker-compose -f broker2-compose.yml down
# 启动Broker2
docker-compose -f broker2-compose.yml up -d

4. 验证集群状态

等待1分钟左右,在任意Broker容器内执行以下命令,检查Broker是否都在线以及主题的同步副本状态:

kafka-topics --describe --topic test-topic --bootstrap-server localhost:9092

如果输出中Replicas和Isr字段都包含1,2,说明集群状态正常。

5. 测试生产者

再次运行生产者客户端,此时应该不会再出现INVALID_REPLICATION_FACTOR错误:

kafka-console-producer --topic test-topic --bootstrap-server host.docker.internal:9093

额外说明

  • 独立docker-compose项目的默认网络是隔离的,必须显式指定共享网络才能让容器互相通信。
  • 内部监听器的通告地址必须使用其他容器能解析的名称(容器名、服务名),不能只用:9092,否则其他Broker无法定位到该节点。

内容的提问来源于stack exchange,提问作者melkorCba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 03:42:11