2. Kafka集群搭建
2.1 部署模式概述
Kafka 支持两种部署模式:单机模式用于开发测试,集群模式用于生产环境。两种模式的核心差异在于 Broker 数量、副本机制与 ZooKeeper 配置。
| 对比维度 | 单机模式 | 集群模式 |
|---|---|---|
| Broker 数量 | 1 个 | ≥ 3 个(推荐奇数) |
| 副本因子 | 1(无副本) | ≥ 2(推荐 3) |
| 高可用 | 无 | 支持 Leader 选举与故障转移 |
| ZooKeeper | 单节点或内嵌 | ZooKeeper 集群(≥ 3 节点) |
| 适用场景 | 本地开发、功能验证 | 生产环境、微服务集成 |
2.2 ZooKeeper 依赖说明
Kafka 从 0.9 版本开始依赖 ZooKeeper 管理集群元数据,包括 Broker 注册、Topic 配置、分区 Leader 选举、消费者组偏移量等。ZooKeeper 是 Kafka 集群的“协调大脑”。
关键依赖关系:
- 每个 Kafka Broker 启动时向 ZooKeeper 注册临时节点,Broker 宕机后节点自动删除。
- Controller Broker 由 ZooKeeper 选举产生,负责分区 Leader 的分配与重新平衡。
- 消费者组协调(Group Coordinator)依赖 ZooKeeper 存储组元数据(新版 Kafka 已逐步迁移至内部 Topic)。
2.3 单机模式部署步骤
- 下载与解压:从 Apache 官网下载 Kafka 二进制包,解压至目标目录。
- 启动 ZooKeeper:Kafka 内置了 ZooKeeper 脚本,可直接启动单节点 ZooKeeper。
- 修改配置文件:编辑
config/server.properties,设置broker.id=0、listeners=PLAINTEXT://localhost:9092、log.dirs=/tmp/kafka-logs。 - 启动 Kafka:运行
bin/kafka-server-start.sh config/server.properties。 - 验证:创建 Topic、生产消息、消费消息,确认功能正常。
提示:单机模式适合快速验证 API 与配置参数,但无法测试副本机制与故障转移。建议在开发环境至少使用 3 节点集群。
2.4 集群模式部署步骤
集群模式需要准备多台服务器(或同一台机器的多个端口),每台 Broker 拥有独立的 server.properties 配置文件。
2.5 配置文件详解
核心配置文件为 config/server.properties,以下列出集群部署必须关注的关键参数:
| 参数名 | 默认值 | 说明 | 集群建议 |
|---|---|---|---|
broker.id |
0 | Broker 唯一标识,集群内不可重复 | 从 0 开始递增 |
listeners |
PLAINTEXT://:9092 | Broker 监听地址与端口 | 使用内网 IP 或主机名 |
log.dirs |
/tmp/kafka-logs | 消息日志存储目录 | 使用独立磁盘,避免 /tmp |
zookeeper.connect |
localhost:2181 | ZooKeeper 连接地址 | host1:2181,host2:2181,host3:2181 |
num.partitions |
1 | Topic 默认分区数 | 根据吞吐量调整,建议 3~6 |
default.replication.factor |
1 | Topic 默认副本因子 | ≥ 2,推荐 3 |
offsets.topic.replication.factor |
1 | 消费者偏移量 Topic 副本因子 | ≥ 2,推荐 3 |
log.retention.hours |
168 | 消息保留时间(小时) | 根据业务需求调整 |
注意:
broker.id 在集群中必须唯一,否则会导致注册冲突。建议使用脚本自动生成或基于主机名映射。
2.6 集群启动与验证
启动顺序:先启动所有 ZooKeeper 节点,再依次启动每个 Kafka Broker。
2.6.1 启动 ZooKeeper 集群
# 在每台 ZooKeeper 节点上执行
bin/zookeeper-server-start.sh config/zookeeper.properties
2.6.2 启动 Kafka Broker
# 在每台 Broker 节点上执行,使用对应的 server.properties
bin/kafka-server-start.sh config/server.properties
2.6.3 验证集群状态
- 查看 Broker 列表:使用 ZooKeeper 客户端检查
/brokers/ids节点。 - 创建 Topic 并指定副本:
bin/kafka-topics.sh --create \
--bootstrap-server broker1:9092,broker2:9092,broker3:9092 \
--replication-factor 3 \
--partitions 3 \
--topic test-cluster
- 查看 Topic 详情:
bin/kafka-topics.sh --describe \
--bootstrap-server broker1:9092 \
--topic test-cluster
- 生产与消费验证:
# 生产者
bin/kafka-console-producer.sh --broker-list broker1:9092,broker2:9092,broker3:9092 --topic test-cluster
# 消费者
bin/kafka-console-consumer.sh --bootstrap-server broker1:9092,broker2:9092,broker3:9092 --topic test-cluster --from-beginning
2.7 常见问题与避坑指南
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| Broker 启动后立即退出 | ZooKeeper 未启动或连接地址错误 | 检查 zookeeper.connect 配置,确保 ZooKeeper 已启动 |
Topic 创建失败:REPLICATION_FACTOR 大于 Broker 数量 |
副本因子超过可用 Broker 数 | 降低 replication-factor 或增加 Broker 节点 |
| 消费者无法消费消息 | 消费者组偏移量 Topic 副本因子不足 | 设置 offsets.topic.replication.factor ≥ 2 |
| 磁盘空间不足 | 日志保留时间过长或分区过多 | 调整 log.retention.hours 或增加磁盘 |
生产环境最佳实践:
- ZooKeeper 与 Kafka Broker 部署在不同服务器,避免资源争抢。
- 使用独立磁盘存储日志文件,避免与系统盘共用。
- 设置
auto.create.topics.enable=false,防止误创建 Topic。 - 监控 ZooKeeper 连接数,避免超过默认限制(60 个连接)。