3. Kafka集群搭建:单机部署、集群部署、ZooKeeper vs KRaft模式对比
这一章咱们来点实在的——动手搭集群。
说实话,很多初学者在学Kafka时,第一步就被卡住了。不是配置看不懂,而是不知道单机、集群到底有什么区别,更搞不清ZooKeeper和KRaft这两个模式该怎么选。我当年第一次搭Kafka集群时,也踩过不少坑,今天一次性给你讲透。
本章核心脉络:从单机快速上手 → 集群生产级部署 → 两种共识机制选型对比。跟着我的节奏走,你也能半小时搭出一套可用的Kafka环境。
3.1 单机部署:5分钟快速上手
先别急着上集群,咱们从最简单的开始。
单机部署说白了就是一台机器上跑一个Kafka Broker,外加一个ZooKeeper实例。我习惯用这种方式做功能验证和本地开发,省时省力。
3.1.1 前置准备
- JDK 11+(Kafka 3.x 强制要求,我之前用JDK8踩过编译坑)
- Kafka 二进制包(从官网下载,别用源码自己编译,没必要)
- 一台Linux/Mac机器(Windows也能跑,但生产环境别用)
3.1.2 部署步骤
- 解压安装包:
tar -xzf kafka_2.13-3.5.0.tgz - 启动ZooKeeper:
bin/zookeeper-server-start.sh config/zookeeper.properties - 启动Kafka Broker:
bin/kafka-server-start.sh config/server.properties - 验证:创建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节点为例)
- 准备3台机器:分别安装JDK和Kafka
- 配置ZooKeeper集群:每个ZK节点配置
myid文件和zoo.cfg - 配置Kafka Broker:每个Broker的
broker.id必须不同 - 启动顺序:先启动所有ZK节点,再启动所有Kafka Broker
- 验证集群:用
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模式简单不少:
- 生成集群ID:
bin/kafka-storage.sh random-uuid - 格式化存储目录:
bin/kafka-storage.sh format -t <uuid> -c config/kraft/server.properties - 启动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。一步一个脚印,别贪快。