Kafka Partition 深度解析

从概念、原理到架构设计,一次性搞清楚 Partition 到底是什么、解决了什么问题

一句话定义

Partition(分区)是 Kafka 中 最小的并行处理单元, 一个 Topic 可以拆成多个 Partition 并行读写, 每个 Partition 内部是一个 严格有序、只能追加写入(Append-Only)的日志文件(Commit Log)

! 为什么需要 Partition?解决了什么问题?

如果 Topic 只有一个分区,所有消息只能串行读写,吞吐量受限于单台机器的 I/O 和 CPU。 Partition 的本质就是分片(Sharding),把数据拆到多个机器上并行处理,突破单机瓶颈。

问题 单分区的瓶颈

  • 单 Broker 磁盘 I/O 上限
  • 单 Broker 网络带宽上限
  • Consumer 只能单线程消费
  • 无法水平扩展
  • 故障影响整个 Topic

解决 Partition 带来的能力

  • 水平扩展:Partition 分散在多 Broker
  • 并行消费:多个 Consumer 同时消费
  • 高吞吐:充分利用集群带宽
  • 有序性保证:Partition 内严格有序
  • 高可用:Replica 副本机制
交互式可视化:Kafka Partition 架构

下方是 Kafka 集群的完整架构示意。点击 Partition 查看详情,拖动滑块调整分区数,观察数据如何分布。

Kafka 集群 Partition 分布架构(点击交互)
Partition 数: 4
Replica 因子: 2
Partition 核心原理

1. Partition 内部:Append-Only 日志

每个 Partition 在物理上对应一个日志目录,目录下有多个 Segment 文件(.log + .index)。 消息只能追加到末尾,每条消息被分配一个唯一的 Offset(偏移量),从 0 开始递增。 Offset 是 Partition 内的全局唯一ID,Consumer 通过 Offset 追踪消费进度。

Partition 内部 Segment 与 Offset 结构

2. Leader 与 Follower:读写分离

每个 Partition 有多个 Replica(副本),但只有 Leader Replica 对外提供服务(读写), 其余 Follower Replica 只负责从 Leader 拉取数据同步。 如果 Leader 挂了,Controller 会从 ISR(In-Sync Replicas)中选举新的 Leader。

Leader / Follower replica 同步机制
分区策略:消息如何分配到 Partition?

Producer 发送消息时,通过 Partitioner 决定消息写入哪个 Partition。 不同的策略直接影响有序性负载均衡

// Kafka 默认分区策略(Java)
// 1. 指定了 key → 按 key 的 hash 分配到固定 partition(保证同 key 有序)
int partition = Utils.toPositive(Utils.murmur2(key)) % numPartitions;

// 2. 没有 key → StickyPartition(尽量发往同一 partition,批次更大)
// 3. 自定义 Partitioner
class MyPartitioner implements Partitioner {
  public int partition(String topic, Object key, byte[] keyBytes,
                           Object value, byte[] valueBytes, Cluster cluster) {
    // 自定义路由逻辑
    return customRoute(key, cluster.partitionCountForTopic(topic));
  }
}

📌 轮询(Round Robin)

  • 消息均匀分散到各 Partition
  • 吞吐量最高
  • 同业务消息可能乱序
  • 适合无 key 场景

🔑 Hash(按 Key 分区)

  • 相同 key 永远到同一 Partition
  • 保证 key 级别有序性
  • 可能产生数据倾斜
  • 适合订单、用户事件等
Consumer Group 与 Partition 的关系

Kafka 保证:一个 Partition 同一时刻只能被一个 Consumer 消费。 Consumer Group 内的 Consumer 会均匀分配 Partition,实现并行消费。

Consumer Group 的 Partition 分配(点击 Consumer 查看分配详情)
Consumer 数: 3
Partition 数: 6

⚠️ 重要规则

  • 1Consumer 数 Partition 数时,每个 Consumer 至少分到 1 个 Partition
  • 2Consumer 数 Partition 数时,多余的 Consumer 会闲置(Idle)
  • 3Partition 数 Consumer 数时,会触发 Rebalance(重平衡)
  • 4每个 Partition 内的消息严格有序,但跨 Partition 不保证有序
核心要点总结
📊 实战:分区数如何规划?
分区数规划计算器(交互式)