文章目录
- [单节点部署 Kafka Kraft 集群](#单节点部署 Kafka Kraft 集群)
单节点部署 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 数据持久化目录,避免容器删除后数据丢失,并赋予目录足够的权限:
文件目录创建:
bash
mkdir kafka/
mkdir -p ./kafka/broker1 ./kafka/broker2 ./kafka/broker3
chmod -R 777 ./kafka/
2. 编写 Docker Compose 配置文件
在 kafka 目录下创建docker-compose.yml文件,内容如下:
bash
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所在目录执行以下命令启动集群:
bash
# 启动kafka集群服务
docker-compose up -d
5. 查看集群启动状态
启动后可通过以下命令查看容器状态和日志,验证集群是否正常启动:
bash
# 查看容器运行状态
docker-compose ps
# 查看单个节点日志(以kafka1为例)
docker logs -f kafka1
日志中无报错、出现started (kafka.server.KafkaServer)相关信息,说明节点启动成功。

三、集群验证
1. 进入容器创建测试 Topic
bash
# 进入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. 发送 / 消费测试消息
bash
# 启动生产者发送消息
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 角色,提升集群稳定性;
- 避免使用
KAFKA_CFG_NODE_ID必须唯一,端口号需避免冲突;- 集群 ID(
KAFKA_KRAFT_CLUSTER_ID)所有节点需保持一致,否则集群无法正常组网;
目录权限(避免 777),增加身份认证和加密(禁用 PLAINTEXT 监听器);- 分离 controller 和 broker 角色,提升集群稳定性;
KAFKA_CFG_NODE_ID必须唯一,端口号需避免冲突;- 集群 ID(
KAFKA_KRAFT_CLUSTER_ID)所有节点需保持一致,否则集群无法正常组网; - 若需修改宿主机 IP,需同步替换配置中所有
192.168.119.5为新 IP。