Kafka 集群架构是一个高度分布式的系统,设计目标是为大规模数据流处理提供高吞吐、低延迟、高可用性和持久化存储。
1. 核心组件
1.1 Broker(代理节点)
-
角色:Kafka 集群由多个 Broker 组成,每个 Broker 是一个独立的 Kafka 服务器(进程),负责数据存储、消息读写和副本同步。
-
功能:
- 接收生产者(Producer)发送的消息并持久化到磁盘。
- 处理消费者(Consumer)的拉取请求,返回消息。
- 管理分区的副本同步(Leader/Follower 机制)。
- 与其他 Broker 协作实现集群元数据同步。
1.2 Topic(主题)
-
角色:逻辑上的数据分类单元,生产者向 Topic 发送消息,消费者从 Topic 订阅消息。
-
分区(Partition) :
-
每个 Topic 被划分为多个分区,分区是数据存储和并行处理的基本单位。
-
分区内的消息按顺序追加(不可变日志结构),通过 偏移量(Offset) 唯一标识每条消息的位置。
-
分区的作用:
- 水平扩展:允许 Topic 的数据分布在多个 Broker 上。
- 并行消费:消费者组(Consumer Group)中不同消费者可同时消费不同分区。
-
1.3 Producer(生产者)
-
角色:向 Kafka Topic 发送消息的客户端。
-
关键机制:
- 分区选择策略:通过轮询、哈希(Key-based)或自定义策略决定消息写入哪个分区。
- 批量发送(Batching) :合并多条消息后发送,减少网络开销。
- 可靠性配置 :通过
acks
参数控制消息持久化级别(0/1/all)。
1.4 Consumer(消费者)
-
角色:从 Topic 订阅并消费消息的客户端。
-
关键机制:
- 消费者组(Consumer Group) :多个消费者组成一个组,共同消费一个 Topic 的所有分区,实现负载均衡。
- 位移(Offset)管理 :记录消费者在每个分区的消费进度,支持自动提交(
enable.auto.commit
)或手动提交。 - 重平衡(Rebalance) :当消费者加入/离开组时,重新分配分区所有权。
1.5 ZooKeeper 或 KRaft(元数据管理)
-
ZooKeeper(旧版本) :
- 存储集群元数据(Broker 列表、Topic 配置、分区 Leader、ISR 等)。
- 协调 Controller 选举和 Broker 心跳检测。
-
KRaft(Kafka 2.8+) :
- 通过内置的 Raft 协议实现元数据管理,替代 ZooKeeper。
- 简化架构,提升元数据操作的性能和一致性。
1.6 Controller(控制器)
-
角色:集群中唯一的 Controller Broker,负责核心管理任务。
-
功能:
- 分区 Leader 选举(例如 Leader 故障时重新选举)。
- 监控 Broker 存活状态(通过 ZooKeeper 或 KRaft)。
- 触发副本同步和分区重分配。
2. 集群架构图
lua
+------------------------------------------------------------------+
| Kafka Cluster |
| +-----------+ +-----------+ +-----------+ +--------+|
| | Broker1 |<--->| Broker2 |<--->| Broker3 |<--->| BrokerN||
| +-----------+ +-----------+ +-----------+ +--------+|
| | Partition0 | Partition1 | Partition2 | |
| | (Leader) | (Follower) | (Follower) | |
| +----------------+----------------+----------------+ |
+------------------------------------------------------------------+
↑ ↑ ↑ ↑
| | | |
+---+----+ +-----+----+ +-----+----+ +-----+----+
|Producer| |Consumer1 | |Consumer2 | |ConsumerN |
+--------+ +----------+ +----------+ +----------+
3. 数据存储与副本机制
3.1 分区副本(Replica)
-
每个分区有多个副本(由
replication.factor
配置),分布在不同的 Broker 上。 -
副本角色:
- Leader 副本:处理所有读写请求,保证数据一致性。
- Follower 副本:异步从 Leader 拉取数据,作为备份。
3.2 ISR(In-Sync Replicas)
- Leader 维护一个 ISR 列表,包含所有与 Leader 数据同步的副本。
- 同步条件 :Follower 需在
replica.lag.time.max.ms
(默认 10 秒)内追上 Leader。 - 数据提交 :生产者配置
acks=all
时,需等待所有 ISR 副本确认写入。
3.3 日志存储(Log Segment)
- 消息按顺序追加到分区的日志文件中,分为多个 Segment(默认 1GB)。
- Segment 文件包括
.log
(数据)和.index
(索引),支持快速查找。
4. 高可用性与容错
4.1 Leader 选举
- Controller 监控 Broker 状态,若 Leader 副本宕机,从 ISR 中选举新 Leader。
- Unclean Leader 选举 :若 ISR 为空且允许非同步副本成为 Leader(
unclean.leader.election.enable=true
),可能丢失数据。
4.2 故障恢复
- Broker 宕机:Controller 触发分区 Leader 重新选举,Follower 副本接管。
- 数据恢复:Follower 副本从 Leader 拉取缺失数据,直至追上 ISR。
5. 集群扩展与负载均衡
- 水平扩展:通过增加 Broker 提升集群吞吐量和存储容量。
- 分区重分配 :使用
kafka-reassign-partitions.sh
工具均衡分区分布。 - 动态配置:支持在线修改 Topic 配置(如分区数、副本因子)。
6. ZooKeeper vs. KRaft 模式对比
特性 | ZooKeeper 模式 | KRaft 模式 |
---|---|---|
元数据管理 | 依赖外部 ZooKeeper 集群 | 内置 Raft 协议,自管理元数据 |
运维复杂度 | 需维护 ZooKeeper 集群 | 无需外部依赖,架构更简单 |
性能 | ZooKeeper 可能成为瓶颈(高写入场景) | 元数据分片处理,性能更高 |
适用版本 | Kafka 2.8 之前版本 | Kafka 2.8+(生产推荐 3.0+) |
7. 典型应用场景
- 日志聚合:收集分布式系统日志,供实时分析或离线处理。
- 事件驱动架构:解耦微服务,通过消息传递触发下游操作。
- 流处理:与 Kafka Streams、Flink 等框架集成,实现实时数据处理。
- 消息队列:替代传统 MQ(如 RabbitMQ),支持高吞吐场景。
总结
Kafka 集群通过分布式 Broker、分区副本、ISR 机制和 Controller 协调,实现了高吞吐、高可用和容错能力。随着 KRaft 模式的成熟,Kafka 正逐步简化架构,减少对外部组件的依赖。