环境准备与安装
定义与作用
在安装 Kafka 之前,需要准备好运行环境。本节涵盖 JDK 版本检查、Kafka 下载与解压、关键配置文件介绍。面向 Linux 环境(Windows 用户建议使用 WSL2)。
核心原理
Kafka 3.x 支持两种模式启动:ZooKeeper 模式(传统)与 KRaft 模式(新,生产就绪)。本教程使用 KRaft 模式,因为它无需额外部署 ZooKeeper,单机搭建更简单,也是 Kafka 未来的默认模式。
KRaft 模式下,Kafka 集群将元数据存储在内部 Topic @metadata 中,通过 Raft 协议在 Controller 节点间达成一致。单机场景下只需要一个节点同时承担 Broker 和 Controller 角色。
完整示例
示例一:环境检查与 Kafka 下载
操作前环境:干净的 Linux 服务器(Ubuntu 22.04)。
步骤:
# 1. 检查 Java 版本(Kafka 3.x 要求 Java 11+)
java -version
# openjdk version "17.0.9" 2023-10-17
# OpenJDK Runtime Environment (build 17.0.9+9-Ubuntu-122.04)
# ✅ 满足要求
# 2. 若未安装 Java 17
# sudo apt update && sudo apt install openjdk-17-jdk -y
# 3. 下载 Kafka(以 3.6.0 为例)
wget https://archive.apache.org/dist/kafka/3.6.0/kafka_2.13-3.6.0.tgz
# 4. 解压到 /opt
sudo tar -xzf kafka_2.13-3.6.0.tgz -C /opt
sudo ln -s /opt/kafka_2.13-3.6.0 /opt/kafka
# 5. 配置环境变量(可选,方便后续使用)
echo 'export KAFKA_HOME=/opt/kafka' >> ~/.bashrc
echo 'export PATH=$PATH:$KAFKA_HOME/bin' >> ~/.bashrc
source ~/.bashrc
操作后环境:
| 项 | 状态 |
|---|---|
| Java | 17.0.9 |
| Kafka Home | /opt/kafka |
| 核心脚本路径 | /opt/kafka/bin/ |
| 配置路径 | /opt/kafka/config/ |
示例二:KRaft 模式初始化
场景:首次安装 Kafka 3.x,使用 KRaft 模式生成集群 ID 并格式化存储目录。
操作前环境:Kafka 已解压但未初始化。
步骤:
cd /opt/kafka
# 1. 生成集群唯一 ID
KAFKA_CLUSTER_ID=$(bin/kafka-storage.sh random-uuid)
echo "Cluster ID: $KAFKA_CLUSTER_ID"
# Cluster ID: a7Bx9YqL3mNk2RvW5tP1eU
# 2. 格式化存储目录(使用 KRaft 配置)
bin/kafka-storage.sh format \
--cluster-id $KAFKA_CLUSTER_ID \
--config config/kraft/server.properties
# Formatting /tmp/kraft-combined-logs
# 3. 验证存储目录已生成
ls /tmp/kraft-combined-logs/
# __cluster_metadata-0 bootstrap.checkpoint meta.properties
操作后对比:
| 操作前 | 操作后 |
|---|---|
/tmp/kraft-combined-logs 不存在 | 包含 meta.properties(存 Cluster ID)、__cluster_metadata-0(元数据日志段) |
关键配置文件说明
config/kraft/server.properties 关键参数:
# Broker 唯一标识(单机用默认值即可)
node.id=1
# 监听地址(PLAINTEXT 无加密,本地开发用)
listeners=PLAINTEXT://:9092
# 日志存储目录
log.dirs=/tmp/kraft-combined-logs
# Controller 仲裁地址
controller.quorum.voters=1@localhost:9093
# 此节点同时承担 Broker 和 Controller
process.roles=broker,controller
| 参数 | 说明 | 生产环境注意 |
|---|---|---|
node.id | 节点唯一标识,集群中必须不重复 | 每个节点不同 |
listeners | Broker 监听协议和端口 | 内网用 PLAINTEXT,外网加 SSL |
log.dirs | 消息数据存储路径 | 生产环境用 SSD + 多目录 |
process.roles | 节点角色 | 生产环境建议分离 Broker 和 Controller |
易错场景
易错 1:Java 版本过低
现象:
Error: A JNI error has occurred, please check your installation
Exception in thread "main" java.lang.UnsupportedClassVersionError
原因:Kafka 3.x 需要 Java 11+,如果机器上有 Java 8,会出现此错误。
解决:安装 Java 11+ 并通过 update-alternatives 切换到正确版本。
易错 2:存储目录权限不足
现象:
ERROR Failed to format storage directory
java.nio.file.AccessDeniedException: /tmp/kraft-combined-logs
解决:确保当前用户对 log.dirs 配置的路径有读写权限。/tmp 通常允许所有用户写入,如用其他路径需检查权限。
面试高频考点
Q:KRaft 模式相比 ZooKeeper 模式有什么优势?
A:
- 架构简化 — 不再需要单独部署和运维 ZooKeeper 集群
- 元数据一致性更强 — Raft 协议比 ZooKeeper 的 ZAB 协议在元数据管理上更高效
- 分区数上限提升 — KRaft 模式下可支持百万级分区(ZooKeeper 模式受限于 ZK 节点数)
- 故障恢复更快 — Controller 切换时间从数十秒缩短到数秒