提示:本文原创作品,良心制作,干货为主,简洁清晰,一看就会
文章目录
- 前言
- 一、Kafka核心概念
-
- [1.1 基础角色组件](#1.1 基础角色组件)
- [1.2 Topic](#1.2 Topic)
- [1.3 消费组 Consumer Group](#1.3 消费组 Consumer Group)
- [1.4 分区 Partition(横向扩容核心)](#1.4 分区 Partition(横向扩容核心))
- [1.5 副本 Replication(高可用核心)](#1.5 副本 Replication(高可用核心))
- [1.6 Leader选举机制](#1.6 Leader选举机制)
- 二、基于KRaft模式的集群
-
- [2.1 安装jdk](#2.1 安装jdk)
- [2.2 安装kakfa](#2.2 安装kakfa)
- [2.3 测试kafka集群](#2.3 测试kafka集群)
前言
Kafka 作为主流的分布式消息中间件,被广泛应用于日志收集、异步解耦、流量削峰等业务场景。自 Kafka 2.8.0 版本正式推出 KRaft 内置 Raft 协议后,彻底移除了 ZooKeeper 依赖,简化架构、提升集群稳定性与性能。为帮助快速掌握新版 Kafka,本文先系统讲解 Kafka 核心基础原理,再手把手完成 KRaft 模式三节点集群搭建与测试,实现原理理解与工程落地一体化
一、Kafka核心概念
1.1 基础角色组件
Producer生产者 :消息入口,负责向Broker推送消息
Consumer消费者 :订阅Topic,拉取并处理消息
Broker :Kafka服务实例,集群内每个Broker拥有唯一编号,一台服务器可部署多个Broker
Controller :集群总管理者(集群单点,可故障转移),依靠Zookeeper监听集群变更,负责Topic增删、分区分配、Broker上下线、Leader选举等集群管控
Zookeeper:存储集群元数据,为Controller提供集群状态监听能力
旧版靠独立 ZooKeeper外接存储元数据、实现 Controller 与 Leader 选举,多一套外部组件、链路长、大规模集群易出现 ZK 瓶颈;
Kafka 2.8.0 起推出 KRaft 模式,内置 Raft 协议管理元数据与 Leader 选举,不再依赖 ZooKeeper,用统一 Raft 日志管理全部集群元数据,选举、故障处理链路更短,部署简单、性能与稳定性更好
1.2 Topic
Topic是消息分类载体,类比数据库表/Redis List
- 物理上拆分存储在不同文件夹,逻辑上对消息分组
- 生产者发消息、消费者读消息只需指定Topic,无需关心底层存储节点
- 单个Broker可承载多个Topic
1.3 消费组 Consumer Group
- 每个消费者归属一个消费组,未指定则使用默认组
- 同一条Topic消息,
同一消费组内仅一个消费者能消费(单播);多个消费组可独立消费同一条消息(多播)
1.4 分区 Partition(横向扩容核心)
- 一个Topic会切分为多个Partition,以文件夹形式存储数据与索引
- 作用:实现负载均衡、横向扩容存储、多节点并行读写,大幅提升吞吐
- 有序规则:
单个Partition内消息有序,不同Partition之间全局无序 - 最佳实践:Partition总数不超过集群Broker节点数
1.5 副本 Replication(高可用核心)
- 副本包含1个Leader主分片 + N个Follower从分片,副本总数建议≥2
- 读写仅走Leader,Follower同步数据做容灾,副本不能跨超过集群节点数量
- 和ES副本区别:Kafka副本总数包含主分片,ES副本仅指从分片
如下图:

左侧 Producer 生产者
多个生产者,红色线条只把消息发给 分区Leader副本,不发Follower
中间 Kafka Cluster 集群(3台Broker)
Topic 分区副本,每个Topic分区分1个Leader、多个Follower
Leader:负责所有读写
Follower:异步同步Leader数据,故障时竞选新Leader
虚线是副本之间的数据同步
分区分散在不同Broker,实现高可用
右侧 Consumer 消费者组
同一消费组(Group A):一个分区只能被组内一个消费者消费,图中A组2个消费者对应Topic A两个分区
不同消费组(Group B):独立消费全量数据,互不干扰
蓝紫色虚线:消费者从分区Leader拉取消息
底部 ZooKeeper/Raft协议
存储集群元数据:Broker、分区Leader、消费位点、控制器信息,管控集群状态
新版kafka内置 Raft 协议管理元数据与 Leader 选举,不再依赖 ZooKeeper
1.6 Leader选举机制

旧版:Leader宕机后ZooKeeper感知会话过期,通知副本选举,从ISR(当前分区 Leader + 所有跟得上 Leader、数据完全同步的 Follower)同步副本集合里挑选数据最新副本作为新Leader,随后同步更新集群元数据
新版:内置Raft协议管理元数据与Leader选举。Kafka分区采用Leader读写、Follower异步复制的架构保障高可用,允许Leader未等全部副本同步就返回写入确认,若此时Leader故障会丢失未同步数据,引发一致性问题;若要开启强一致性,需配置acks=-1/all等待全部ISR副本同步、同时将min.insync.replicas设为大于1,确保至少多个副本落盘才确认写入,以此规避数据丢失
二、基于KRaft模式的集群
本文仅演示 KRaft 模式集群搭建流程,若需了解 ZooKeeper 模式集群部署步骤,可参考下文 2.2 小节
基于Zookeeper模式的集群:https://blog.csdn.net/m0_63756214/article/details/157254529?spm=1001.2014.3001.5502
实验环境
| 主机名 | IP | 用途 |
|---|---|---|
| kafka-1 | 192.168.13.140 | KRaft控制器节点 + 数据Broker节点 |
| kafka-2 | 192.168.13.141 | KRaft控制器节点 + 数据Broker节点 |
| kafka-3 | 192.168.13.142 | KRaft控制器节点 + 数据Broker节点 |
KRaft三控三数据:3台机器全部参与Raft元数据选举,同时负责业务消息存储,无需额外ZK
2.1 安装jdk
JDK官网:https://www.oracle.com/java/technologies/downloads/
kafka每台机器都要安装
yaml
root@kafka-1:~# wget https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.tar.gz
root@kafka-1:~# ls
jdk-21_linux-x64_bin.tar.gz
root@kafka-1:~# tar xf jdk-21_linux-x64_bin.tar.gz
root@kafka-1:~# mv jdk-21.0.12 /usr/local/
root@kafka-1:~# mv /usr/local/jdk-21.0.12/ /usr/local/java
root@kafka-1:~# vim /etc/profile # 增加以下两行
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:$PATH
root@kafka-1:~# source /etc/profile
root@kafka-1:~# java --version
java 21.0.12 2026-07-21 LTS
Java(TM) SE Runtime Environment (build 21.0.12+7-LTS-205)
Java HotSpot(TM) 64-Bit Server VM (build 21.0.12+7-LTS-205, mixed mode, sharing)
2.2 安装kakfa
清华源镜像:https://mirrors.tuna.tsinghua.edu.cn/apache/kafka
yaml
## 1. 域名解析
root@kafka-1:~# vim /etc/hosts
192.168.13.140 kafka-1
192.168.13.141 kafka-2
192.168.13.142 kafka-3
## 2. 下载kafka
root@kafka-1:~# wget https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/4.1.2/kafka_2.13-4.1.2.tgz
root@kafka-1:~# tar xf kafka_2.13-4.1.2.tgz -C /usr/local/
## 3. 创建日志存储目录
root@kafka-1:~# mkdir /data/logs -p
yaml
## 4. 修改配置文件
root@kafka-1:~# vim /usr/local/kafka_2.13-4.1.2/config/server.properties
process.roles=broker,controller
# 节点唯一ID,三台机器分别配置1、2、3,不可重复
node.id=1
# KRaft控制器集群引导地址
controller.quorum.bootstrap.servers=kafka-1:9093,kafka-2:9093,kafka-3:9093
# KRaft投票节点清单,格式:节点ID@主机:控制器端口
controller.quorum.voters=1@kafka-1:9093,2@kafka-2:9093,3@kafka-3:9093
# 监听端口配置:PLAINTEXT业务消息端口9092,CONTROLLER控制器内部通信端口9093,0.0.0.0监听所有网卡
listeners=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093
inter.broker.listener.name=PLAINTEXT
# 对外暴露访问地址,生产者/消费者连接用本机IP,每台kafka绑定自己的ip
advertised.listeners=PLAINTEXT://192.168.13.140:9092,CONTROLLER://192.168.13.140:9093
controller.listener.names=CONTROLLER
# Kafka消息日志持久化存储目录,分区数据全部存放于此
log.dirs=/data/logs
# 消费偏移量内置主题的副本数3,集群3节点配套此配置
offsets.topic.replication.factor=3
yaml
## 5. 生成集群唯一ID
root@kafka-1:~# /usr/local/kafka_2.13-4.1.2/bin/kafka-storage.sh random-uuid
HOIs3Cw6RZ6K-1h7mz5Gig
## 6. 初始化元数据存储,每台kafka都要执行
root@kafka-1:~# /usr/local/kafka_2.13-4.1.2/bin/kafka-storage.sh format -t HOIs3Cw6RZ6K-1h7mz5Gig -c /usr/local/kafka_2.13-4.1.2/config/server.properties
yaml
## 7. 后台启动kafka
root@kafka-1:~# /usr/local/kafka_2.13-4.1.2/bin/kafka-server-start.sh -daemon /usr/local/kafka_2.13-4.1.2/config/server.properties
## 8. 查看日志,端口,确保9092/9093开启
root@kafka-1:~# cat /usr/local/kafka_2.13-4.1.2/logs/server.log
root@kafka-1:~# netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 946/systemd-resolve
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1215/sshd
tcp6 0 0 :::22 :::* LISTEN 1215/sshd
tcp6 0 0 :::9092 :::* LISTEN 7809/java
tcp6 0 0 :::9093 :::* LISTEN 7809/java
tcp6 0 0 :::43883 :::* LISTEN 7809/java
2.3 测试kafka集群
yaml
## 在一台kafka上创建测试话题
root@kafka-1:~# /usr/local/kafka_2.13-4.1.2/bin/kafka-topics.sh --create --topic test --partitions 3 --replication-factor 3 --bootstrap-server kafka-1:9092
## 在其他机器上可以看到刚才创建的话题
root@kafka-2:~# /usr/local/kafka_2.13-4.1.2/bin/kafka-topics.sh --list --bootstrap-server kafka-2:9092
test
yaml
## 生产者生产消息
root@kafka-1:~# /usr/local/kafka_2.13-4.1.2/bin/kafka-console-producer.sh --bootstrap-server kafka-1:9092 --topic test
## 消费者消费消息,kafka2和kafka3都能各自消费一遍
root@kafka-2:~# /usr/local/kafka_2.13-4.1.2/bin/kafka-console-consumer.sh --bootstrap-server kafka-2:9092 --topic test --from-beginning

到此,基于KRaft模式的集群搭建完毕!
注:
文中若有疏漏,欢迎大家指正赐教。
本文为100%原创,转载请务必标注原创作者,尊重劳动成果。
求赞、求关注、求评论!你的支持是我更新的最大动力,评论区等你~