集群架构

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. 典型应用场景

  1. 日志聚合:收集分布式系统日志,供实时分析或离线处理。
  2. 事件驱动架构:解耦微服务,通过消息传递触发下游操作。
  3. 流处理:与 Kafka Streams、Flink 等框架集成,实现实时数据处理。
  4. 消息队列:替代传统 MQ(如 RabbitMQ),支持高吞吐场景。

总结

Kafka 集群通过分布式 Broker、分区副本、ISR 机制和 Controller 协调,实现了高吞吐、高可用和容错能力。随着 KRaft 模式的成熟,Kafka 正逐步简化架构,减少对外部组件的依赖。

相关推荐
初次攀爬者11 小时前
Kafka + KRaft模式架构基础介绍
后端·kafka
初次攀爬者12 小时前
Kafka + ZooKeeper架构基础介绍
后端·zookeeper·kafka
初次攀爬者12 小时前
Kafka 基础介绍
spring boot·kafka·消息队列
DemonAvenger4 天前
Kafka性能调优:从参数配置到硬件选择的全方位指南
性能优化·kafka·消息队列
yumgpkpm6 天前
AI视频生成:Wan 2.2(阿里通义万相)在华为昇腾下的部署?
人工智能·hadoop·elasticsearch·zookeeper·flink·kafka·cloudera
予枫的编程笔记6 天前
【Kafka高级篇】避开Kafka原生重试坑,Java业务端自建DLQ体系,让消息不丢失、不积压
java·kafka·死信队列·消息中间件·消息重试·dlq·java业务开发
倚肆6 天前
在 Windows Docker 中安装 Kafka 并映射 Windows 端口
docker·kafka
Sheffield6 天前
如果把ZooKeeper按字面意思比作动物园管理员……
elasticsearch·zookeeper·kafka
雪碧聊技术6 天前
kafka的下载、安装、启动
kafka