kafka3.6下载安装(传统架构/KRaft模式)+实例测试
知识补充:
Kafka 和 ZooKeeper 的关系可以用 “协作依赖” 来概括。在 Kafka 的早期版本(Kafka 2.8.0 之前)中,ZooKeeper 是 Kafka 的核心依赖,用于管理集群元数据、协调 Broker 和 Controller 选举等关键功能。但从 Kafka 3.0+ 开始,官方逐步引入了 KRaft(Kafka Raft Metadata)模式,允许 Kafka 完全脱离 ZooKeeper 独立运行。
1. ZooKeeper 在 Kafka 中的作用(传统架构)
在旧版 Kafka(依赖 ZooKeeper 的版本)中,ZooKeeper 主要负责以下任务:
(1) 集群元数据管理
-
存储 Kafka 集群的元数据,例如:
-
Broker 列表(哪些 Broker 在线/离线)
-
Topic 和 Partition 信息(Topic 的分区数量、副本分布)
-
Consumer Group 的 offset(消费进度)(旧版本由 ZooKeeper 存储,新版 Kafka 已改用内部 Topic
__consumer_offsets
)
-
(2) Controller 选举
-
Kafka 集群中的 Controller 负责管理 Partition Leader 选举、Broker 上下线等关键任务。
-
ZooKeeper 用于选举唯一的 Controller,避免脑裂(Split-Brain)问题。
(3) Broker 健康监测
-
Broker 启动时会在 ZooKeeper 注册临时节点(Ephemeral Node),如果 Broker 崩溃,ZooKeeper 会检测到并触发 Controller 重新分配 Partition。
(4) Topic 配置管理
-
存储 Topic 的配置信息(如
cleanup.policy
、retention.ms
等)。
2. Kafka 脱离 ZooKeeper(KRaft 模式)
从 Kafka 2.8.0(实验性支持) 和 Kafka 3.0+(正式生产可用) 开始,Kafka 引入了 KRaft(Kafka Raft Metadata)模式,使用 Raft 共识算法 替代 ZooKeeper,实现完全去 ZooKeeper 化:
KRaft 模式的核心变化
-
不再依赖 ZooKeeper:
-
Kafka 用自己的 Raft 协议 管理元数据,减少外部依赖。
-
降低了运维复杂度(不需要额外维护 ZooKeeper 集群)。
-
-
Controller 角色增强:
-
在 KRaft 模式下,部分 Broker 会承担 Controller 角色,使用 Raft 协议进行 Leader 选举和元数据同步。
-
-
性能提升:
-
减少了 ZooKeeper 的网络开销,元数据访问更快。
-
启动时间更短(不再需要等待 ZooKeeper 连接)。
-
-
更稳定的集群管理:
-
Raft 协议比 ZooKeeper 的 ZAB 协议更简单,减少了潜在的一致性问题。
-
3. 如何区分 Kafka 是否依赖 ZooKeeper?
特征 | 依赖 ZooKeeper 的 Kafka | KRaft 模式(无 ZooKeeper) |
---|---|---|
Kafka 版本 | < 2.8.0(必须依赖) | ≥ 2.8.0(实验性支持) ≥ 3.0(生产可用) |
配置文件 | server.properties 需要配置 zookeeper.connect | server.properties 配置 process.roles=broker,controller |
启动方式 | 需先启动 ZooKeeper | 直接启动 Kafka,无需 ZooKeeper |
元数据存储 | 存储在 ZooKeeper | 存储在 Kafka 内部 Topic(__cluster_metadata ) |
4. 如何选择?
-
如果使用 Kafka ≤ 2.8.0:必须依赖 ZooKeeper。
-
如果使用 Kafka 3.0+:
-
新集群:建议直接使用 KRaft 模式(更简单、更高效)。
-
旧集群迁移:可以从 ZooKeeper 模式逐步迁移到 KRaft。
-
5. 总结
-
传统 Kafka:强依赖 ZooKeeper,用于元数据管理、Controller 选举等。
-
现代 Kafka(KRaft):自包含元数据管理,不再需要 ZooKeeper,简化了架构。
如果你的 Kafka 版本较新(≥3.0),建议尝试 KRaft 模式,减少运维负担!
我选择的版本是Kafka 3.6.0
两种运行模式
(1) KRaft 模式(推荐,无需 ZooKeeper)
Kafka 3.6.0 默认支持 KRaft,通过 Raft 协议管理元数据,无需额外部署 ZooKeeper。
(2) ZooKeeper 模式(旧版兼容)
仍然可以使用 ZooKeeper,但官方推荐逐步迁移到 KRaft。
建议:
-
Kafka 3.6.0 默认支持 KRaft(无需 ZooKeeper),推荐新集群使用。
-
旧版兼容 ZooKeeper 模式,但未来版本可能移除。
-
启动前注意:
-
KRaft 模式需要
format
存储目录。 -
ZooKeeper 模式需先启动 ZooKeeper。
-
实验开始
一、单机kafka部署
1.下载所需kafka的tgz文件
Apache Kafka
版本看自己需要去选择
以我为例,我下载的是
(1) Scala 是什么?
Scala 是一种运行在 JVM 上的多范式编程语言,Kafka 的核心代码是用 Scala 编写的。虽然 Kafka 提供 Java API(用户无需直接使用 Scala),但其底层依赖 Scala 的运行时库。
(2)为什么 Kafka 分 Scala 2.12 和 2.13 版本?
-
历史原因:Kafka 早期用 Scala 开发,保留了多版本编译的支持。
-
兼容性:不同 Scala 版本的二进制不兼容,需匹配用户环境的依赖库(如 Spark、Flink 等可能依赖特定 Scala 版本)。
(3)选择总结
-
普通用户:直接选择
kafka_2.13-3.6.0.tgz
(推荐)。 -
大数据生态用户:根据 Spark/Flink 的 Scala 版本选择匹配的 Kafka 版本。
-
无需纠结:若不涉及 Scala 开发,版本选择对 Kafka 使用无实质影响。
选scala12还是scala13,对于本实验,其实都可以,看自己选择
注意:要有java环境!
没有的可自行配置,只需要下载jdk包上传解压缩改名然后配置环境变量即可
不会的可以参考本人博客,第二部分就是Java的安装配置
保姆级tomcat的静态页面部署(下载安装+部署)-CSDN博客
2.上传虚拟机并进行解压缩改名
我是上传在了/opt/soft的目录下,加压缩后移动到了/opt/module下面
可自行选择目录,如果想跟我一样可创建目录/opt/soft和/opt/module
3.添加kafka的环境变量如下
# 1. 编辑配置文件
vim /etc/profile
# 2. 添加以下内容(如果尚未添加)
export KAFKA_HOME=/opt/module/kafka
export PATH=$PATH:$KAFKA_HOME/bin
# 3. 加载配置
source /etc/profile
4.启动karka单机
方式 1:KRaft 模式(推荐)
(1) 生成集群 UUID
cd kafka
./bin/kafka-storage.sh random-uuid
# 输出示例:rGgTf5XkQZq5lw3Z4g7hJw
(2) 格式化存储目录
./bin/kafka-storage.sh format -t <生成的UUID> -c ./config/kraft/server.properties
(3) 启动 Kafka
./bin/kafka-server-start.sh ./config/kraft/server.properties
📌 注意:
kraft/server.properties
是 KRaft 专用配置,不再需要zookeeper.connect
。默认监听
9092
端口(普通 Broker)和9093
端口(Controller)。
方式2: 以传统模式(依赖 ZooKeeper)启动 Kafka
(1) 先启动 ZooKeeper
./bin/zookeeper-server-start.sh ./config/zookeeper.properties &
(&
表示后台运行,避免占用终端)
(2) 再启动 Kafka
./bin/kafka-server-start.sh ./config/server.properties
📌 注意:
确保
server.properties
中配置了zookeeper.connect=localhost:2181
(默认已配置)。如果启动失败,检查日志
logs/server.log
。
验证 :Kafka 是否正常运行
(1)检查 ZooKeeper 是否注册了 Kafka 节点
./bin/zookeeper-shell.sh localhost:2181 ls /brokers/ids
如果返回 [0]
或类似,表示 Broker 已注册。
(2)创建 Topic 测试
./bin/kafka-topics.sh --zookeeper localhost:2181 --create --topic test --partitions 1 --replication-factor 1
注意:
在 Kafka 3.6.0 中,--zookeeper
参数已被移除,必须改用 --bootstrap-server
:
./bin/kafka-topics.sh --bootstrap-server localhost:9092 --create --topic test --partitions 1 --replication-factor 1
(3) 列出 Topic
./bin/kafka-topics.sh --bootstrap-server localhost:9092 --list
应输出 test
。
停止当前 Kafka 服务
(1)如果是 KRaft 模式启动的 Kafka
# 查找 Kafka 进程 ID
ps aux | grep kafka | grep server.properties
# 强制停止(如果没有优雅停止脚本)
kill -9 <PID>
(2)如果是 ZooKeeper 模式启动的 Kafka
# 使用 Kafka 自带的停止脚本(如果有)
./bin/kafka-server-stop.sh
# 如果没有效果,手动停止
ps aux | grep kafka | grep server.properties
kill -9 <PID>
bash
# 停止所有 Kafka 相关进程
pkill -f 'kafka.Kafka'
(3)停止 ZooKeeper(如果正在运行)
./bin/zookeeper-server-stop.sh
# 如果无效,手动停止
ps aux | grep zookeeper
kill -9 <PID>
(4)确认进程已关闭
bash
ps aux | grep -E "kafka|zookeeper"
确保没有任何 Kafka 或 ZooKeeper 相关进程残留。