Kafka 架构详解(底层原理)
Kafka 主要由 5 大核心组件构成:
Producer -> Broker(Topic/Partition/Replica) -> Consumer Group
^
|
Controller
^
|
存储层
一个 Kafka 集群由多个 Broker(节点)组成,每个 Broker 负责:
- Topic 与 Partition 的存储
- 读写请求处理
- Leader 选举
- 与 Controller 通信(位置信息、元数据)
它是 Kafka 的运行核心。
Topic:消息集合(逻辑概念)
Partition:物理分片(真正存储消息的地方)
例如:
- Topic: order
- Partition 数量: 3
- 对应路径:
- /kafka-logs/order-0
- /kafka-logs/order-1
- /kafka-logs/order-2
为什么 Kafka 使用 Partition?
因为单线程写单文件速度有限。但:
“多个 Partition = 多个日志文件 = 多线程 + 顺序写 = 吞吐线性提升”
Kafka 的扩容本质是:
增加 Partition 数量(或 Broker 数量)
每个 Partition 底层就是一个 追加写日志:
message-0
message-1
message-2
...
message-N
写入方式:
- 完全顺序写,磁盘可以满速
- 利用 OS PageCache 进行内存缓存
- 使用零拷贝(zero-copy)提升读取速度
Kafka 不支持随机删除消息,而是通过段切分 + 定期清理:
- 以一定大小切分 Segment(log + index)
- 到了保留时间或大小自动删除旧文件
每个 Partition 都有多份副本,默认:
replicas = 3
包含:
- Leader:读写的核心
- Follower:同步 Leader 数据
例如:
order-0
Leader: Broker1
Follower: Broker2, Broker3
Leader 崩溃时,Controller 会挑一个 Follower 成为新的 Leader。
ISR = 同步进度足够快的副本集合
- (被认为是“健康副本”)
写入消息时,Kafka 的 acks 机制依赖 ISR:
- acks=all -> Leader + ISR 中所有副本都写入成功才确认
- 当 ISR 掉到只剩一个副本时,Kafka 存在数据丢失风险
ISR 的存在避免了慢副本拖慢整体吞吐。
Controller 节点负责:
- Partition Leader 选举
- 元数据管理(topic、分区、副本)
- Broker 上线/下线管理
- 通知 Producer/Consumer 更新元数据
如果 Controller 宕机,会选举一个新的 Controller,整个过程对业务透明。
Producer -> Broker Leader -> Follower -> ACK 返回
详细步骤:
- Producer 从 Controller 获取 meta 信息(Leader 节点位置)
- Producer 根据分区器规则选择分区
- Producer 直接将数据写入 Leader Partition
- Leader 写入本地 Log(顺序写 + PageCache)
- Follower 从 Leader 拉取数据同步
- 当满足 acks 条件后,Leader 返回 ACK
Kafka 的高吞吐源自:
- 分区并行写
- 顺序写磁盘
- PageCache
- 批量发送(batch)
- 压缩(zstd/lz4)
Consumer -> Broker Leader -> Zero-Copy -> Network -> Consumer
Follower 默认只用于同步,不接收 Consumer 请求。
- (除非开启 “Follower Fetching”)
读取流程:
- Consumer 从 Broker 获取 offset 对应的数据
- Leader 使用 index 找到 file offset
- 使用 sendfile() 执行零拷贝,直接从文件发送至 socket
- Consumer 收到数据并提交 offset
高性能来源:
- Index + Log 文件格式简单
- 顺序读取
- Zero-Copy(不用经过用户态->内核态来回拷贝)
Kafka 不记录“消息是否消费”,只记录:
- Consumer Group 的消费位置(offset)
Offset 存放于:
- 旧版本:ZooKeeper
- 现在:Kafka 内置 Topic __consumer_offsets
好处:
- 高性能
- 多副本持久化
- 可回溯消费(重置 offset)
当以下任一场景触发:
- Consumer 加入 Group
- Consumer 退出 Group
- 分区数量变化
Kafka 会自动进行 Rebalance。
- Rebalance 会暂停消费 -> 需要避免频繁触发
- (常用心跳、SessionTimeout 调优)
Kafka 3.3 后进入生产可用阶段。
变化:
| 模式 | 元数据存储 | 是否依赖 ZK |
|---|---|---|
| 旧架构 | Zookeeper | 是 |
| 新架构 KRaft | Kafka 内置元数据日志 | 否 |
KRaft 的好处:
- 无需单独部署 ZK
- 启动速度更快
- 元数据一致性更强
- 架构更简单,未来主流
KRaft 的组件:
- Controller Quorum(多数派选举)
- Broker(共享元数据日志)
- 顺序写磁盘(commit log)
- 零拷贝(sendfile)
- PageCache(利用 OS 缓存)
- 分区(Partition)并行写入
- 批处理(Batch)+ 压缩
- 副本异步复制(保证吞吐)
- 消费者端低开销 offset 管理
这些特性让 Kafka 轻松达到百万级吞吐。
- 副本(Replica)
- ISR 同步集
- Leader 选举
- Controller 管理
- 消费者 Group 冗余
Kafka 的高可用保障来自:
“分布式 + 多副本 + 自动选举 + 元数据一致性”
+------------------------+
Producer -----> | Leader Partition | ----> Consumer
| (Commit Log + Index) |
+-----------+------------+
|
Replication (ISR)
|
Followers
- Kafka 的底层完全基于追加写日志(commit log)
- Partition 是 Kafka 高吞吐的本质
- 分区内有序,分区间无序
- 多副本提高可用性而不是吞吐
- ISR 保证强一致(acks=all)
- Producer -> Leader 写入
- Follower 异步同步 Leader
- Consumer 只读 Leader(默认)
- Zero-copy 提升消费速度
- Offset 是 Consumer 的进度
- Rebalance 会暂停消费
- Controller 管理元数据和选举
- Kafka 通过批处理和压缩提升效率
- 磁盘顺序写 = 万兆吞吐
- KRaft 架构正在成为未来主流