3. Kafka 集群部署:单机与集群模式、配置文件详解、启动与验证
Kafka 的部署模式直接影响消息系统的吞吐量、可用性与运维复杂度。本章从单机快速验证环境入手,逐步过渡到多节点集群部署,并深入解析核心配置文件的参数含义,最后通过生产与消费验证确保集群正确运行。
3.1 部署模式对比
| 特性 | 单机模式 | 集群模式 |
|---|---|---|
| 节点数量 | 1 个 Broker | ≥ 3 个 Broker |
| 高可用 | 无(单点故障) | 支持(Leader 选举 + ISR 副本) |
| 吞吐量 | 受单机资源限制 | 线性扩展 |
| 适用场景 | 开发调试、功能验证 | 生产环境、高并发任务 |
| ZooKeeper / KRaft | 需依赖 ZooKeeper 或内置 KRaft | 推荐 KRaft(Kafka 3.x+)或独立 ZK |
选型建议: 开发与单元测试阶段使用单机模式可快速迭代;集成测试与生产环境必须使用 ≥3 节点的集群模式,以保障消息不丢失与服务连续性。
3.2 单机模式部署步骤
- 下载与解压:从 Apache 官网获取 Kafka 二进制包(如
kafka_2.13-3.6.0.tgz),解压至目标目录。 - 配置 ZooKeeper(可选):若使用传统模式,修改
config/zookeeper.properties中的dataDir路径。 - 配置 Kafka Broker:编辑
config/server.properties,至少设置broker.id=0与log.dirs=/tmp/kafka-logs。 - 启动 ZooKeeper:
bin/zookeeper-server-start.sh config/zookeeper.properties - 启动 Kafka:
bin/kafka-server-start.sh config/server.properties - 验证:创建测试 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 集群启动流程
- 为每个节点准备独立的
server.properties,修改broker.id、log.dirs、listeners与controller.quorum.voters。 - 在每台机器上执行
bin/kafka-storage.sh format -t <uuid> -c config/server.properties格式化存储(KRaft 模式首次启动必需)。 - 依次启动各节点:
bin/kafka-server-start.sh config/server.properties。 - 验证集群成员:
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 集群的内部组件关系,包含控制器、分区副本分配与客户端交互路径。
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 内置指标监控集群健康。以下为关键指标与检查方法。
自动化建议: 将上述健康检查流程封装为
check_kafka_cluster.sh 脚本,集成到 CI/CD 流水线中。每次部署后自动执行,输出 JSON 格式结果供监控系统消费。