Kafka 2.8.0 版本如何使用 KRaft 模式替代 Zookeeper 部署集群?

文章导读
Kafka 2.8.0 虽然引入了 KRaft 模式,但该版本中该功能仅为预览特性(Preview),生产环境建议继续使用 Zookeeper 或升级到 3.3.0 及以上版本再启用 KRaft。
📋 目录
  1. 环境准备与配置修正
  2. 2.8.0 最小化配置示例
  3. 命令速用版
  4. 为什么会这样
  5. 怎么验证是否生效
  6. 2.8.0 与 3.x 版本差异说明
  7. 常见坑
  8. 参考来源
A A

Kafka 2.8.0 虽然引入了 KRaft 模式,但该版本中该功能仅为预览特性(Preview),生产环境建议继续使用 Zookeeper 或升级到 3.3.0 及以上版本再启用 KRaft。

先说结论:Kafka 2.8.0 支持 KRaft 模式但仅限测试,生产环境使用该模式存在稳定性风险。

  • 适合:功能验证、测试环境搭建、非核心业务试用
  • 先准备:确认版本为 2.8.0,备份原有数据,手动创建配置文件
  • 验收:检查日志确认未启动 Zookeeper 客户端连接,确认 Raft 协议日志输出

环境准备与配置修正

Kafka 2.8.0 默认安装包中通常不存在 config/kraft/ 目录,需手动准备配置文件。请勿直接修改默认的 server.properties,建议复制一份专用配置。

# 进入 Kafka 安装目录
cd /opt/kafka_2.13-2.8.0

# 复制配置文件作为 KRaft 专用配置
cp config/server.properties config/kraft-server.properties

2.8.0 最小化配置示例

编辑 config/kraft-server.properties,注释掉所有 Zookeeper 相关配置(如 zookeeper.connect),并确保包含以下关键参数。2.8.0 版本配置项与 3.x 存在差异,请严格参照以下示例:

Kafka 2.8.0 版本如何使用 KRaft 模式替代 Zookeeper 部署集群?
# 节点角色:broker, controller 或 broker,controller
process.roles=broker,controller

# 节点 ID,必须唯一
node.id=1

# 控制器投票者信息,格式为 node.id@host:port
controller.quorum.voters=1@localhost:9093

# 监听器配置
listeners=PLAINTEXT://:9092,CONTROLLER://:9093
advertised.listeners=PLAINTEXT://localhost:9092
listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT

# 指定控制器监听器名称
controller.listener.name=CONTROLLER
inter.broker.listener.name=PLAINTEXT

# 日志目录,格式化命令将初始化此目录
log.dirs=/tmp/kraft-logs

命令速用版

以下命令用于在无 Zookeeper 环境下初始化并启动 Kafka 2.8.0 KRaft 模式。请确保已在测试环境验证,且 log.dirs 目录权限正确。

# 1. 生成集群 ID(记录输出的 UUID)
bin/kafka-storage.sh random-uuid

# 2. 格式化存储目录(替换<cluster-id>为上一步生成的 UUID)
bin/kafka-storage.sh format -t <cluster-id> -c config/kraft-server.properties

# 3. 启动 Broker(使用自定义配置文件)
bin/kafka-server-start.sh config/kraft-server.properties

为什么会这样

KRaft 模式是为了移除 Kafka 对 Zookeeper 的依赖而设计的架构改进。在 2.8.0 版本之前,Kafka 依赖 Zookeeper 存储元数据和管理控制器选举。2.8.0 版本通过 KIP-500 引入了 KRaft 协议的预览版,允许 Broker 自行管理元数据。

之所以强调 2.8.0 版本需谨慎,是因为官方文档明确标注该版本中的 KRaft 功能为 Preview(预览),尚未经过大规模生产验证。直到后续版本(如 3.3.0)该功能才标记为生产就绪。在 2.8.0 强行使用可能遇到元数据丢失或控制器选举失败的问题。

怎么验证是否生效

1. 检查进程日志:观察启动日志,确认没有出现连接 Zookeeper 相关的日志信息,如 Connecting to zookeeper。应看到与 Raft 协议相关的日志输出,例如 RaftManager 初始化信息。

Kafka 2.8.0 版本如何使用 KRaft 模式替代 Zookeeper 部署集群?

2. 验证元数据主题:使用 kafka-topics.sh 命令查看内部主题。注意 2.8.0 版本内部主题名称可能与后续版本不同,重点确认集群能正常创建业务主题。

bin/kafka-topics.sh `--bootstrap-server` localhost:9092 `--list`

3. 客户端连接测试:使用生产者和消费者脚本发送消息,确认读写正常且无报错。

2.8.0 与 3.x 版本差异说明

  • 配置文件路径:3.0+ 版本通常自带 config/kraft/ 模板,2.8.0 需手动创建。
  • 迁移工具:2.8.0 版本缺乏成熟的从 Zookeeper 模式迁移到 KRaft 模式的自动化工具(如 kafka-metadata.sh 迁移命令在后续版本才完善),手动迁移极易出错。
  • 兼容性:2.8.0 初始化的 KRaft 元数据格式可能与 3.x 不兼容,直接升级二进制包可能导致无法启动,需重新格式化。

常见坑

1. 数据丢失风险:在 2.8.0 版本中,KRaft 模式下的元数据兼容性较差,升级后续版本可能需要重新格式化,导致数据不可用。

Kafka 2.8.0 版本如何使用 KRaft 模式替代 Zookeeper 部署集群?

2. 配置项变更:2.8.0 的 KRaft 配置项与后续稳定版本存在差异,直接复制 3.x 版本的配置可能导致启动失败。

3. 生产环境误用:切勿在核心业务集群直接使用 2.8.0 的 KRaft 模式,公开资料中没有看到可靠的量化数据证明其在该版本的稳定性。

4. 端口冲突:配置 CONTROLLER 监听器时,确保端口(默认 9093)未被占用,且与 PLAINTEXT 端口区分开。

参考来源

  • Apache Kafka Documentation, Release Notes 2.8.0, https://kafka.apache.org/documentation.html
  • Apache Kafka KIP-500: Replace ZooKeeper with a Self-Managed Metadata Quorum, https://cwiki.apache.org/confluence/display/KAFKA/KIP-500%3A+Replace+ZooKeeper+with+a+Self-Managed+Metadata+Quorum