3. Kafka 集群部署:单机与集群模式、配置文件详解、启动与验证

Kafka 的部署模式直接影响消息系统的吞吐量、可用性与运维复杂度。本章从单机快速验证环境入手,逐步过渡到多节点集群部署,并深入解析核心配置文件的参数含义,最后通过生产与消费验证确保集群正确运行。

3.1 部署模式对比

特性 单机模式 集群模式
节点数量 1 个 Broker ≥ 3 个 Broker
高可用 无(单点故障) 支持(Leader 选举 + ISR 副本)
吞吐量 受单机资源限制 线性扩展
适用场景 开发调试、功能验证 生产环境、高并发任务
ZooKeeper / KRaft 需依赖 ZooKeeper 或内置 KRaft 推荐 KRaft(Kafka 3.x+)或独立 ZK
选型建议: 开发与单元测试阶段使用单机模式可快速迭代;集成测试与生产环境必须使用 ≥3 节点的集群模式,以保障消息不丢失与服务连续性。

3.2 单机模式部署步骤

  1. 下载与解压:从 Apache 官网获取 Kafka 二进制包(如 kafka_2.13-3.6.0.tgz),解压至目标目录。
  2. 配置 ZooKeeper(可选):若使用传统模式,修改 config/zookeeper.properties 中的 dataDir 路径。
  3. 配置 Kafka Broker:编辑 config/server.properties,至少设置 broker.id=0 与 log.dirs=/tmp/kafka-logs。
  4. 启动 ZooKeeper:bin/zookeeper-server-start.sh config/zookeeper.properties
  5. 启动 Kafka:bin/kafka-server-start.sh config/server.properties
  6. 验证:创建测试 Topic 并生产/消费一条消息。
# 创建 Topic(单机模式,1 分区 1 副本)
bin/kafka-topics.sh --create --topic test-single --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1

# 启动控制台生产者
bin/kafka-console-producer.sh --topic test-single --bootstrap-server localhost:9092
> Hello Kafka Single Node

# 启动控制台消费者(新终端)
bin/kafka-console-consumer.sh --topic test-single --bootstrap-server localhost:9092 --from-beginning
Hello Kafka Single Node

3.3 集群模式部署步骤

以下以 3 节点集群为例,每节点使用独立 server.properties 文件。推荐使用 KRaft 模式(Kafka 3.x+)以简化架构。

3.3.1 集群配置文件核心参数

参数名 说明 集群示例值
broker.id 全局唯一 Broker 标识 0, 1, 2
listeners 客户端连接地址与端口 PLAINTEXT://0.0.0.0:9092
advertised.listeners 对外公布的连接地址 PLAINTEXT://node1:9092
log.dirs 消息日志存储路径 /data/kafka/logs
num.partitions Topic 默认分区数 3
default.replication.factor 默认副本因子 2
min.insync.replicas 最小同步副本数(保证写入可靠性) 2
offsets.topic.replication.factor 偏移量 Topic 副本数 2
controller.quorum.voters KRaft 控制器投票节点列表 0@node1:9093,1@node2:9093,2@node3:9093
关键注意: 集群模式下 broker.id 必须唯一;advertised.listeners 必须使用其他节点可解析的主机名或 IP,否则跨节点副本同步会失败。

3.3.2 集群启动流程

  1. 为每个节点准备独立的 server.properties,修改 broker.id、log.dirs、listeners 与 controller.quorum.voters。
  2. 在每台机器上执行 bin/kafka-storage.sh format -t <uuid> -c config/server.properties 格式化存储(KRaft 模式首次启动必需)。
  3. 依次启动各节点:bin/kafka-server-start.sh config/server.properties。
  4. 验证集群成员:bin/kafka-broker-api-versions.sh --bootstrap-server node1:9092,node2:9092,node3:9092。
# 生成集群 UUID(仅执行一次)
bin/kafka-storage.sh random-uuid
# 输出示例:m8V1L3eOSvqE3g0K9s2X5w

# 格式化每个节点(以 node1 为例)
bin/kafka-storage.sh format -t m8V1L3eOSvqE3g0K9s2X5w -c config/server.properties

# 启动 node1
bin/kafka-server-start.sh config/server.properties &

# 启动 node2、node3 同理

3.4 集群架构示意

下图展示了一个 3 节点 Kafka 集群的内部组件关系,包含控制器、分区副本分配与客户端交互路径。

Kafka 3 节点集群架构(KRaft 模式) Broker 1 (Controller) broker.id=0 分区: P0(Leader), P3(Follower) 副本: R1, R2 Broker 2 broker.id=1 分区: P1(Leader), P0(Follower) 副本: R1, R2 Broker 3 broker.id=2 分区: P2(Leader), P1(Follower) 副本: R1, R2 Producer / Consumer 客户端 说明: • 控制器(Controller)由集群选举产生,负责分区 Leader 分配与重新平衡。 • 每个分区有 1 个 Leader 和 ≥1 个 Follower,Follower 从 Leader 同步数据(ISR 机制)。

3.5 启动验证清单

集群启动后,执行以下命令逐项验证,确保所有组件正常工作。

验证项 命令 预期结果
Broker 存活 kafka-broker-api-versions.sh --bootstrap-server node1:9092 返回各 Broker 的 API 版本列表
Topic 列表 kafka-topics.sh --list --bootstrap-server node1:9092 显示已创建的 Topic 名称
分区与副本状态 kafka-topics.sh --describe --topic test-cluster --bootstrap-server node1:9092 显示 Leader、Replicas、Isr 列,ISR 应与 Replicas 一致
生产消息 kafka-console-producer.sh --topic test-cluster --bootstrap-server node1:9092 输入消息后无报错
消费消息 kafka-console-consumer.sh --topic test-cluster --bootstrap-server node2:9092 --from-beginning 从任意节点消费到之前生产的消息
故障转移 手动 Kill 一个 Leader Broker,再次 --describe 分区 Leader 自动切换到其他 Broker,ISR 更新
生产环境建议: 将验证步骤写入自动化脚本(如 Shell 或 Ansible),每次部署后自动执行,确保集群状态符合预期。重点关注 UnderReplicatedPartitions 指标,若该值持续 >0 说明副本同步存在延迟。

3.6 配置文件详解(server.properties)

以下列出集群部署中最关键的配置参数组,按功能分类说明。

3.6.1 基础标识与网络

# 每个 Broker 的唯一 ID,集群内不可重复
broker.id=0

# 监听地址与协议
listeners=PLAINTEXT://0.0.0.0:9092

# 对外公布的地址(其他节点与客户端使用)
advertised.listeners=PLAINTEXT://node1.example.com:9092

# 最大网络线程数
num.network.threads=3

# 最大 I/O 线程数
num.io.threads=8

3.6.2 日志与存储

# 日志数据目录(可配置多个,逗号分隔)
log.dirs=/data/kafka/logs

# 每个 Topic 的默认分区数
num.partitions=3

# 日志保留时间(小时)
log.retention.hours=168

# 日志段文件大小(字节)
log.segment.bytes=1073741824

# 日志保留字节限制(-1 为不限)
log.retention.bytes=-1

3.6.3 副本与可靠性

# 默认副本因子
default.replication.factor=2

# 最小同步副本数(写入 ack=all 时生效)
min.insync.replicas=2

# 允许非 Leader 节点进行消费(提高读可用性)
allow.auto.create.topics.enable=false

# 副本从 Leader 拉取数据的最大超时(毫秒)
replica.fetch.wait.max.ms=500

3.6.4 KRaft 控制器配置(Kafka 3.x+)

# 启用 KRaft 模式(不使用 ZooKeeper)
process.roles=broker,controller

# 控制器监听端口
controller.listener.names=CONTROLLER

# 控制器投票节点列表
controller.quorum.voters=0@node1:9093,1@node2:9093,2@node3:9093

# 节点 ID(与 broker.id 一致)
node.id=0
常见错误: 若 controller.quorum.voters 配置错误或节点间网络不通,Broker 启动时会持续打印 TimeoutException 并无法加入集群。务必确保所有节点能通过主机名互相访问,且端口未被防火墙拦截。

3.7 集群启动后的健康检查

除了命令行验证,建议通过 JMX 或 Kafka 内置指标监控集群健康。以下为关键指标与检查方法。

集群健康检查流程 1. Broker 存活 kafka-broker-api-versions 2. Topic 元数据 kafka-topics --describe 3. 生产验证 kafka-console-producer 4. 消费验证 kafka-console-consumer 5. 故障注入测试(Kill Leader) 验证 Leader 切换与 ISR 更新 集群健康通过 ✓
自动化建议: 将上述健康检查流程封装为 check_kafka_cluster.sh 脚本,集成到 CI/CD 流水线中。每次部署后自动执行,输出 JSON 格式结果供监控系统消费。