【Kafka源码解读和使用指南】第06篇:Kafka集群搭建实战——三节点集群从零到一
2026/6/24 0:00:36 网站建设 项目流程

上一篇:【第05篇】Kafka消费者快速上手——消息消费从入门到不迷路
下一篇:【第07篇】Kafka的配置圣经——不看后悔系列


摘要

单节点Kafka跑起来容易,但生产环境必须用集群——毕竟谁也不想Broker半夜挂了,第二天老板问你"消息都去哪了?"

本文将手把手带你搭建一个三节点Kafka集群(基于KRaft模式,无需ZooKeeper)。从节点配置、集群ID生成、存储格式化,到节点启动、Topic创建验证、集群健康检查,每一步都有完整命令和截图级说明。最后还会分享5个真实生产环境中的集群搭建踩坑经验。

读完这篇,你就能在自己的服务器上跑起一个真正的Kafka集群了。


一、为什么要搭集群?(一分钟理论)

单节点 Kafka: ┌─────────────────┐ │ Kafka Broker │ ← 挂了就全挂了 │ (单点故障) │ └─────────────────┘ 三节点 Kafka 集群: ┌─────────┐ ┌─────────┐ ┌─────────┐ │ Broker 1 │ │ Broker 2 │ │ Broker 3 │ │ (Leader) │←→│(Follower)│←→│(Follower)│ ← 互相复制 └─────────┘ └─────────┘ └─────────┘ ↑ ↑ ↑ └───────────────┴───────────────┘ 互相选举 Controller

集群的三大好处

  1. 高可用:一个Broker挂了,其他Broker自动接管(Leader切换)
  2. 数据不丢:副本(Replica)机制,消息存多份
  3. 水平扩展:吞吐量不够?加Broker!

二、准备工作

2.1 硬件规划(三节点最低配置)

节点CPU内存磁盘网络
Broker 12核4GB50GB SSD千兆网卡
Broker 22核4GB50GB SSD千兆网卡
Broker 32核4GB50GB SSD千兆网卡

生产环境推荐:8核16GB起步,磁盘用SSD(顺序写多,SSD优势不明显,但IOPS高对零拷贝有帮助)。

2.2 网络规划

三节点集群网络规划: ┌──────────────────────────────────────────────┐ │ 172.20.1.0/24 网段 │ │ Broker1 Broker2 Broker3 │ │ 172.20.1.101 172.20.1.102 172.20.1.103 │ │ Port: 9092 Port: 9092 Port: 9092 │ │ Ctrl: 9093 Ctrl: 9093 Ctrl: 9093 │ └──────────────────────────────────────────────┘

2.3 防火墙开放端口

# 每个节点都要执行# Kafka 客户端端口sudofirewall-cmd--permanent--add-port=9092/tcp# KRaft 控制器通信端口sudofirewall-cmd--permanent--add-port=9093/tcpsudofirewall-cmd--reload# 验证sudofirewall-cmd --list-ports# 输出:9092/tcp 9093/tcp

三、生成集群 ID(只需一次)

集群ID是Kafka集群的"身份证",只需要在一个节点上生成一次,然后所有节点共用这个ID。

# 在 Broker1 上执行cd/opt/kafka_2.13-3.9.0 bin/kafka-storage.sh random-uuid# 输出示例:# xtHmPHNSTJ6l3iG4g4GwS

⚠️重要:把这个UUID记下来!后面每个节点格式化存储时都要用。


四、逐个节点配置

Kafka的KRaft模式配置在config/kraft/server.properties。我们需要为每个节点准备一份配置文件。

4.1 节点1配置(Broker1,作为引导节点)

# ==================== 基础配置 ==================== # 节点ID(每个节点必须唯一!) node.id=1 # 节点角色:broker(数据节点)+ controller(控制器) # 生产环境建议 controller 和 broker 分离部署 process.roles=broker,controller # ==================== 控制器配置 ==================== # 控制器仲裁投票节点列表(格式:节点ID@主机:端口) # 这里是关键!所有控制器节点都要列出来 controller.quorum.voters=1@172.20.1.101:9093,2@172.20.1.102:9093,3@172.20.1.103:9093 # ==================== 网络配置 ==================== # 监听器配置 # CONTROLLER:控制器通信(内部使用) # PLAINTEXT:客户端连接(不加密,生产环境用SSL) listeners=CONTROLLER://:9093,PLAINTEXT://:9092 # 对外通告的地址(客户端真正连接的地址) advertised.listeners=PLAINTEXT://172.20.1.101:9092 # 监听器与安全协议的映射 listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT # 控制器监听器名称(必须指向上面定义的CONTROLLER监听器) controller.listener.names=CONTROLLER # ==================== 存储配置 ==================== # 日志数据存储目录(可以配置多个,逗号分隔) log.dirs=/opt/kafka-data/logs # ==================== Topic默认配置 ==================== # 自动创建Topic时默认的分区数 num.partitions=3 # 自动创建Topic时默认的副本因子 default.replication.factor=3

4.2 节点2配置(Broker2)

# 唯一区别:node.id 和 advertised.listeners node.id=2 process.roles=broker,controller controller.quorum.voters=1@172.20.1.101:9093,2@172.20.1.102:9093,3@172.20.1.103:9093 listeners=CONTROLLER://:9093,PLAINTEXT://:9092 advertised.listeners=PLAINTEXT://172.20.1.102:9092 listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT controller.listener.names=CONTROLLER log.dirs=/opt/kafka-data/logs num.partitions=3 default.replication.factor=3

4.3 节点3配置(Broker3)

node.id=3 process.roles=broker,controller controller.quorum.voters=1@172.20.1.101:9093,2@172.20.1.102:9093,3@172.20.1.103:9093 listeners=CONTROLLER://:9093,PLAINTEXT://:9092 advertised.listeners=PLAINTEXT://172.20.1.103:9092 listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT controller.listener.names=CONTROLLER log.dirs=/opt/kafka-data/logs num.partitions=3 default.replication.factor=3

4.4 配置对比表

参数Broker1Broker2Broker3
node.id123
advertised.listeners101:9092102:9092103:9092
controller.quorum.voters三个都一样三个都一样三个都一样
其他参数完全相同完全相同完全相同

技巧:先配好一个节点的配置文件,然后用scp复制到其他节点,只修改node.idadvertised.listeners


五、格式化存储目录(每个节点都要执行)

# 在每个节点上执行,使用步骤三生成的同一个集群ID# Broker1bin/kafka-storage.shformat\-txtHmPHNSTJ6l3iG4g4GwS\-cconfig/kraft/server.properties# Broker2bin/kafka-storage.shformat\-txtHmPHNSTJ6l3iG4g4GwS\-cconfig/kraft/server.properties# Broker3bin/kafka-storage.shformat\-txtHmPHNSTJ6l3iG4g4GwS\-cconfig/kraft/server.properties

成功输出示例

Formatting /opt/kafka-data/logs with metadata.version 3.9-IV0

六、启动集群

6.1 逐个启动节点

# 在每个节点上执行(建议先启动Broker1)# Broker1(前台运行,方便看日志)cd/opt/kafka_2.13-3.9.0 bin/kafka-server-start.sh config/kraft/server.properties# 看到这句话就说明启动成功了:# [2026-05-30 10:00:00,123] INFO [KafkaRaftServer nodeId=1] Kafka Server started (kafka.server.KafkaRaftServer)

💡建议:先前台运行,确认没问题后再用nohupsystemd后台运行。

6.2 后台运行(生产环境)

# 使用 nohup 后台运行nohupbin/kafka-server-start.sh config/kraft/server.properties\>/opt/kafka-data/logs/kafka.log2>&1&# 或者配置 systemd 服务(推荐)# 见本文第七章

七、验证集群健康状态

7.1 检查集群描述信息

bin/kafka-broker-api-versions.sh --bootstrap-server172.20.1.101:9092# 输出每个Broker支持的API版本(能连上就说明节点活着)

7.2 查看Controller是谁

# KRaft模式下,Controller信息存在metadata日志里# 可以通过JMX指标查看,或者用这个命令:bin/kafka-metadata-shell.sh\--snapshot/opt/kafka-data/logs/__cluster_metadata-0/00000000000000000000.log# 进入交互式Shell后,执行:>>cat/controller/id# 输出:{"id":"1"} ← 说明节点1是当前Controller

7.3 创建一个多副本Topic来验证

# 创建一个3分区、3副本的Topicbin/kafka-topics.sh--create\--topiccluster-test\--bootstrap-server172.20.1.101:9092\--partitions3\--replication-factor3# 查看Topic详情(重点看副本分配)bin/kafka-topics.sh--describe\--topiccluster-test\--bootstrap-server172.20.1.101:9092

健康的Topic描述输出

Topic: cluster-test Partition: 0 Leader: 1 Replicas: 1,2,3 Isr: 1,2,3 Topic: cluster-test Partition: 1 Leader: 2 Replicas: 2,3,1 Isr: 2,3,1 Topic: cluster-test Partition: 2 Leader: 3 Replicas: 3,1,2 Isr: 3,1,2

健康标志ReplicasIsr列表完全一致,说明所有副本都在线且同步正常。

7.4 用生产者/消费者验证端到端通信

# 终端1:启动生产者bin/kafka-console-producer.sh\--topiccluster-test\--bootstrap-server172.20.1.101:9092# 输入测试消息:>Hello from cluster!# 终端2:启动消费者(新开一个SSH会话)bin/kafka-console-consumer.sh\--topiccluster-test\--from-beginning\--bootstrap-server172.20.1.102:9092# 如果能看到 "Hello from cluster!",说明集群工作正常!

八、常见踩坑记录(血泪总结)

坑1:The cluster ID doesn't match stored clusterId

原因:存储目录已经格式化过,但用了不同的集群ID再次格式化。

解决

# 删除存储目录,重新格式化rm-rf/opt/kafka-data/logs bin/kafka-storage.shformat-t<你的集群ID>-cconfig/kraft/server.properties

坑2:Controller quit() due to startup timeout

原因:控制器仲裁节点列表配置错误,或者某些节点还没启动。

解决

  1. 检查所有节点的controller.quorum.voters配置是否一致
  2. 确保至少(节点数/2 + 1)个控制器节点在线(3节点集群需要至少2个在线)

坑3:客户端连不上Broker(Connection refused

原因advertised.listeners配置错误,客户端拿到了错误的地址。

解决

# 确保 advertsed.listeners 配置的是客户端能访问到的地址 # ❌ 错误:用localhost(客户端在其他机器上) advertised.listeners=PLAINTEXT://localhost:9092 # ✅ 正确:用实际IP或域名 advertised.listeners=PLAINTEXT://172.20.1.101:9092

坑4:Topic副本因子大于Broker数量

# 错误:只有2个Broker,却要创建副本因子=3的Topicbin/kafka-topics.sh--create\--topictest\--partitions3\--replication-factor3# 报错:Error while executing topic command : replication factor: 3 larger than available brokers: 2

解决:副本因子不能超过Broker总数。

坑5:防火墙没关,节点之间通信失败

现象:每个节点单独启动都成功,但kafka-topics.sh --describe看不到其他Broker。

解决

# 临时关闭防火墙(测试用)sudosystemctl stop firewalld# 生产环境:只开放必要端口(见第二章)

九、生产环境进阶配置

9.1 用systemd管理Kafka服务

# 创建 systemd 服务文件sudovim/etc/systemd/system/kafka.service
[Unit] Description=Apache Kafka Server Documentation=http://kafka.apache.org/documentation.html After=network.target [Service] Type=simple User=kafka Group=kafka Environment=JAVA_HOME=/usr/lib/jvm/java-17-openjdk ExecStart=/opt/kafka_2.13-3.9.0/bin/kafka-server-start.sh /opt/kafka_2.13-3.9.0/config/kraft/server.properties ExecStop=/opt/kafka_2.13-3.9.0/bin/kafka-server-stop.sh Restart=on-failure RestartSec=10 [Install] WantedBy=multi-user.target
# 启用并启动服务sudosystemctl daemon-reloadsudosystemctlenablekafkasudosystemctl start kafkasudosystemctl status kafka

9.2 控制器与Broker分离部署(推荐生产环境)

生产环境推荐架构: ┌──────────────────────────────────────────────┐ │ 专属Controller节点(3个) │ │ Broker1(Controller) Broker2(Controller) │ │ Broker3(Controller) │ │ (不存储数据,只做元数据管理) │ └──────────────────────────────────────────────┘ ↓ 元数据 ┌──────────────────────────────────────────────┐ │ 专属Broker节点(N个) │ │ Broker4 Broker5 Broker6 ... │ │ (只存储数据,不做Controller) │ └──────────────────────────────────────────────┘

配置区别:

# Controller专用节点: process.roles=controller # Broker专用节点: process.roles=broker

本篇小结

本文从零开始,完整演示了如何搭建一个三节点Kafka集群:

  1. 集群是生产环境的必选项——高可用、数据不丢、可扩展
  2. KRaft模式真香——不用再维护一套ZooKeeper集群了
  3. 配置的核心node.id(唯一)、controller.quorum.voters(所有控制器节点)、advertised.listeners(客户端能访问的地址)
  4. 验证集群健康kafka-topics.sh --describe看ISR列表
  5. 生产环境进阶:用systemd管理服务,Controller和Broker分离部署

下一篇文章,我们将深入Kafka的配置参数宝库——那些让人眼花缭乱的server.properties参数,到底该怎么配?


上一篇:【第05篇】Kafka消费者快速上手——消息消费从入门到不迷路
下一篇:【第07篇】Kafka的配置圣经——不看后悔系列


需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询