不废话,直接开干
Windows 上安装 Apache Kafka 3.9.1 Kraft 模式 - 带详细注释
第一部分:环境准备
1.1 下载正确的 Kafka 版本(编译版本)
# 初学者应该下载二进制版本,不是源代码版本
# 下载: kafka_2.13-3.9.1.tgz (Scala 2.13 版本)
# 下载地址: https://kafka.apache.org/downloads
1.2 安装 Java
# 检查 Java 是否安装
java -version
# Kafka 3.9.1 支持 Java 8, 11, 17, 21
# 推荐使用 Java 17 (最稳定)
1.3 解压和目录结构
C:\kafka_2.13-3.9.1\
├── bin/ # 执行脚本
│ └── windows/ # Windows 专用脚本
├── config/ # 配置文件
│ └── kraft/ # Kraft 模式专用配置
├── libs/ # 依赖的库文件
└── logs/ # 日志目录(稍后创建)
第二部分:详细安装步骤
2.1 设置环境变量
@echo off
:: =============================================
:: 环境变量设置(临时,只在当前命令行有效)
:: =============================================
:: KAFKA_HOME: 指向 Kafka 安装目录
set KAFKA_HOME=C:\kafka_2.13-3.9.1
:: 将 Kafka 的 bin 目录添加到 PATH,这样可以直接运行 kafka-*.bat 命令
set PATH=%KAFKA_HOME%\bin\windows;%PATH%
:: 切换到 Kafka 目录
cd /d %KAFKA_HOME%
echo 环境变量设置完成!
2.2 生成集群 ID
@echo off
:: =============================================
:: 生成 Kafka 集群的唯一标识符
:: =============================================
:: 每个 Kafka 集群都需要一个唯一的集群ID
:: 这个ID用于区分不同的Kafka集群
echo 正在生成集群ID...
kafka-storage.bat random-uuid
:: 输出示例: 5J7j4XyXTmyuNh6RkrzKgQ
:: 复制这个ID,稍后配置会用到
pause
2.3 详细配置说明
创建 config/kraft/server.properties 文件,以下是逐行详细注释:
##################################################
# Kafka Kraft 模式核心配置 - 详细注释版
##################################################
# ======================== 节点角色配置 ========================
# process.roles: 定义此节点的角色
# broker - 消息代理,处理生产/消费请求
# controller - 集群控制器,管理元数据和领导选举
# 在Kraft模式下,节点可以同时担任两种角色(测试单机环境可配置在一起)
process.roles=broker,controller
# node.id: 节点的唯一标识符
# - 必须在集群中唯一
# - 推荐从1开始编号
node.id=1
# ======================== 集群投票者配置 ========================
# controller.quorum.voters: 定义控制器集群的成员
# 格式:nodeid@host:port,nodeid@host:port,...
# 说明:这里配置的是节点ID@地址:端口,不是集群ID!
# 格式: nodeid1@host1:port1,nodeid2@host2:port2,...
# 这里我们使用单个节点: 节点1监听localhost的9093端口
controller.quorum.voters=1@localhost:9093
# ======================== 网络监听配置 ========================
# listeners: 定义Kafka监听的网络接口和协议
# PLAINTEXT://:9092 - 客户端连接端口(生产/消费)
# CONTROLLER://:9093 - 控制器间通信端口
listeners=PLAINTEXT://:9092,CONTROLLER://:9093
# advertised.listeners: 对外公告的地址
# 客户端实际连接时使用的地址
# 在生产环境中应该设置为服务器的真实IP或域名
advertised.listeners=PLAINTEXT://localhost:9092
# ======================== 数据存储配置 ========================
# log.dirs: Kafka数据日志的存储目录
# - 可以配置多个目录用逗号分隔
# - 数据包括消息、偏移量、主题配置等
log.dirs=C:/kafka_2.13-3.9.1/logs
# ======================== 控制器专用配置 ========================
# controller.listener.names: 控制器监听器名称
# 指定哪个监听器用于控制器通信
controller.listener.names=CONTROLLER
# ======================== Broker 通信配置 ========================
# inter.broker.listener.name: Broker间通信使用的监听器
# 在多个Broker的集群中,它们之间使用这个监听器通信
inter.broker.listener.name=PLAINTEXT
# ======================== 日志保留策略 ========================
# log.retention.hours: 消息保留时间(小时)
# 超过这个时间的消息会被自动删除
log.retention.hours=168
# log.retention.bytes: 每个分区的最大容量(字节)
# 超过这个大小会删除旧消息
# log.retention.bytes=-1
# log.segment.bytes: 日志段文件大小
# 每个日志文件的最大大小,达到后会创建新文件
log.segment.bytes=1073741824
# ======================== 主题默认配置 ========================
# num.partitions: 创建主题时的默认分区数
# 分区数影响并行处理能力
num.partitions=1
# default.replication.factor: 默认副本因子
# 在集群中每个分区的副本数量
default.replication.factor=1
# ======================== 网络和安全配置 ========================
# socket.send.buffer.bytes: 网络发送缓冲区大小
socket.send.buffer.bytes=102400
# socket.receive.buffer.bytes: 网络接收缓冲区大小
socket.receive.buffer.bytes=102400
# socket.request.max.bytes: 最大请求大小
socket.request.max.bytes=104857600
# ======================== 杂项配置 ========================
# auto.create.topics.enable: 是否自动创建主题
# 当生产或消费不存在的主题时自动创建
auto.create.topics.enable=true
# num.***work.threads: 网络线程数,处理网络请求
num.***work.threads=3
# num.io.threads: I/O线程数,处理磁盘IO
num.io.threads=8
注意:上述日志目录自行指定,后续安装过程如果出现问题,可以尝试把logs中文件清除后试一下
2.4 格式化存储目录
@echo off
:: =============================================
:: 格式化Kafka存储目录
:: =============================================
:: 这个步骤会:
:: 1. 初始化数据目录结构
:: 2. 写入集群元数据
:: 3. 准备Kafka启动所需文件
echo 正在格式化Kafka存储目录...
:: 使用之前生成的集群ID替换 YOUR_CLUSTER_ID
kafka-storage.bat format ^
--cluster-id 5J7j4XyXTmyuKgQ ^
--config .\config\kraft\server.properties
if %errorlevel% == 0 (
echo ✅ 存储格式化成功!
) else (
echo ❌ 存储格式化失败!
pause
exit /b 1
)
2.5 启动 Kafka 服务
@echo off
:: =============================================
:: 启动Kafka服务
:: =============================================
:: 这个命令会:
:: 1. 启动Kafka broker
:: 2. 启动Kafka controller
:: 3. 开始监听客户端连接
echo 正在启动Kafka服务(Kraft模式)...
echo 监听端口: 9092 (客户端), 9093 (控制器)
echo 数据目录: C:\kafka_2.13-3.9.1\logs
echo.
echo 如果启动成功,你会看到Kafka的日志输出...
echo 按 Ctrl+C 停止服务
echo.
:: 启动Kafka服务器
kafka-server-start.bat .\config\kraft\server.properties
问题1
- 提示Kafka Wmic不是内部或外部命令。
- wmic从Windows10 21H1开始已弃用(windows服务中开启也不行)。因此直接修改kafka-server-start.bat文件
-
最终解决办法
第三部分:测试和验证
3.1 创建测试脚本 test-kafka.bat
@echo off
setlocal
set KAFKA_HOME=C:\kafka_2.13-3.9.1
set BROKER=localhost:9092
echo ========================================
echo Kafka 3.9.1 功能测试脚本
echo ========================================
echo 步骤1: 创建测试主题...
kafka-topics.bat --create ^
--topic test-topic ^
--bootstrap-server %BROKER% ^
--partitions 1 ^
--replication-factor 1
echo.
echo 步骤2: 列出所有主题...
kafka-topics.bat --list --bootstrap-server %BROKER%
echo.
echo 步骤3: 查看主题详情...
kafka-topics.bat --describe --topic test-topic --bootstrap-server %BROKER%
echo.
echo ========================================
echo 测试完成!
echo ========================================
echo 接下来你可以:
echo 1. 生产消息: kafka-console-producer.bat --topic test-topic --bootstrap-server %BROKER%
echo 2. 消费消息: kafka-console-consumer.bat --topic test-topic --from-beginning --bootstrap-server %BROKER%
echo.
pause
问题1
- 双击执行,闪退(网上说加pause 和 将bat文件拖拽到打开的cmd窗口也不行)
- 解决办法 在每条命令前加call
为什么需要 call?
在Windows批处理中:
直接执行: script.bat - 控制权会转移到新脚本,不会返回
使用call: call script.bat - 会执行完子脚本后返回到主脚本继续执行
3.2 生产消息测试
@echo off
:: =============================================
:: 生产消息测试
:: =============================================
:: 这个脚本启动一个控制台生产者
:: 你可以输入消息,它们会被发送到Kafka
echo 启动消息生产者...
echo 输入消息并按回车发送
echo 按 Ctrl+C 退出
echo.
kafka-console-producer.bat ^
--topic test-topic ^
--bootstrap-server localhost:9092
3.3 消费消息测试
@echo off
:: =============================================
:: 消费消息测试
:: =============================================
:: 这个脚本启动一个控制台消费者
:: 它会显示指定主题的所有消息
echo 启动消息消费者...
echo 正在监听 test-topic 主题的消息...
echo 按 Ctrl+C 退出
echo.
kafka-console-consumer.bat ^
--topic test-topic ^
--from-beginning ^
--bootstrap-server localhost:9092
第四部分:完整自动化安装脚本
创建 install-kafka-***plete.bat:
@echo off
setlocal EnableDelayedExpansion
echo =============================================
echo Kafka 3.9.1 Kraft 模式完整安装脚本
echo =============================================
:: 配置变量
set KAFKA_HOME=C:\kafka_2.13-3.9.1
set CONFIG_FILE=%KAFKA_HOME%\config\kraft\server.properties
:: 步骤1: 环境检查
echo [1/6] 检查环境...
java -version >nul 2>&1
if errorlevel 1 (
echo ❌ 错误: 未找到Java,请先安装Java
pause
exit /b 1
)
if not exist "%KAFKA_HOME%" (
echo ❌ 错误: Kafka目录不存在: %KAFKA_HOME%
pause
exit /b 1
)
:: 步骤2: 生成集群ID
echo [2/6] 生成集群ID...
cd %KAFKA_HOME%
for /f "tokens=*" %%i in ('kafka-storage.bat random-uuid') do set CLUSTER_ID=%%i
echo ✅ 集群ID: !CLUSTER_ID!
:: 步骤3: 创建日志目录
echo [3/6] 创建日志目录...
if not exist "%KAFKA_HOME%\logs" mkdir "%KAFKA_HOME%\logs"
:: 步骤4: 格式化存储
echo [4/6] 格式化存储目录...
kafka-storage.bat format --cluster-id !CLUSTER_ID! --config !CONFIG_FILE!
if errorlevel 1 goto :error
:: 步骤5: 创建管理脚本
echo [5/6] 创建管理脚本...
:: 创建启动脚本
echo @echo off > "%KAFKA_HOME%\start-kafka.bat"
echo echo 启动Kafka Kraft模式... >> "%KAFKA_HOME%\start-kafka.bat"
echo cd /d "%KAFKA_HOME%" >> "%KAFKA_HOME%\start-kafka.bat"
echo kafka-server-start.bat config\kraft\server.properties >> "%KAFKA_HOME%\start-kafka.bat"
:: 创建停止脚本
echo @echo off > "%KAFKA_HOME%\stop-kafka.bat"
echo echo 停止Kafka... >> "%KAFKA_HOME%\stop-kafka.bat"
echo taskkill /f /im java.exe /t ^>nul 2^>^&1 >> "%KAFKA_HOME%\stop-kafka.bat"
echo echo Kafka已停止 >> "%KAFKA_HOME%\stop-kafka.bat"
echo pause >> "%KAFKA_HOME%\stop-kafka.bat"
:: 步骤6: 完成
echo [6/6] 安装完成!
echo.
echo =============================================
echo ✅ Kafka 3.9.1 安装成功!
echo =============================================
echo.
echo 管理命令:
echo 启动Kafka: start-kafka.bat
echo 停止Kafka: stop-kafka.bat
echo 测试功能: test-kafka.bat
echo.
echo 集群ID: !CLUSTER_ID!
echo 客户端端口: 9092
echo 控制器端口: 9093
echo.
pause
exit /b 0
:error
echo.
echo ❌ 安装过程中出现错误
echo 请检查:
echo 1. Java是否正确安装
echo 2. 端口9092,9093是否被占用
echo 3. 是否有文件写入权限
echo.
pause
exit /b 1
第五部分:重要概念解释
Kraft 模式 vs ZooKeeper 模式
| 特性 | Kraft 模式 | ZooKeeper 模式 |
|---|---|---|
| 架构 | 内置元数据管理 | 需要外部ZooKeeper |
| 部署 | 更简单,单进程 | 需要部署两个系统 |
| 性能 | 更好,减少网络跳转 | 额外的网络开销 |
| 运维 | 更简单 | 需要维护两个系统 |
关键端口说明
- 9092: 客户端端口(生产/消费消息)
- 9093: 控制器端口(集群管理)
- 确保防火墙允许这些端口
其他
上述命令中出现了 ^ 符号,简单解释下:
^ 符号在 Windows 批处理中是一个续行符(line continuation character)。
推开窗,是别人的车马喧嚣;关上门,才是自家的月光皎洁。在属于自己的节奏里泡茶、读书、慢慢行走,力量,自会在不言中生长。 耐得寂寞蓄力气,终有一朝破土鸣。