【Kafka源码解读和使用指南】第02篇:手把手搭建Kafka开发环境——Win/Mac/Linux三平台全攻略

【Kafka源码解读和使用指南】第02篇:手把手搭建Kafka开发环境——Win/Mac/Linux三平台全攻略 上一篇【第01篇】Kafka是什么——从LinkedIn的救火队到全球消息中间件之王下一篇【第03篇】Kafka核心概念图解——Topic、Partition、Offset、Broker一次看懂摘要上回书说到Kafka是LinkedIn工程师在数据管道危机中搓出的救火神器。光说不练假把式这一篇咱们就撸起袖子把Kafka真真切切地跑到自己电脑上。本文将覆盖Windows、macOS和Linux三大平台的安装全流程。从JDK环境准备到下载解压Kafka再到核心配置文件详解最后用一条命令验证服务启动成功。特别地我们会重点介绍Kafka 3.3引入的KRaft模式——它让你彻底告别ZooKeeper这个额外包袱单进程就能跑起一个完整的Kafka服务对学习和开发环境来说简直是福音。读完这篇你的电脑上将有一个正在运行的Kafka实例可以收发消息——这将是后续所有实战和源码分析的基础。一、前置准备JDK的安装与配置Kafka是用Java和Scala写的所以JDK是硬性依赖。不同版本的Kafka对JDK版本要求不同Kafka版本最低JDK版本推荐JDK版本Kafka 2.xJDK 8JDK 11Kafka 3.0~3.6JDK 8JDK 17Kafka 3.7 / 4.xJDK 11JDK 17 或 JDK 21注意从Kafka 3.0开始官方逐步移除了对JDK 8的支持。如果你用的是Kafka 3.7请至少装JDK 11。1.1 Windows 平台安装 JDK1. 打开浏览器访问 https://adoptium.net/ Eclipse Temurin开源免费 2. 下载 JDK 17或JDK 21的 Windows x64 MSI安装包 3. 双击安装一路Next建议安装路径不要带空格如 C:\Java\jdk-17 4. 安装完验证# 打开PowerShell或CMD输入java-version# 输出类似# openjdk version 17.0.9 2023-10-17# OpenJDK Runtime Environment Temurin-17.0.99 (build 17.0.99)# OpenJDK 64-Bit Server VM Temurin-17.0.99 (build 17.0.99, mixed mode, sharing)# 如果提示 java 不是内部命令需要设置环境变量# 1. 右键此电脑 → 属性 → 高级系统设置 → 环境变量# 2. 新建系统变量JAVA_HOME C:\Java\jdk-17# 3. 编辑Path变量新增%JAVA_HOME%\bin# 4. 重新打开CMD再试 java -version1.2 macOS 平台安装 JDKmacOS上推荐用Homebrew一行命令搞定# 如果没有Homebrew先去 https://brew.sh 安装# 装完Homebrew后brewinstallopenjdk17# 创建软链接让系统识别sudoln-sfn/opt/homebrew/opt/openjdk17/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-17.jdk# 验证java-version或者从 adoptium.net 下载 .pkg 安装包双击安装即可。1.3 Linux 平台安装 JDK以Ubuntu/Debian为例# 更新软件源sudoaptupdate# 安装 JDK 17sudoaptinstallopenjdk-17-jdk-y# 验证java-version以CentOS/RHEL为例sudoyuminstalljava-17-openjdk-devel-yjava-version二、下载 Kafka前往 Apache Kafka 官网下载https://kafka.apache.org/downloads选择版本建议场景推荐版本理由学习/开发Kafka 3.9.x 或 4.0.x最新稳定版支持KRaft无需ZooKeeper生产环境Kafka 3.6.x ~ 3.9.x经过广泛验证追源码Kafka 3.6.0与《Apache Kafka源码剖析》匹配度较高本文以 Kafka 3.9.0 为例# Linux/macOSwgethttps://downloads.apache.org/kafka/3.9.0/kafka_2.13-3.9.0.tgztar-xzfkafka_2.13-3.9.0.tgzcdkafka_2.13-3.9.0# Windows用PowerShell# 1. 浏览器下载 kafka_2.13-3.9.0.tgz# 2. 用7-Zip或WinRAR解压到 C:\kafka# 3. PowerShell进入目录cdC:\kafka\kafka_2.13-3.9.0文件名解读kafka_2.13-3.9.0.tgz中2.13是Scala版本3.9.0是Kafka版本。Kafka用Scala编写不同Scala版本的Kafka性能略有差异但功能完全一致。解压后的目录结构kafka_2.13-3.9.0/ ├── bin/ # 启动脚本和命令行工具.sh for Linux/Mac, .bat for Windows │ ├── kafka-server-start.sh │ ├── kafka-topics.sh │ ├── kafka-console-producer.sh │ ├── kafka-console-consumer.sh │ └── ... ├── config/ # 配置文件我们主要改这里的文件 │ ├── server.properties │ ├── kraft/ │ │ └── server.properties # KRaft模式专用配置 │ ├── consumer.properties │ └── producer.properties ├── libs/ # Kafka依赖的所有jar包 ├── logs/ # 默认日志输出目录 └── LICENSE, NOTICE...三、KRaft模式启动 Kafka推荐Kafka从3.3.1版本开始KRaftKafka Raft模式正式进入生产可用状态。对于学习和开发环境KRaft模式是绝对的首选——你不再需要先启动ZooKeeper再启动Kafka一个进程搞定一切。3.1 KRaft 模式与传统 ZooKeeper 模式对比传统 ZooKeeper 模式 ┌──────────┐ ┌──────────┐ ┌──────────┐ │ ZooKeeper│ │ ZooKeeper│ │ ZooKeeper│ ← 3个ZK节点选举用 └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │ │ └───────────────┼───────────────┘ │ ┌───────────────┼───────────────┐ │ │ │ ┌────▼─────┐ ┌────▼─────┐ ┌────▼─────┐ │ Broker │ │ Broker │ │ Broker │ ← Kafka节点 └──────────┘ └──────────┘ └──────────┘ 至少4个进程维护复杂 KRaft 模式Kafka 3.3 ┌──────────────────────────────┐ │ Kafka (Controller Broker) │ ← 自带Raft共识 │ 内嵌 Raft 元数据管理 │ 无需外部依赖 └──────────────────────────────┘ 单进程即可运行清爽3.2 第一步生成集群ID# Linux/macOSbin/kafka-storage.sh random-uuid# 输出类似7XcG9ZT4SoO0h5KjR8vBkQ# Windows PowerShell.\bin\windows\kafka-storage.bat random-uuid# 输出类似7XcG9ZT4SoO0h5KjR8vBkQ把这串UUID记下来下一步要用。3.3 第二步格式化存储目录# Linux/macOS用上一步生成的UUIDbin/kafka-storage.shformat\-t你的UUID\-cconfig/kraft/server.properties# Windows PowerShell.\bin\windows\kafka-storage.batformat-t你的UUID-cconfig\kraft\server.properties格式化成功后你会看到Formatting /tmp/kraft-combined-logs with metadata.version 3.9-IV03.4 第三步启动Kafka# Linux/macOSbin/kafka-server-start.sh config/kraft/server.properties# Windows PowerShell.\bin\windows\kafka-server-start.bat config\kraft\server.properties如果一切顺利你会看到大量日志输出最后几行类似[2026-05-30 10:00:00,123] INFO Kafka version: 3.9.0 (org.apache.kafka.common.utils.AppInfoParser) [2026-05-30 10:00:00,456] INFO Kafka startTimeMs: 1717056000456 (org.apache.kafka.server.KafkaServer) [2026-05-30 10:00:01,789] INFO [KafkaRaftServer nodeId1] Kafka Server started (kafka.server.KafkaRaftServer)Windows用户注意如果启动报错提示找不到JAVA_HOME或java命令请确保JDK已正确安装且PATH中包含%JAVA_HOME%\bin然后重启PowerShell再试。3.5 验证创建一个Topic并收发消息留着一个终端窗口跑Kafka新开一个终端来验证# Step 1: 创建一个测试Topic# Linux/macOSbin/kafka-topics.sh--create\--topichello-kafka\--bootstrap-server localhost:9092\--partitions3\--replication-factor1# Windows PowerShell.\bin\windows\kafka-topics.bat--create--topichello-kafka--bootstrap-server localhost:9092--partitions3--replication-factor1# 输出Created topic hello-kafka.# Step 2: 启动一个生产者发送消息# Linux/macOSbin/kafka-console-producer.sh\--topichello-kafka\--bootstrap-server localhost:9092# Windows PowerShell.\bin\windows\kafka-console-producer.bat--topichello-kafka--bootstrap-server localhost:9092# 此时终端进入交互模式逐行输入消息Hello Kafka!你好消息队列This is my first message.(按 CtrlC 退出)# Step 3: 新开第三个终端启动一个消费者# Linux/macOSbin/kafka-console-consumer.sh\--topichello-kafka\--from-beginning\--bootstrap-server localhost:9092# Windows PowerShell.\bin\windows\kafka-console-consumer.bat--topichello-kafka--from-beginning --bootstrap-server localhost:9092如果消费者终端打印出了刚才发送的三条消息恭喜你Kafka已经成功跑起来了四、KRaft模式核心配置文件详解文件路径config/kraft/server.properties。以下是最关键的参数# Broker 身份 # 集群唯一ID单节点填1即可 node.id1 # 控制器负责选举和元数据管理的角色定义 # broker仅作为数据节点 # controller仅作为控制器节点生产环境推荐独立部署 # broker,controller同时承担两个角色开发环境用这个 process.rolesbroker,controller # 控制器选举时的仲裁节点列表 # 格式node.idhost:port # 单节点只需配自己 controller.quorum.voters1localhost:9093 # 网络配置 # 监听器定义Kafka绑定的地址和端口 # 格式协议名://主机名:端口 # PLAINTEXT表示不加密生产环境建议用SSL listenersPLAINTEXT://:9092,CONTROLLER://:9093 # 对外通告的地址客户端连接用 # 如果不设置默认用listeners中配置的地址 advertised.listenersPLAINTEXT://localhost:9092 # 协议与监听器的映射关系 listener.security.protocol.mapPLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT # 存储配置 # 日志数据存储目录建议用SSD log.dirs/tmp/kraft-combined-logs # 每个Topic默认的分区数 num.partitions1 # 每个分区的默认副本数单节点只能设为1 default.replication.factor1 # 日志保留策略 # 日志保留时间小时默认168小时7天 log.retention.hours168 # 或按大小保留 # log.retention.bytes1073741824 # 1GB # 单个日志段文件大小上限字节默认1GB log.segment.bytes1073741824 # ZooKeeper相关KRaft模式不需要 # zookeeper.connectlocalhost:2181 ← 已废弃无需配置关键参数速查表参数默认值说明开发环境建议node.id无Broker唯一标识设为1process.roles无节点角色broker,controllerlistenersPLAINTEXT://:9092监听地址保持默认log.dirs/tmp/kraft-combined-logs日志目录改为非/tmp路径num.partitions1默认分区数开发环境设为1或3log.retention.hours168日志保留时间开发环境可缩短五、传统 ZooKeeper 模式启动如果需要虽然KRaft是大势所趋但如果你用的是Kafka 3.3之前的版本或者公司还在用ZK模式这里也给出步骤5.1 启动 ZooKeeper# Linux/macOSbin/zookeeper-server-start.sh config/zookeeper.properties# Windows PowerShell.\bin\windows\zookeeper-server-start.bat config\zookeeper.properties5.2 启动 Kafka Broker# 新开终端ZooKeeper需要先跑起来# Linux/macOSbin/kafka-server-start.sh config/server.properties# Windows PowerShell.\bin\windows\kafka-server-start.bat config\server.properties5.3 ZooKeeper vs KRaft 选择建议哪些场景还可能需要ZK ├── 老项目维护Kafka 2.x 必须用ZK ├── 公司遗留集群暂时没计划升级 └── 某些云厂商托管Kafka可能还在用ZK 哪些场景果断用KRaft ├── 新项目从Kafka 3.3开始用KRaft ├── 学习开发KRaft单进程更方便 ├── 容器化部署减少一个ZK容器依赖 └── 性能敏感KRaft控制器故障恢复比ZK快六、系统服务化让Kafka后台运行开发中每次手动启动Kafka比较烦可以做成系统服务。6.1 Linux systemd 服务sudovim/etc/systemd/system/kafka.service[Unit] DescriptionApache Kafka Afternetwork.target [Service] Typesimple Userkafka ExecStart/opt/kafka/bin/kafka-server-start.sh /opt/kafka/config/kraft/server.properties ExecStop/opt/kafka/bin/kafka-server-stop.sh Restarton-failure RestartSec10 [Install] WantedBymulti-user.targetsudosystemctl daemon-reloadsudosystemctlenablekafkasudosystemctl start kafkasudosystemctl status kafka6.2 macOS launchd 服务# 创建 plist 文件vim~/Library/LaunchAgents/com.kafka.server.plist# 内容略可参考brew services模式# 或者简单用 nohup nohupbin/kafka-server-start.sh config/kraft/server.propertieskafka.log216.3 Windows 后台运行# 方法1用PowerShell的后台JobStart-Job-ScriptBlock{Set-LocationC:\kafka\kafka_2.13-3.9.0.\bin\windows\kafka-server-start.bat config\kraft\server.properties}# 方法2创建一个快捷方式配置运行方式: 最小化# 方法3用NSSMNon-Sucking Service Manager注册为Windows服务七、常见踩坑与解决方案7.1 “Address already in use” 端口被占用错误信息java.net.BindException: Address already in use 原因9092客户端或9093控制器端口已被占用 解决 # 查看占用端口的进程Linux/Mac lsof -i :9092 # 或换一个端口 # 修改 listenersPLAINTEXT://:9094 然后再启动7.2 “The Cluster ID doesn’t match” KRaft格式化问题错误信息The Cluster ID xxx doesnt match stored clusterId yyy 原因之前格式化过现在用了不同的cluster-id 解决删除 log.dirs 目录重新格式化 rm -rf /tmp/kraft-combined-logs bin/kafka-storage.sh format -t UUID -c config/kraft/server.properties7.3 Windows下路径过长问题错误信息The filename or extension is too long 原因Kafka日志目录嵌套太深Windows路径长度超过260字符限制 解决 1. 把log.dirs改到短路径如 C:\kafka-data 2. 或者启用Windows的长路径支持注册表修改 组策略7.4 “Kafka Server started” 但消费者连不上现象生产者/消费者报 Connection refused 或 timeout 排查 1. 检查 advertised.listeners 是否正确配置 2. 检查防火墙是否阻止了9092端口 3. 如果Kafka部署在虚拟机/Docker里确保 advertised.listeners 配置了宿主机IP而非localhost本篇小结本文我们从零开始在Windows/macOS/Linux三大平台上完成了Kafka的安装部署JDK是基石——装好JDK 17是后续所有操作的前提KRaft模式真香——一行格式化、一行启动告别ZooKeeper的复杂运维关键配置心中有数——listeners控制网络、log.dirs控制存储、process.roles控制角色三端验证通过了创建Topic → 生产者发消息 → 消费者收消息Kafka已就绪系统服务化让Kafka开机自启不用每次手动敲命令现在你的电脑上有一个正在运行的Kafka实例。下一篇文章我们将深入Kafka的核心概念——Topic、Partition、Offset、Broker、Consumer Group把Kafka的世界观彻底搞懂。上一篇【第01篇】Kafka是什么——从LinkedIn的救火队到全球消息中间件之王下一篇【第03篇】Kafka核心概念图解——Topic、Partition、Offset、Broker一次看懂