3. Kafka集群搭建:单机与集群模式部署、配置文件详解、启动与验证
Kafka 的部署模式直接影响生产环境的吞吐量、可用性与运维复杂度。本章从单机快速验证开始,逐步过渡到多节点集群模式,并深入解析核心配置参数,最后通过命令行工具验证部署的正确性。
3.1 部署模式对比
| 特性 | 单机模式 | 集群模式 |
|---|---|---|
| 节点数量 | 1 个 Broker | ≥ 3 个 Broker |
| 数据冗余 | 无副本,单点故障 | 多副本,高可用 |
| 吞吐量 | 受单机资源限制 | 线性扩展 |
| 适用场景 | 开发测试、快速验证 | 生产环境、流式处理 |
| ZooKeeper 依赖 | 单节点 ZK | ZK 集群(推荐 3 节点) |
生产建议:Kafka 3.x 开始逐步弱化 ZooKeeper 依赖(KRaft 模式),但当前主流生产环境仍以 ZooKeeper 模式为主。本课程基于 ZooKeeper 模式讲解,兼容性更广。
3.2 单机模式部署
3.2.1 环境准备
- JDK 11+(推荐 OpenJDK 11)
- Kafka 二进制包(本课程使用 3.4.0 版本)
- ZooKeeper 3.8.x(单机模式可内嵌 ZK)
3.2.2 启动 ZooKeeper
# 解压 Kafka 包
tar -xzf kafka_2.13-3.4.0.tgz
cd kafka_2.13-3.4.0
# 启动内嵌 ZooKeeper(单节点)
bin/zookeeper-server-start.sh config/zookeeper.properties &
3.2.3 启动 Kafka Broker
# 修改 config/server.properties 关键参数
# broker.id=0
# listeners=PLAINTEXT://localhost:9092
# log.dirs=/tmp/kafka-logs
# 启动 Broker
bin/kafka-server-start.sh config/server.properties &
3.2.4 验证单机部署
# 创建测试 Topic
bin/kafka-topics.sh --create --topic test-topic \
--bootstrap-server localhost:9092 \
--partitions 3 --replication-factor 1
# 查看 Topic 列表
bin/kafka-topics.sh --list --bootstrap-server localhost:9092
# 生产消息
bin/kafka-console-producer.sh --topic test-topic \
--bootstrap-server localhost:9092
# 消费消息(新终端)
bin/kafka-console-consumer.sh --topic test-topic \
--bootstrap-server localhost:9092 --from-beginning
验证要点:生产者输入消息后,消费者终端能实时收到相同内容,说明单机部署成功。
3.3 集群模式部署
集群模式至少需要 3 个 Broker 节点,每个 Broker 拥有独立的 server.properties 配置文件。以下以 3 节点集群为例,部署在同一台物理机(不同端口)或三台独立服务器。
3.3.1 集群架构图
3.3.2 集群配置文件详解
每个 Broker 需要独立的 server.properties,以下为 Broker1 的配置示例,其他节点仅修改 broker.id 和 listeners 端口。
# ===== 基础配置 =====
# 每个 Broker 的唯一标识,集群内不可重复
broker.id=1
# 监听地址与端口
listeners=PLAINTEXT://192.168.1.101:9092
# 对外暴露的地址(用于客户端连接)
advertised.listeners=PLAINTEXT://192.168.1.101:9092
# 日志数据存储目录(建议使用独立磁盘)
log.dirs=/data/kafka/logs
# ===== 副本与分区 =====
# 默认分区数
num.partitions=3
# 默认副本因子(生产环境建议 3)
default.replication.factor=3
# 最小同步副本数(ISR 最小数量)
min.insync.replicas=2
# ===== ZooKeeper 连接 =====
# ZK 集群地址,多个用逗号分隔
zookeeper.connect=zk1:2181,zk2:2181,zk3:2181
# ZK 连接超时时间(毫秒)
zookeeper.connection.timeout.ms=18000
# ===== 网络与线程 =====
# 网络线程数(处理网络请求)
num.network.threads=3
# IO 线程数(处理磁盘读写)
num.io.threads=8
# Socket 缓冲区大小
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
# ===== 日志保留策略 =====
# 日志保留时间(168 小时 = 7 天)
log.retention.hours=168
# 日志段文件大小(1GB)
log.segment.bytes=1073741824
# 日志保留字节限制(-1 表示不限制)
log.retention.bytes=-1
关键参数说明:
•
•
•
default.replication.factor 与 min.insync.replicas 共同决定数据可靠性。若 min.insync.replicas=2,则至少 2 个副本同步后才确认写入成功。•
log.dirs 建议使用多块磁盘,用逗号分隔路径,Kafka 会自动做数据均衡。
3.3.3 启动集群
# 启动 ZooKeeper 集群(3 节点)
# 节点1
bin/zookeeper-server-start.sh config/zookeeper-1.properties &
# 节点2
bin/zookeeper-server-start.sh config/zookeeper-2.properties &
# 节点3
bin/zookeeper-server-start.sh config/zookeeper-3.properties &
# 启动 Kafka Broker(3 节点)
# Broker1
bin/kafka-server-start.sh config/server-1.properties &
# Broker2
bin/kafka-server-start.sh config/server-2.properties &
# Broker3
bin/kafka-server-start.sh config/server-3.properties &
3.4 集群验证
3.4.1 验证 Broker 注册状态
# 查看所有 Broker 是否已注册到 ZK
bin/zookeeper-shell.sh zk1:2181 ls /brokers/ids
# 预期输出:[1, 2, 3]
3.4.2 创建带副本的 Topic
# 创建 Topic,3 分区 3 副本
bin/kafka-topics.sh --create --topic cluster-topic \
--bootstrap-server broker1:9092,broker2:9092,broker3:9092 \
--partitions 3 --replication-factor 3
# 查看 Topic 详情
bin/kafka-topics.sh --describe --topic cluster-topic \
--bootstrap-server broker1:9092
3.4.3 验证副本分布
3.4.4 故障转移测试
# 手动停止 Broker1(模拟宕机)
kill -9 <Broker1_PID>
# 查看 Topic 状态,观察 Leader 切换
bin/kafka-topics.sh --describe --topic cluster-topic \
--bootstrap-server broker2:9092
# 预期:分区0 的 Leader 从 Broker1 切换到 Broker2 或 Broker3
验证结论:集群模式下,单个 Broker 宕机不会影响整体服务,Topic 仍可正常生产和消费。Leader 自动切换到剩余 Broker 的 Follower 副本,保证数据不丢失。
3.5 常见问题与排查
| 问题现象 | 可能原因 | 排查命令 |
|---|---|---|
| Broker 启动失败 | 端口被占用、ZK 未启动 | netstat -tlnp | grep 9092 |
| 生产者连接超时 | advertised.listeners 配置错误 |
检查客户端能否 telnet 到该地址 |
| 消费者无法消费 | 消费者组 offset 丢失 | kafka-consumer-groups.sh --describe |
| 副本同步滞后 | 磁盘 IO 瓶颈、网络延迟 | kafka-log-dirs.sh --describe |
快速定位技巧:查看 Kafka 日志文件
logs/server.log,大部分启动和运行时错误都会记录在此。重点关注 ERROR 和 WARN 级别日志。