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 集群架构图

Kafka 3 节点集群架构 ZooKeeper 集群 节点1 (zk1:2181) 节点2 (zk2:2181) 节点3 (zk3:2181) Kafka Broker 集群 Broker1 (broker1:9092) Broker2 (broker2:9092) Broker3 (broker3:9092) 生产者 消费者 元数据同步 写入消息 拉取消息 副本同步 说明: • ZooKeeper 集群负责 Broker 注册、Leader 选举、元数据管理。 • 生产者将消息写入 Leader 分区,Leader 同步给 Follower 副本。

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 验证副本分布

Topic 副本分布示例(3分区 × 3副本) 分区 0 Leader: Broker1 Follower: Broker2 Follower: Broker3 分区 1 Leader: Broker2 Follower: Broker3 Follower: Broker1 分区 2 Leader: Broker3 Follower: Broker1 Follower: Broker2 Leader 均匀分布在 3 个 Broker 上,实现负载均衡;每个分区有 2 个 Follower 提供数据冗余。

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 级别日志。