使用docker logs -f kafka查看kafka容器日志的时候,看到控制台一直打印这个报错

[2025-04-13 08:35:36,363] INFO [Admin Manager on Broker 1]: Error processing create topic request CreatableTopic(name='__consumer_offsets', numPartitions=50, replicationFactor=3, assignments=[], configs=[CreateableTopicConfig(name='compression.type', value='producer'), CreateableTopicConfig(name='cleanup.policy', value='compact'), CreateableTopicConfig(name='segment.bytes', value='104857600')]) (kafka.server.ZkAdminManager)
org.apache.kafka.common.errors.InvalidReplicationFactorException: Replication factor: 3 larger than available brokers: 1.
[2025-04-13 08:35:36,498] INFO [Admin Manager on Broker 1]: Error processing create topic request CreatableTopic(name='__consumer_offsets', numPartitions=50, replicationFactor=3, assignments=[], configs=[CreateableTopicConfig(name='compression.type', value='producer'), CreateableTopicConfig(name='cleanup.policy', value='compact'), CreateableTopicConfig(name='segment.bytes', value='104857600')]) (kafka.server.ZkAdminManager)
org.apache.kafka.common.errors.InvalidReplicationFactorException: Replication factor: 3 larger than available brokers: 1.
[2025-04-13 08:35:36,635] INFO [Admin Manager on Broker 1]: Error processing create topic request CreatableTopic(name='__consumer_offsets', numPartitions=50, replicationFactor=3, assignments=[], configs=[CreateableTopicConfig(name='compression.type', value='producer'), CreateableTopicConfig(name='cleanup.policy', value='compact'), CreateableTopicConfig(name='segment.bytes', value='104857600')]) (kafka.server.ZkAdminManager)
org.apache.kafka.common.errors.InvalidReplicationFactorException: Replication factor: 3 larger than available brokers: 1.
[2025-04-13 08:35:36,769] INFO [Admin Manager on Broker 1]: Error processing create topic request CreatableTopic(name='__consumer_offsets', numPartitions=50, replicationFactor=3, assignments=[], configs=[CreateableTopicConfig(name='compression.type', value='producer'), CreateableTopicConfig(name='cleanup.policy', value='compact'), CreateableTopicConfig(name='segment.bytes', value='104857600')]) (kafka.server.ZkAdminManager)
org.apache.kafka.common.errors.InvalidReplicationFactorException: Replication factor: 3 larger than available brokers: 1.
[2025-04-13 08:35:36,905] INFO [Admin Manager on Broker 1]: Error processing create topic request CreatableTopic(name='__consumer_offsets', numPartitions=50, replicationFactor=3, assignments=[], configs=[CreateableTopicConfig(name='compression.type', value='producer'), CreateableTopicConfig(name='cleanup.policy', value='compact'), CreateableTopicConfig(name='segment.bytes', value='104857600')]) (kafka.server.ZkAdminManager)

 

 

错误分析

你的 Kafka 容器日志显示了一个重复的错误:

org.apache.kafka.common.errors.InvalidReplicationFactorException: Replication factor: 3 larger than available brokers: 1.
  • 错误含义

    • Kafka 尝试创建主题 __consumer_offsets(这是一个 Kafka 内部主题,用于存储消费者组的偏移量信息),该主题配置了 replicationFactor=3(副本因子为 3)和 numPartitions=50(50 个分区)。
    • 但是,当前 Kafka 集群只有 1 个 Broker(Kafka 服务器实例),而副本因子 3 要求至少有 3 个 Broker 来存储数据的副本,因此 Kafka 报错 InvalidReplicationFactorException,表示副本因子大于可用 Broker 数量。
  • 为什么会发生

    • __consumer_offsets 是 Kafka 自动创建的内部主题,默认配置通常要求副本因子为 3(高可用性),但你的 Kafka 集群当前只有一个 Broker。
    • 你的消费者(Spring Boot 应用)可能正在运行并尝试连接 Kafka,触发了 __consumer_offsets 主题的创建请求。由于副本因子不匹配,Kafka 无法完成创建并持续报错。

解决方法

为了解决这个问题,你需要调整 Kafka 配置,使主题创建请求与当前集群的 Broker 数量匹配。以下是具体解决方案:

1. 修改 server.properties 配置

在你的 Kafka 配置(server.properties)中,设置 __consumer_offsets 主题的副本因子和分区数,使其适应单一 Broker 环境。

  • 编辑 server.properties
    在你的 server.properties 文件中,添加或修改以下配置:

    offsets.topic.replication.factor=1
    offsets.topic.num.partitions=10
    • offsets.topic.replication.factor=1:将 __consumer_offsets 主题的副本因子设置为 1,因为你只有一个 Broker。
    • offsets.topic.num.partitions=10:减少分区数(默认是 50),单一 Broker 环境下 10 个分区通常足够(可根据需求调整)。
  • 重新构建镜像
    由于 server.properties 已复制到镜像中,修改后需要重新构建 Kafka 镜像:

    docker build -t kafka .
  • 重启容器
    停止并删除当前 Kafka 容器,然后重新运行:

    docker stop kafka
    docker rm kafka
    docker run -d --name kafka -p 9093:9093 kafka

2. 检查 Kafka 集群状态

确认你的 Kafka 集群确实只有一个 Broker:

docker exec -it kafka /opt/kafka/bin/kafka-broker-api-versions.sh --bootstrap-server 39.107.226.5:9093
  • 输出会列出当前集群的 Broker 信息。如果只显示一个 Broker ID(例如 1),说明集群确实是单节点。

如果未来计划扩展到多 Broker 集群,可以部署额外的 Kafka 容器并配置相同的 Zookeeper 地址。

3. 手动创建 __consumer_offsets 主题(可选)

如果修改配置后仍然报错,可以尝试手动创建 __consumer_offsets 主题:

docker exec -it kafka /opt/kafka/bin/kafka-topics.sh --create \
  --bootstrap-server 39.107.226.5:9093 \
  --topic __consumer_offsets \
  --partitions 10 \
  --replication-factor 1 \
  --config cleanup.policy=compact \
  --config compression.type=producer \
  --config segment.bytes=104857600
  • 参数说明:
    • --partitions 10:设置 10 个分区。
    • --replication-factor 1:副本因子为 1,匹配单一 Broker。
    • --config:保留日志中提到的配置(cleanup.policy=compact 等)。

注意:通常不需要手动创建 __consumer_offsets,因为 Kafka 会在消费者启动时自动创建,除非自动创建失败。

4. 检查消费者配置

你的 Spring Boot 消费者(my-consumer-group)可能触发了 __consumer_offsets 的创建。确保消费者配置正确:

  • 在 application.yml 中,确认 bootstrap-servers 为 39.107.226.5:9093
  • 如果消费者运行在本地,检查是否可以通过公网 IP 访问 Kafka(云主机的防火墙需开放 9093 端口)。

5. 使用 Docker Compose(推荐)

为了避免未来类似的配置问题,建议使用 Docker Compose 管理 Kafka 和 Zookeeper,并在启动时明确设置配置。示例 docker-compose.yml

version: '3'
services:
  zookeeper:
    image: zookeeper:latest
    container_name: zookeeper
    ports:
      - "2181:2181"
    networks:
      - kafka-network

  kafka:
    image: kafka
    container_name: kafka
    ports:
      - "9093:9093"
    depends_on:
      - zookeeper
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9093
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://39.107.226.5:9093
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_OFFSETS_TOPIC_NUM_PARTITIONS: 10
    networks:
      - kafka-network

networks:
  kafka-network:
    driver: bridge
  • KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1:设置 __consumer_offsets 的副本因子为 1。
  • KAFKA_OFFSETS_TOPIC_NUM_PARTITIONS: 10:设置分区数为 10。

运行:

docker-compose up -d

这会自动应用正确的配置,避免手动修改 server.properties

6. 验证修复

重启 Kafka 容器后,查看日志:

docker logs -f kafka
  • 如果不再出现 InvalidReplicationFactorException,说明问题已解决。

  • 确认 __consumer_offsets 主题是否创建成功:

    docker exec -it kafka /opt/kafka/bin/kafka-topics.sh --bootstrap-server 39.107.226.5:9093 --describe --topic __consumer_offsets

    输出应显示 ReplicationFactor: 1 和 PartitionsCount: 10


为什么持续报错

日志中错误重复出现是因为 Kafka 检测到 __consumer_offsets 主题不存在,会不断尝试创建,但由于副本因子不匹配,创建失败后会重试。这种行为是 Kafka 的自动主题管理机制触发的,可能由消费者(Spring Boot 应用)或生产者启动引起。


注意事项

  • 单一 Broker 的限制

    • 单 Broker 环境下,副本因子只能为 1,否则会导致类似错误。
    • 如果需要高可用性,未来可以扩展到多 Broker 集群,并将 offsets.topic.replication.factor 增加到 3 或更高。
  • 防火墙

    • 确保云主机的防火墙允许 9093 端口的入站访问,以便消费者和生产者连接。
  • 消费者行为

    • 如果消费者持续运行,可能会触发主题创建。确保消费者启动前 Kafka 配置正确。

下一步

  1. 按照 方法 1 修改 server.properties 并重启 Kafka,或者使用 方法 5 的 Docker Compose 配置。
  2. 检查日志确认错误是否消失。
  3. 测试消费者和生产者功能,确保消息正常发送和接收。

如果仍有问题,请提供:

  • 更新后的 server.properties 内容。
  • 重启后的完整日志(docker logs kafka)。
  • 消费者是否能正常接收消息。
posted on 2025-04-20 22:12  jarsing  阅读(401)  评论(0)    收藏  举报