4. Kafka集群部署:单机部署、集群部署(3节点)、ZooKeeper vs KRaft模式、关键配置参数

好,咱们进入实战环节。这一章我带你亲手搭一套Kafka环境。说实话,部署这事看着简单,但坑不少。我见过太多人在单机环境跑得欢,一上集群就各种翻车。咱们从单机开始,一步步来。

4.1 单机部署:先跑起来再说

单机部署其实就三步:下载、解压、启动。但有几个细节我得提醒你。

核心要点:单机部署主要用于开发测试,千万别直接上生产。我见过有人图省事,单机跑了一年,结果磁盘写爆了,数据全丢。

先看基本步骤:

  1. 下载Kafka:去官网下载二进制包,注意版本。我个人习惯用2.8.0以上版本,因为后面要讲KRaft模式。
  2. 解压配置:解压到指定目录,比如 /opt/kafka。
  3. 修改配置:编辑 config/server.properties,主要改这几个参数:
# 每个broker的唯一ID
broker.id=0
# 监听地址,0.0.0.0表示所有网卡
listeners=PLAINTEXT://0.0.0.0:9092
# 日志存储目录,建议用独立磁盘
log.dirs=/data/kafka/logs
# ZooKeeper连接地址
zookeeper.connect=localhost:2181

启动命令也很简单:

# 先启动ZooKeeper(如果没装,Kafka自带了一个)
bin/zookeeper-server-start.sh config/zookeeper.properties

# 再启动Kafka
bin/kafka-server-start.sh config/server.properties

小技巧:启动时加个 -daemon 参数,就能后台运行。比如 bin/kafka-server-start.sh -daemon config/server.properties。这样你关掉终端也不会停。

4.2 集群部署:3节点起步

单机跑通了,咱们上集群。3节点是生产环境的最小推荐配置。为什么是3?因为Kafka的副本机制需要至少3个副本才能保证高可用。你想想看,如果只有2个副本,挂了一个,剩下那个就是单点,风险太大。

集群部署的核心是配置差异化。每个broker的 server.properties 只有几个参数不同:

参数 Broker 1 Broker 2 Broker 3
broker.id 0 1 2
listeners PLAINTEXT://192.168.1.10:9092 PLAINTEXT://192.168.1.11:9092 PLAINTEXT://192.168.1.12:9092
log.dirs /data/kafka/logs /data/kafka/logs /data/kafka/logs
zookeeper.connect zk1:2181,zk2:2181,zk3:2181 zk1:2181,zk2:2181,zk3:2181 zk1:2181,zk2:2181,zk3:2181

启动顺序有讲究:先启动所有ZooKeeper,再逐个启动Kafka broker。我习惯用脚本批量启动,但第一次建议手动来,方便观察日志。

注意:broker.id 必须全局唯一。我曾经有一次不小心把两个broker配成了同一个ID,结果集群一直报错,查了半天才发现。这坑我踩过,你别再踩了。

4.3 ZooKeeper vs KRaft模式

说到这,得聊聊Kafka的元数据管理。早期版本必须依赖ZooKeeper,但从2.8.0开始,Kafka引入了KRaft模式,可以去掉ZooKeeper。这两种模式有什么区别?我给你画个图。

ZooKeeper vs KRaft 模式对比 ZooKeeper 模式 ZK 1 ZK 2 ZK 3 元数据存储(ZooKeeper) Broker 1 Broker 2 Broker 3 每个Broker都连接ZooKeeper 元数据读写依赖ZK集群 需要额外维护ZK集群 成熟稳定,社区经验丰富 KRaft 模式 Controller 1 Controller 2 Controller 3 元数据存储(KRaft内部) Broker 1 Broker 2 Broker 3 Controller内嵌在Broker中 元数据通过Raft协议自管理 无需额外维护ZooKeeper 部署更简单,运维成本低

两种模式的核心区别,我整理成表格:

对比维度 ZooKeeper模式 KRaft模式
元数据存储 依赖外部ZooKeeper集群 Kafka内部自管理
部署复杂度 需要额外部署ZK集群 只需部署Kafka
运维成本 高,需要同时维护两套系统 低,一套系统搞定
成熟度 非常成熟,生产环境首选 较新,2.8.0开始支持
性能 元数据操作有网络开销 内部通信,延迟更低
推荐场景 现有生产环境、对稳定性要求极高 新项目、希望简化运维

我的建议:如果你是新项目,直接用KRaft模式。我最近几个项目都用的KRaft,部署简单太多了。但如果是已有生产环境,别急着迁移,等KRaft再稳定几个版本。

4.4 关键配置参数

配置参数是Kafka调优的核心。我挑几个最关键的说说,这些都是我在生产环境踩过坑才总结出来的。

4.4.1 基础参数

参数名 默认值 说明 我的建议
broker.id -1 Broker唯一标识 必须手动设置,从0开始递增
listeners PLAINTEXT://:9092 监听地址和端口 生产环境用内网IP,别用0.0.0.0
log.dirs /tmp/kafka-logs 日志存储目录 别用/tmp,用独立磁盘,多个目录用逗号分隔
zookeeper.connect localhost:2181 ZooKeeper连接地址 集群模式用逗号分隔多个ZK地址

4.4.2 性能相关参数

这几个参数直接影响吞吐量和延迟:

# 网络线程数,处理客户端请求
num.network.threads=3
# IO线程数,处理磁盘读写
num.io.threads=8
# 每个分区日志段文件大小
log.segment.bytes=1073741824  # 1GB
# 日志保留时间
log.retention.hours=168  # 7天
# 日志保留大小限制
log.retention.bytes=-1  # 不限制

注意:num.io.threads 不是越大越好。我见过有人设成32,结果磁盘IO反而成了瓶颈。一般设为CPU核心数的2倍左右比较合适。

4.4.3 副本与高可用参数

这些参数决定了你的数据有多安全:

参数名 默认值 说明 生产建议
default.replication.factor 1 默认副本数 至少3,保证高可用
min.insync.replicas 1 最小同步副本数 设为2,配合acks=all使用
unclean.leader.election.enable false 是否允许非ISR副本成为leader 保持false,避免数据丢失

核心原则:数据安全优先于可用性。我宁愿服务短暂不可用,也不愿意丢数据。所以 unclean.leader.election.enable 我永远设为false。

4.4.4 KRaft模式特有参数

如果你用KRaft模式,这几个参数必须配:

# 启用KRaft模式
process.roles=broker,controller
# 节点ID,类似broker.id
node.id=1
# Controller的quorum投票者
controller.quorum.voters=1@192.168.1.10:9093,2@192.168.1.11:9093,3@192.168.1.12:9093

小技巧:KRaft模式下,controller.quorum.voters 必须包含所有controller节点。我建议奇数个,比如3个或5个,这样能容忍少数节点故障。

4.5 部署验证

部署完了,怎么验证?我一般做这几步:

  1. 查看进程:ps -ef | grep kafka,确认进程在运行。
  2. 查看日志:检查 logs/server.log,看有没有ERROR或WARN。
  3. 创建Topic:bin/kafka-topics.sh --create --topic test --partitions 3 --replication-factor 3 --bootstrap-server localhost:9092
  4. 生产消费测试:用 kafka-console-producer.sh 和 kafka-console-consumer.sh 发几条消息试试。