4. Kafka集群部署:单机部署、集群部署(3节点)、ZooKeeper vs KRaft模式、关键配置参数
好,咱们进入实战环节。这一章我带你亲手搭一套Kafka环境。说实话,部署这事看着简单,但坑不少。我见过太多人在单机环境跑得欢,一上集群就各种翻车。咱们从单机开始,一步步来。
4.1 单机部署:先跑起来再说
单机部署其实就三步:下载、解压、启动。但有几个细节我得提醒你。
核心要点:单机部署主要用于开发测试,千万别直接上生产。我见过有人图省事,单机跑了一年,结果磁盘写爆了,数据全丢。
先看基本步骤:
- 下载Kafka:去官网下载二进制包,注意版本。我个人习惯用2.8.0以上版本,因为后面要讲KRaft模式。
- 解压配置:解压到指定目录,比如
/opt/kafka。 - 修改配置:编辑
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模式 | 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 部署验证
部署完了,怎么验证?我一般做这几步:
- 查看进程:
ps -ef | grep kafka,确认进程在运行。 - 查看日志:检查
logs/server.log,看有没有ERROR或WARN。 - 创建Topic:
bin/kafka-topics.sh --create --topic test --partitions 3 --replication-factor 3 --bootstrap-server localhost:9092 - 生产消费测试:用
kafka-console-producer.sh和kafka-console-consumer.sh发几条消息试试。