本文是大数据系列第 54 篇,介绍 Kafka 集群的安装配置,并梳理从 ZooKeeper 依赖到 KRaft 自管理模式的架构演进路径。

完整图文版(含截图):CSDN 原文 | 掘金

Kafka 版本演进概览

Kafka 2.x 主要特性

特性说明
Kafka Streams 增强支持外连接、全局表(GlobalKTable)、交互式查询
写吞吐提升日志管理系统重写,写吞吐提升约 30%
零拷贝优化进一步降低消息传输 CPU 开销
动态配置通过 AdminClient API 在线修改参数,无需重启
安全增强Kerberos 集成、ACL 细化、跨域支持

Kafka 2.x 仍依赖 ZooKeeper 管理集群元数据和 Controller 选举。

Kafka 3.x 架构转型

Kafka 3.x 是里程碑版本,最大变化是引入 KRaft(Kafka Raft)

里程碑版本说明
KRaft 预览3.0KRaft 模式可用,ZooKeeper 仍为默认
ZooKeeper 废弃3.5.xZooKeeper 标记为 Deprecated
ZooKeeper 移除4.0(计划)完全移除 ZooKeeper 依赖

KRaft 的核心改进:

  • 使用 Raft 共识算法管理集群元数据,Kafka 自身承担 Controller 功能
  • 元数据日志存储在 Kafka 内部 Topic __cluster_metadata
  • 集群启动速度大幅提升(不再需要等待 ZooKeeper 连接)
  • 支持单集群分区数从 20 万扩展至 200 万
  • 运维复杂度降低:不再需要单独维护 ZooKeeper 集群

环境准备

前置依赖

依赖版本要求说明
JavaJDK 8+Kafka 2.x 推荐 JDK 8/11
ZooKeeper3.6+Kafka 2.x 必需,3.x KRaft 模式可选
服务器3 台生产环境最低 3 节点保证高可用

节点规划示例

h121.wzk.icu  ← ZooKeeper + Kafka Broker(broker.id=1)
h122.wzk.icu  ← ZooKeeper + Kafka Broker(broker.id=2)
h123.wzk.icu  ← ZooKeeper + Kafka Broker(broker.id=3)

ZooKeeper 配置验证

在部署 Kafka 前,确认 ZooKeeper 集群正常运行:

# 配置 ZooKeeper 环境变量
vim /etc/profile

export ZOOKEEPER_HOME=/opt/servers/apache-zookeeper-3.8.4-bin
export PATH=$PATH:$ZOOKEEPER_HOME/bin

source /etc/profile

# 验证各节点状态(应有 1 个 leader,其余 follower)
zkServer.sh status

Kafka 安装步骤

1. 下载并解压

# 下载预编译二进制包(推荐,避免自行编译)
# kafka_2.12-2.7.2 表示 Scala 2.12 编译,Kafka 版本 2.7.2
tar -zxvf kafka_2.12-2.7.2.tgz
mv kafka_2.12-2.7.2 /opt/servers/

2. 配置环境变量

vim /etc/profile

# Kafka 配置
export KAFKA_HOME=/opt/servers/kafka_2.12-2.7.2
export PATH=$PATH:$KAFKA_HOME/bin

source /etc/profile

3. 配置 Broker 参数

编辑 /opt/servers/kafka_2.12-2.7.2/config/server.properties

# Broker 唯一 ID,每个节点必须不同(0、1、2...)
broker.id=1

# Broker 监听地址
listeners=PLAINTEXT://h121.wzk.icu:9092

# ZooKeeper 连接地址(所有节点保持一致)
zookeeper.connect=h121.wzk.icu:2181,h122.wzk.icu:2181,h123.wzk.icu:2181

# 消息日志存储目录
log.dirs=/var/kafka-logs

# 默认 Partition 副本数
default.replication.factor=2

# 默认 Partition 数量
num.partitions=3

# 消息保留时长(小时)
log.retention.hours=168

在所有节点创建日志目录:

mkdir -p /var/kafka-logs

对 h122、h123 重复上述配置,修改 broker.id(分别为 2、3)和 listeners 地址。

4. 分发配置到其他节点

# 将安装目录分发到其他节点
scp -r /opt/servers/kafka_2.12-2.7.2 h122.wzk.icu:/opt/servers/
scp -r /opt/servers/kafka_2.12-2.7.2 h123.wzk.icu:/opt/servers/

# 在 h122 修改 broker.id=2,在 h123 修改 broker.id=3

5. 启动 Kafka

# 前台启动(测试用)
kafka-server-start.sh /opt/servers/kafka_2.12-2.7.2/config/server.properties

# 后台守护进程启动(生产用)
kafka-server-start.sh -daemon /opt/servers/kafka_2.12-2.7.2/config/server.properties

6. 验证启动

# 查看 Kafka 进程
jps
# 输出应包含 Kafka

# 查看 ZooKeeper 中注册的 Broker
zkCli.sh -server h121.wzk.icu:2181
ls /brokers/ids
# 输出 [1, 2, 3] 表示 3 个 Broker 均正常注册

KRaft 模式部署(Kafka 3.x)

Kafka 3.x 可完全脱离 ZooKeeper 以 KRaft 模式运行:

生成集群 UUID

KAFKA_CLUSTER_ID="$(kafka-storage.sh random-uuid)"

格式化存储目录

kafka-storage.sh format -t $KAFKA_CLUSTER_ID \
  -c /opt/servers/kafka_3.x/config/kraft/server.properties

KRaft 配置文件要点

# KRaft 模式配置(config/kraft/server.properties)
process.roles=broker,controller    # 节点同时承担 Broker 和 Controller 角色
node.id=1
controller.quorum.voters=1@h121.wzk.icu:9093,2@h122.wzk.icu:9093,3@h123.wzk.icu:9093
listeners=PLAINTEXT://h121.wzk.icu:9092,CONTROLLER://h121.wzk.icu:9093
log.dirs=/var/kafka-logs

启动

kafka-server-start.sh /opt/servers/kafka_3.x/config/kraft/server.properties

ZooKeeper 模式 vs KRaft 模式对比

维度ZooKeeper 模式KRaft 模式
外部依赖需要独立 ZooKeeper 集群无外部依赖
运维复杂度高(两套系统)低(单系统)
最大分区数约 20 万约 200 万
元数据存储ZooKeeper znodesKafka 内部 Topic
启动速度较慢更快
生产成熟度成熟稳定3.3+ 生产可用

小结

  • Kafka 2.x 安装需提前部署 ZooKeeper,配置重点在 broker.idzookeeper.connectlog.dirs
  • Kafka 3.x 引入 KRaft,逐步淘汰 ZooKeeper,简化运维、提升扩展上限
  • 新项目建议选用 Kafka 3.3+ 并启用 KRaft 模式,生产环境已稳定可用
  • 无论哪种模式,3 节点部署是高可用的基本要求