单节点部署 Kafka Kraft 集群

文章目录

  • [单节点部署 Kafka Kraft 集群](#单节点部署 Kafka Kraft 集群)
    • 一、部署前提
    • 二、部署步骤
      • [1. 创建数据目录](#1. 创建数据目录)
      • [2. 编写 Docker Compose 配置文件](#2. 编写 Docker Compose 配置文件)
      • [3. 核心配置说明](#3. 核心配置说明)
      • [4. 启动 Kafka 集群](#4. 启动 Kafka 集群)
      • [5. 查看集群启动状态](#5. 查看集群启动状态)
    • 三、集群验证
      • [1. 进入容器创建测试 Topic](#1. 进入容器创建测试 Topic)
      • [2. 发送 / 消费测试消息](#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 数据持久化目录,避免容器删除后数据丢失,并赋予目录足够的权限:

文件目录创建:

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

生产者输入消息后,消费者能正常接收,说明集群功能正常。

四、注意事项

  1. 本文为测试环境配置,生产环境需调整:
    • 避免使用host网络模式,改用自定义网络并配置端口映射;
    • 调整目录权限(避免 777),增加身份认证和加密(禁用 PLAINTEXT 监听器);
    • 分离 controller 和 broker 角色,提升集群稳定性;
  2. KAFKA_CFG_NODE_ID必须唯一,端口号需避免冲突;
  3. 集群 ID(KAFKA_KRAFT_CLUSTER_ID)所有节点需保持一致,否则集群无法正常组网;
    目录权限(避免 777),增加身份认证和加密(禁用 PLAINTEXT 监听器);
    • 分离 controller 和 broker 角色,提升集群稳定性;
  4. KAFKA_CFG_NODE_ID必须唯一,端口号需避免冲突;
  5. 集群 ID(KAFKA_KRAFT_CLUSTER_ID)所有节点需保持一致,否则集群无法正常组网;
  6. 若需修改宿主机 IP,需同步替换配置中所有192.168.119.5为新 IP。
相关推荐
LF3_2 小时前
Centos7,KRaft模式单机模拟Kafka集群
分布式·kafka·集群·kraft
七夜zippoe2 小时前
分布式事务解决方案(二) 消息队列实现最终一致性
java·kafka·消息队列·rocketmq·2pc
Knight_AL2 小时前
深入理解:RabbitMQ 中的 ACK / NACK 有什么区别?
分布式·rabbitmq
oMcLin2 小时前
如何在Debian 10上配置并调优Apache Kafka集群,支持电商平台的大规模订单处理和消息流管理?
kafka·debian·apache
七夜zippoe2 小时前
RabbitMQ与Celery深度集成:构建高性能Python异步任务系统
分布式·python·rabbitmq·celery·amqp
斯文by累2 小时前
Ubuntu系统上安装Kafka 8.0
linux·ubuntu·kafka
sunnyday04263 小时前
深入理解分布式锁:基于Redisson的多样化锁实现
spring boot·redis·分布式
txinyu的博客11 小时前
解析业务层的key冲突问题
开发语言·c++·分布式
qq_3181215918 小时前
Java大厂面试故事:Spring Boot、微服务与AI场景深度解析
java·spring boot·redis·微服务·ai·kafka·spring security