三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Docker 运行 Kafka 4.0+

Docker 运行 Kafka 4.0+

文章目录

  • 一、单节点Docker 运行 Kafka 4.0+
    • docker run 单机快速(测试用)
    • docker‑compose 完整模板(单机KRaft,4.0.0)
    • 进入容器测试命令
    • SpringBoot application.yml 连接配置
    • 重点注意事项
    • 搭配kafka‑ui可视化(扩展compose片段)
  • 二、Kafka4.0.x KRaft 三节点高可用集群(Docker Compose)
    • docker‑compose.yml
    • 启动步骤
    • SpringBoot 连接配置
    • 集群测试命令
    • 关键特性说明
    • 高频踩坑
    • 停止&清理

一、单节点Docker 运行 Kafka 4.0+

Kafka 4.0彻底删除 Zookeeper 模式,只支持 KRaft,不再支持 zk。
官方镜像:apache/kafka,没有 zk 相关任何配置。

docker run 单机快速(测试用)

dockerrun-d\--namekafka4\--restartalways\-p9092:9092\-p9093:9093\-v/data/kafka4/kraft-data:/tmp/kraft-combined-logs\-eKAFKA_NODE_ID=1\-eKAFKA_PROCESS_ROLES=broker,controller\-eKAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093\-eKAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.1.100:9092\-eKAFKA_CONTROLLER_LISTENER_NAMES=CONTROLLER\-eKAFKA_CONTROLLER_QUORUM_VOTERS=1@kafka4:9093\-eKAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1\apache/kafka:4.0.0

⚠️ 修改192.168.1.100为你的宿主机真实IP,SpringBoot业务连接用这个IP:9092。

docker‑compose 完整模板(单机KRaft,4.0.0)

version:'3.8'services:kafka:image:apache/kafka:4.0.0container_name:kafka4restart:alwaysports:-"9092:9092"-"9093:9093"volumes:-./kraft-data:/tmp/kraft-combined-logsenvironment:KAFKA_NODE_ID:1KAFKA_PROCESS_ROLES:'broker,controller'KAFKA_LISTENERS:'PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093'KAFKA_ADVERTISED_LISTENERS:PLAINTEXT://192.168.1.100:9092KAFKA_CONTROLLER_LISTENER_NAMES:'CONTROLLER'KAFKA_CONTROLLER_QUORUM_VOTERS:'1@kafka:9093'KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR:1KAFKA_LOG_RETENTION_HOURS:72KAFKA_LOG_DIRS:'/tmp/kraft-combined-logs'

启动

docker-composeup-d

进入容器测试命令

# 进入容器dockerexec-itkafka4bash# 创建topickafka-topics.sh--create--topicdemo --bootstrap-server127.0.0.1:9092--partitions2--replication-factor1# 列表kafka-topics.sh--list--bootstrap-server127.0.0.1:9092# 生产者kafka-console-producer.sh--topicdemo --bootstrap-server127.0.0.1:9092# 消费者kafka-console-consumer.sh--topicdemo --bootstrap-server127.0.0.1:9092 --from-beginning# 查看kafka版本kafka-topics.sh--version

SpringBoot application.yml 连接配置

spring:kafka:bootstrap-servers:192.168.1.100:9092producer:key-serializer:org.apache.kafka.common.serialization.StringSerializervalue-serializer:org.apache.kafka.common.serialization.StringSerializerconsumer:key-deserializer:org.apache.kafka.common.serialization.StringDeserializervalue-deserializer:org.apache.kafka.common.serialization.StringDeserializer

重点注意事项

  1. Kafka4.x 完全没有Zookeeper,不要再写任何zk连接参数
  2. 镜像:apache/kafka:4.0.0,不要用confluentinc/cp‑kafka,cp还没有4.0大版本。
  3. 数据目录权限:挂载宿主机目录报权限拒绝
chmod-R777./kraft-data
  1. 升级提醒:旧的kafka3.x zookeeper集群不能直接升级到4.0
    • 3.x zk集群 → 先升级到3.5+/3.6+,执行迁移工具切换KRaft;迁移完成后,再升级到4.0。
    • 不能直接把zk的数据目录直接给kafka4使用,元数据格式完全不一样。
  2. 单机生产注意:单机同时做broker+controller,replication‑factor=1,不能高可用,仅测试/小规模使用;真正生产集群至少3节点controller。

搭配kafka‑ui可视化(扩展compose片段)

kafka-ui:image:provectuslabs/kafka-ui:latestcontainer_name:kafka-uirestart:alwaysports:-"8081:8080"environment:KAFKA_CLUSTERS_0_NAME:local‑kraft‑40KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS:kafka:9092

访问:http://宿主机IP:8081

二、Kafka4.0.x KRaft 三节点高可用集群(Docker Compose)

Kafka4.0+彻底移除Zookeeper,仅KRaft模式
3个节点全部同时充当broker + controller,控制器仲裁quorum=3,挂掉任意1台集群依然正常工作,满足生产高可用基础条件。
注意:下面是单机docker模拟3节点集群(同一台宿主机),用于开发测试;真正生产要部署在三台不同物理服务器

docker‑compose.yml

version:"3.8"services:kafka‑1:image:apache/kafka:4.0.0container_name:kafka‑1restart:alwaysports:-"9092:9092"# broker端口对外-"9093:9093"# controller内部仲裁端口volumes:-./data‑1:/tmp/kraft‑combined‑logsenvironment:KAFKA_NODE_ID:1KAFKA_PROCESS_ROLES:"broker,controller"KAFKA_LISTENERS:"PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093"# 👉 修改为你的宿主机IP,外部业务程序连接KAFKA_ADVERTISED_LISTENERS:"PLAINTEXT://192.168.1.100:9092"KAFKA_CONTROLLER_LISTENER_NAMES:"CONTROLLER"KAFKA_CONTROLLER_QUORUM_VOTERS:"1@kafka‑1:9093,2@kafka‑2:9093,3@kafka‑3:9093"KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR:3KAFKA_DEFAULT_REPLICATION_FACTOR:3KAFKA_LOG_DIRS:"/tmp/kraft‑combined‑logs"kafka‑2:image:apache/kafka:4.0.0container_name:kafka‑2restart:alwaysports:-"9094:9092"-"9095:9093"volumes:-./data‑2:/tmp/kraft‑combined‑logsenvironment:KAFKA_NODE_ID:2KAFKA_PROCESS_ROLES:"broker,controller"KAFKA_LISTENERS:"PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093"KAFKA_ADVERTISED_LISTENERS:"PLAINTEXT://192.168.1.100:9094"KAFKA_CONTROLLER_LISTENER_NAMES:"CONTROLLER"KAFKA_CONTROLLER_QUORUM_VOTERS:"1@kafka‑1:9093,2@kafka‑2:9093,3@kafka‑3:9093"KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR:3KAFKA_DEFAULT_REPLICATION_FACTOR:3KAFKA_LOG_DIRS:"/tmp/kraft‑combined‑logs"kafka‑3:image:apache/kafka:4.0.0container_name:kafka‑3restart:alwaysports:-"9096:9092"-"9097:9093"volumes:-./data‑3:/tmp/kraft‑combined‑logsenvironment:KAFKA_NODE_ID:3KAFKA_PROCESS_ROLES:"broker,controller"KAFKA_LISTENERS:"PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093"KAFKA_ADVERTISED_LISTENERS:"PLAINTEXT://192.168.1.100:9096"KAFKA_CONTROLLER_LISTENER_NAMES:"CONTROLLER"KAFKA_CONTROLLER_QUORUM_VOTERS:"1@kafka‑1:9093,2@kafka‑2:9093,3@kafka‑3:9093"KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR:3KAFKA_DEFAULT_REPLICATION_FACTOR:3KAFKA_LOG_DIRS:"/tmp/kraft‑combined‑logs"kafka-ui:image:provectuslabs/kafka-ui:latestcontainer_name:kafka-uirestart:alwaysports:-"8081:8080"environment:KAFKA_CLUSTERS_0_NAME:kafka4‑3node‑kraftKAFKA_CLUSTERS_0_BOOTSTRAPSERVERS:kafka‑1:9092,kafka‑2:9092,kafka‑3:9092

启动步骤

# 创建数据目录mkdir-pdata‑1 data‑2 data‑3# 解决容器挂载目录权限问题chmod-R777data‑1 data‑2 data‑3# 启动集群docker-composeup-d# 查看容器状态docker-composeps

访问UI:http://宿主机IP:8081

SpringBoot 连接配置

spring:kafka:bootstrap-servers:192.168.1.100:9092,192.168.1.100:9094,192.168.1.100:9096producer:key-serializer:org.apache.kafka.common.serialization.StringSerializervalue-serializer:org.apache.kafka.common.serialization.StringSerializerconsumer:key-deserializer:org.apache.kafka.common.serialization.StringDeserializervalue-deserializer:org.apache.kafka.common.serialization.StringDeserializer

集群测试命令

# 进入kafka‑1容器dockerexec-itkafka‑1bash# 创建topic,3分区,3副本kafka-topics.sh--create--topictest3 --bootstrap-server127.0.0.1:9092--partitions3--replication-factor3# 查看topic详细信息kafka-topics.sh--describe--topictest3 --bootstrap-server127.0.0.1:9092# 查看集群版本kafka-topics.sh--version

关键特性说明

  1. 3个controller节点,quorum=3,挂掉任意一台,集群控制器依然正常工作;挂2台控制器集群元数据不可用。
  2. default.replication.factor=3,新建topic默认3副本。
  3. 同一台宿主机docker模拟仅用于开发测试;真正生产三台物理服务器部署:
    • 每台机器只跑一个kafka容器
    • KAFKA_CONTROLLER_QUORUM_VOTERS填写三台机器ip+controller端口
    • KAFKA_ADVERTISED_LISTENERS填写各自机器外网/内网IP

高频踩坑

  1. KAFKA_ADVERTISED_LISTENERS:必须填写宿主机真实内网IP,不能写127.0.0.1,否则外部业务连接失败。
  2. 容器内部之间通信,使用容器名kafka‑1:9093,不要用宿主机IP。
  3. 数据目录权限报错:chmod -R 777 data‑*
  4. replication‑factor不能大于broker节点数。
  5. 旧Zookeeper的kafka数据不能直接迁移到此集群,需要重新搭建或使用官方迁移工具。

停止&清理

# 停止集群docker-composedown# 彻底删除数据(测试重置集群用)rm-rfdata‑1 data‑2 data‑3mkdir-pdata‑1 data‑2 data‑3chmod-R777data‑1 data‑2 data‑3
← 返回列表