文章目录
- 单节点部署 Kafka Kraft 集群
-
- 一、部署前提
- 二、部署步骤
-
- 1. 创建数据目录
- 2. 编写 Docker Compose 配置文件
- 3. 核心配置说明
- 4. 启动 Kafka 集群
- 5. 查看集群启动状态
- 三、集群验证
-
- 1. 进入容器创建测试 Topic
- 2. 发送 / 消费测试消息
- 四、注意事项
单节点部署 Kafka Kraft 集群
在 Kafka 2.8 版本之后,官方推出了 Kraft 模式,彻底摆脱了对 ZooKeeper 的依赖,大大简化了 Kafka 集群的部署和维护成本。本文将分享如何通过 Docker Compose 快速搭建一个单服务器多节点的 Kafka Kraft 测试集群,适合开发、测试环境快速落地使用。

一、部署前提
- 宿主机已安装 Docker 和 Docker Compose(建议 Docker 版本≥20.10,Compose 版本≥3.0);
- 宿主机有足够的磁盘空间(每个 Kafka 节点会持久化数据,测试环境建议至少预留 10GB 以上);
- 确保宿主机 9192-9197 端口未被占用(本文章为了避免端口冲突,影响现有kafka集群配置的,可根据实际情况调整)。
二、部署步骤
1. 创建数据目录
首先创建 Kafka 数据持久化目录,避免容器删除后数据丢失,并赋予目录足够的权限:
文件目录创建:
mkdir kafka/
mkdir -p ./kafka/broker1 ./kafka/broker2 ./kafka/broker3
chmod -R 777 ./kafka/
2. 编写 Docker Compose 配置文件
在 kafka 目录下创建docker-compose.yml文件,内容如下:
version: '3'
services:
kafka1:
image: 'bitnami/kafka:latest'
container_name: kafka1
network_mode: "host"
restart: unless-stopped
environment:
– KAFKA_ENABLE_KRAFT=yes
– KAFKA_CFG_NODE_ID=1
– KAFKA_CFG_PROCESS_ROLES=controller,broker
– KAFKA_CFG_LISTENERS=PLAINTEXT://:9192,CONTROLLER://:9193
– KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.119.5:9192
– KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
– KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@192.168.119.5:9193,2@192.168.119.5:9195,3@192.168.119.5:9197
– KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
– KAFKA_KRAFT_CLUSTER_ID=LZ4Z7HnGqkQmzDcBvNmRtP
– ALLOW_PLAINTEXT_LISTENER=yes
– KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=false
volumes:
– ./kafka/broker1:/bitnami/kafka
kafka2:
image: 'bitnami/kafka:latest'
container_name: kafka2
network_mode: "host"
restart: unless-stopped
environment:
– KAFKA_ENABLE_KRAFT=yes
– KAFKA_CFG_NODE_ID=2
– KAFKA_CFG_PROCESS_ROLES=controller,broker
– KAFKA_CFG_LISTENERS=PLAINTEXT://:9194,CONTROLLER://:9195
– KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.119.5:9194
– KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
– KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@192.168.119.5:9193,2@192.168.119.5:9195,3@192.168.119.5:9197
– KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
– KAFKA_KRAFT_CLUSTER_ID=LZ4Z7HnGqkQmzDcBvNmRtP
– ALLOW_PLAINTEXT_LISTENER=yes
– KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=false
volumes:
– ./kafka/broker2:/bitnami/kafka
kafka3:
image: 'bitnami/kafka:latest'
container_name: kafka3
network_mode: "host"
restart: unless-stopped
environment:
– KAFKA_ENABLE_KRAFT=yes
– KAFKA_CFG_NODE_ID=3
– KAFKA_CFG_PROCESS_ROLES=controller,broker
– KAFKA_CFG_LISTENERS=PLAINTEXT://:9196,CONTROLLER://:9197
– KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.119.5:9196
– KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
– KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@192.168.119.5:9193,2@192.168.119.5:9195,3@192.168.119.5:9197
– KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
– KAFKA_KRAFT_CLUSTER_ID=LZ4Z7HnGqkQmzDcBvNmRtP
– ALLOW_PLAINTEXT_LISTENER=yes
– KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=false
volumes:
– ./kafka/broker3:/bitnami/kafka
3. 核心配置说明
上述配置定义了 3 个 Kafka 节点,核心参数解释如下:
| KAFKA_ENABLE_KRAFT=yes | 启用 Kraft 模式,替代 ZooKeeper |
| KAFKA_CFG_NODE_ID | 节点唯一标识(1/2/3),不可重复 |
| KAFKA_CFG_PROCESS_ROLES | 节点角色,controller(集群管控)+broker(消息收发),适合单服务器部署 |
| KAFKA_CFG_LISTENERS | 节点监听端口:PLAINTEXT 为客户端连接端口,CONTROLLER 为控制器集群内部通信端口 |
| KAFKA_CFG_ADVERTISED_LISTENERS | 对外暴露的连接地址(宿主机 IP+PLAINTEXT 端口),客户端需通过此地址连接 |
| KAFKA_CFG_CONTROLLER_QUORUM_VOTERS | 控制器集群投票节点列表,格式为节点ID@IP:控制器端口 |
| KAFKA_KRAFT_CLUSTER_ID | 集群唯一 ID,所有节点需保持一致(可通过kafka-storage.sh random-uuid生成自定义 ID) |
| volumes | 宿主机目录挂载到容器内 Kafka 数据目录,实现数据持久化 |
| network_mode: host | 容器使用宿主机网络,无需端口映射,简化网络配置(测试环境适用) |
这个配置文件遵循 Docker Compose v3 规范,定义了 3 个 Kafka 服务(kafka1/kafka2/kafka3),核心特征:
- 运行模式:Kraft 模式(KAFKA_ENABLE_KRAFT=yes),替代传统的 ZooKeeper 依赖,使用 Raft 协议管理集群元数据
- 节点角色:每个节点同时承担 broker(消息存储 / 转发)和 controller(集群管控)角色(适合单服务器部署多节点集群)
- 网络模式:host(容器直接使用宿主机网络,无需端口映射,端口直接绑定到宿主机)
- 数据持久化:每个节点的数据目录挂载到宿主机本地,避免容器删除后数据丢失
- 重启策略:unless-stopped(除非手动停止,否则容器异常退出后自动重启)
4. 启动 Kafka 集群
在docker-compose.yml所在目录执行以下命令启动集群:
# 启动kafka集群服务
docker-compose up -d
5. 查看集群启动状态
启动后可通过以下命令查看容器状态和日志,验证集群是否正常启动:
# 查看容器运行状态
docker-compose ps
# 查看单个节点日志(以kafka1为例)
docker logs -f kafka1
日志中无报错、出现started (kafka.server.KafkaServer)相关信息,说明节点启动成功。

三、集群验证
1. 进入容器创建测试 Topic
# 进入kafka1容器
docker exec -it kafka1 /bin/bash
# 创建Topic(副本数3,分区数3)
kafka-topics.sh –create –topic test_topic –bootstrap-server 192.168.119.5:9192 –partitions 3 –replication-factor 3
# 查看Topic信息
kafka-topics.sh –describe –topic test_topic –bootstrap-server 192.168.119.5:9192
2. 发送 / 消费测试消息
# 启动生产者发送消息
kafka-console-producer.sh –topic test_topic –bootstrap-server 192.168.119.5:9192
# 另开终端进入容器,启动消费者接收消息
docker exec -it kafka1 /bin/bash
kafka-console-consumer.sh –topic test_topic –from-beginning –bootstrap-server 192.168.119.5:9192
生产者输入消息后,消费者能正常接收,说明集群功能正常。
四、注意事项
- 避免使用host网络模式,改用自定义网络并配置端口映射;
- 调整目录权限(避免 777),增加身份认证和加密(禁用 PLAINTEXT 监听器);
- 分离 controller 和 broker 角色,提升集群稳定性;
- 分离 controller 和 broker 角色,提升集群稳定性;


