3. Kafka集群搭建:单机部署、集群部署、ZooKeeper vs KRaft模式对比

这一章咱们来点实在的——动手搭集群。

说实话,很多初学者在学Kafka时,第一步就被卡住了。不是配置看不懂,而是不知道单机、集群到底有什么区别,更搞不清ZooKeeper和KRaft这两个模式该怎么选。我当年第一次搭Kafka集群时,也踩过不少坑,今天一次性给你讲透。

本章核心脉络:从单机快速上手 → 集群生产级部署 → 两种共识机制选型对比。跟着我的节奏走,你也能半小时搭出一套可用的Kafka环境。

Kafka 部署模式全景图 单机部署 集群部署 KRaft 模式 1个Broker + 1个ZK 适合开发/测试 3+ Broker + 3+ ZK 生产环境标配 去ZooKeeper依赖 2.8+ 实验 / 3.x 稳定 选型建议 学习/开发用单机;生产环境用集群(ZK模式成熟稳定);新项目可尝试KRaft

3.1 单机部署:5分钟快速上手

先别急着上集群,咱们从最简单的开始。

单机部署说白了就是一台机器上跑一个Kafka Broker,外加一个ZooKeeper实例。我习惯用这种方式做功能验证和本地开发,省时省力。

3.1.1 前置准备

  • JDK 11+(Kafka 3.x 强制要求,我之前用JDK8踩过编译坑)
  • Kafka 二进制包(从官网下载,别用源码自己编译,没必要)
  • 一台Linux/Mac机器(Windows也能跑,但生产环境别用)

3.1.2 部署步骤

  1. 解压安装包:tar -xzf kafka_2.13-3.5.0.tgz
  2. 启动ZooKeeper:bin/zookeeper-server-start.sh config/zookeeper.properties
  3. 启动Kafka Broker:bin/kafka-server-start.sh config/server.properties
  4. 验证:创建topic并生产消费一条消息

我的小技巧:启动时加上 -daemon 参数可以让进程后台运行,不用一直开着终端窗口。比如 bin/kafka-server-start.sh -daemon config/server.properties。

3.1.3 核心配置解读

打开 config/server.properties,你真正需要关心的就这几个参数:

参数名 默认值 说明
broker.id 0 集群中唯一标识,单机不用改
listeners PLAINTEXT://:9092 客户端连接地址,生产环境记得配成内网IP
log.dirs /tmp/kafka-logs 数据存储目录,千万别用默认的/tmp,重启就没了!
zookeeper.connect localhost:2181 ZK连接地址,集群模式改成多个ZK节点

避坑指南:我曾经在生产环境遇到过Kafka莫名其妙丢数据,查了半天发现是 log.dirs 指向了临时目录,机器重启后数据全没了。记住,log.dirs 一定要配到持久化磁盘上!

3.2 集群部署:生产环境的标准姿势

单机玩够了,咱们上集群。

你想想看,生产环境怎么可能只用一个Broker?单点故障、吞吐瓶颈,随便一个问题就能让你半夜爬起来。Kafka集群的核心思想就是——多台机器一起干活,一台挂了其他顶上。

3.2.1 集群架构

一个标准的Kafka集群包含:

  • 3个或更多Broker节点:奇数个最好,方便选举
  • 3个或更多ZooKeeper节点:同样奇数个,保证ZK集群高可用
  • Topic分区多副本:副本因子建议2或3

3.2.2 部署步骤(以3节点为例)

  1. 准备3台机器:分别安装JDK和Kafka
  2. 配置ZooKeeper集群:每个ZK节点配置 myid 文件和 zoo.cfg
  3. 配置Kafka Broker:每个Broker的 broker.id 必须不同
  4. 启动顺序:先启动所有ZK节点,再启动所有Kafka Broker
  5. 验证集群:用 kafka-topics.sh --describe 查看副本分布

关键配置示例(server.properties):

# Broker 1
broker.id=1
listeners=PLAINTEXT://192.168.1.101:9092
log.dirs=/data/kafka/logs
zookeeper.connect=192.168.1.101:2181,192.168.1.102:2181,192.168.1.103:2181

# Broker 2
broker.id=2
listeners=PLAINTEXT://192.168.1.102:9092
log.dirs=/data/kafka/logs
zookeeper.connect=192.168.1.101:2181,192.168.1.102:2181,192.168.1.103:2181

# Broker 3
broker.id=3
listeners=PLAINTEXT://192.168.1.103:9092
log.dirs=/data/kafka/logs
zookeeper.connect=192.168.1.101:2181,192.168.1.102:2181,192.168.1.103:2181

3.2.3 集群部署的避坑点

  • 网络互通:节点之间必须能互相访问,防火墙别拦着
  • 时间同步:所有节点时间要一致,不然消息顺序会乱
  • 磁盘独立:每个Broker用独立磁盘,别共享存储
  • 副本数别贪多:副本因子=3已经够用,太多浪费磁盘

我的经验:集群部署时,我习惯先用 kafka-broker-api-versions.sh --bootstrap-server 命令测试每个Broker是否可达。这个命令不依赖任何topic,能快速定位网络问题。

3.3 ZooKeeper vs KRaft:两种模式怎么选?

这个问题最近问的人特别多。

说白了,ZooKeeper是Kafka的老搭档,负责管理集群元数据(谁是谁的Leader、Topic有哪些分区等)。但ZK本身也是个分布式系统,维护起来挺麻烦的。KRaft是Kafka 2.8引入的新模式,把元数据管理直接集成到Kafka内部,不再依赖外部ZK。

3.3.1 核心差异对比

对比维度 ZooKeeper模式 KRaft模式
依赖组件 需要额外部署ZK集群 仅Kafka自身
部署复杂度 高(维护两套系统) 低(一套搞定)
成熟度 非常成熟,生产验证多年 2.8实验性,3.x逐步稳定
元数据一致性 依赖ZK的Zab协议 基于Raft协议自管理
运维成本 高(ZK集群也要监控) 低(少一个运维对象)
推荐场景 现有生产环境、保守派 新项目、技术尝鲜、简化运维

3.3.2 我个人的选型建议

  • 如果你是新手学习:先用ZK模式,资料多、社区支持好
  • 如果是新项目上线:Kafka 3.5+ 的KRaft模式已经比较稳定,可以尝试
  • 如果是已有生产集群:别急着迁移,等KRaft再成熟一两个版本
  • 如果运维团队人手不够:KRaft能省掉ZK的维护工作,值得考虑

我曾经踩过的坑:在Kafka 2.8刚出KRaft时,我就在一个测试环境试用了。结果发现Controller选举偶尔会超时,导致集群短暂不可用。后来升级到3.2版本才稳定下来。所以,新特性别急着上生产,先跑一段时间再说。

3.3.3 KRaft模式快速部署

如果你决定试试KRaft,部署流程比ZK模式简单不少:

  1. 生成集群ID:bin/kafka-storage.sh random-uuid
  2. 格式化存储目录:bin/kafka-storage.sh format -t <uuid> -c config/kraft/server.properties
  3. 启动Broker:bin/kafka-server-start.sh config/kraft/server.properties

看到了吗?没有ZooKeeper,没有额外的集群配置,一个命令搞定。

KRaft模式的核心配置差异:

# server.properties(KRaft模式)
process.roles=broker,controller
node.id=1
controller.quorum.voters=1@192.168.1.101:9093,2@192.168.1.102:9093,3@192.168.1.103:9093
listeners=PLAINTEXT://192.168.1.101:9092,CONTROLLER://192.168.1.101:9093
advertised.listeners=PLAINTEXT://192.168.1.101:9092

注意 process.roles 参数,可以同时扮演Broker和Controller角色,也可以分开部署。

3.4 本章小结

嗯,到这里你应该对Kafka的部署模式有了清晰的认识。

  • 单机部署:适合学习、开发测试,5分钟搞定
  • 集群部署:生产环境标配,3个Broker起步,配合ZK保证高可用
  • ZK vs KRaft:老项目用ZK,新项目可以试试KRaft,省心省力

我个人建议,如果你刚开始学Kafka,先用单机ZK模式把基础功能跑通。等理解了消息生产消费、分区副本这些概念后,再上集群和KRaft。一步一个脚印,别贪快。