Kafka

Kafka 分区 Partition 完整详解

·6 分钟阅读·2258 字

Kafka 分区机制、分区策略、分区重分配、分区数与并发度

📋 目录

title: “Kafka 分区 Partition 完整详解” description: “Kafka 组件/原理详解” created: 2026-06-05 tags:

  • kafka
  • message-queue

一、分区核心作用

  1. 横向扩容:Topic数据打散到多台Broker,突破单机器磁盘、网卡上限,实现集群横向扩展;
  2. 并行读写:生产者按分区路由发送,消费者一个分区只能被组内一个消费线程消费,分区数决定消费最大并发度;
  3. 高可用基础:每个分区配置多副本,分散在不同Broker,依托ISR实现故障自动切换。

公式:同一个消费组最大消费并发数 = Topic分区总数

二、分区物理存储结构

  1. 一个Partition在Broker上对应一个独立目录:{topic名称}-{分区编号}
  2. 目录内部由多个LogSegment日志分段组成:
  • .log:消息实体二进制文件;
  • .index:稀疏偏移索引(offset→文件物理位置);
  • .timeindex:时间戳→offset索引。
  1. 分段滚动规则:
  • log.segment.bytes:单个文件达到阈值拆分新段(默认1G);
  • log.roll.ms:写入空闲超时新建分段。
  1. 消息在分区内严格有序,跨分区全局无序;需要全局有序:Topic只设1个分区。

三、副本分配规则(机架感知)

创建Topic指定:replication-factor副本数(生产标配3副本)

  1. 一个Partition = 1个Leader + N个Follower;
  2. 同一分区所有副本不能部署在同一Broker
  3. 开启broker.rack机架标签时,副本自动跨机架分散,规避机架断电整体故障;
  4. Leader负责收发消息,Follower只主动拉取日志同步数据,不处理业务IO。

四、生产者分区路由策略(消息发往哪个分区)

1. 3种内置分发规则

  1. 指定partition(优先):代码明确partition=2,消息固定发2号分区;
  2. 指定keykey.hashCode % 分区总数,相同key路由到同一个分区,保证同key消息有序;
  3. 无key:黏性分区(Kafka2.4+),短时间内消息批量发同一个分区,满batch后轮换分区,优化批量发送效率;老版本轮询分发。

2. 自定义分区器

实现Partitioner接口,自定义业务路由(例如按用户ID、地域分区)。

五、消费者与分区绑定关系

  1. 一个分区同一时间只能被消费组内一个Consumer消费
  2. 消费者数>分区数:多余消费者空闲闲置;
  3. 消费者数<分区数:单个消费者绑定多个分区;
  4. 新增/减少消费者、分区扩容 → 触发Consumer Rebalance,重新分配分区。

六、分区扩容与缩容

1. 分区扩容(常用)

kafka-topics --alter --topic xxx --partitions 8 --bootstrap-server xxx
  • 仅增加分区数量,原有数据不动
  • 扩容后新消息按路由策略进新分区,历史数据留在老分区;
  • 扩容触发消费Rebalance。

2. 分区缩容(原生不支持直接缩分区)

Kafka原生没有直接减少分区命令,缩容方案:

  1. 新建少分区新Topic;
  2. 工具迁移数据+双写切换。

原因:缩容会破坏key哈希路由,同key数据分散,数据错乱。

七、分区数量生产规划(面试高频)

1. 分区太少弊端

  • 并发上不去,消费堆积;
  • 单分区磁盘IO过高,单机瓶颈。

2. 分区太多弊端

  • 大量日志文件,占用文件句柄;
  • Controller元数据压力暴涨、ZooKeeper/KRaft元数据同步卡顿;
  • 分区Leader选举、Rebalance耗时变长。

3. 经验公式

  1. 基准:单Broker合理分区数 100200;集群总分区 = Broker数 × (23);
  2. 按吞吐:单个分区写入上限≈700KB/s~1MB/s,按业务峰值反推分区;
  3. 预留扩容空间,避免频繁改分区。

八、分区Leader均衡(自动/手动)

  1. 自动Leader均衡auto.leader.rebalance.enable=true,空闲时自动把Leader均匀分散到各个Broker,避免单节点承载大量Leader负载过高;
  2. 手动:kafka-preferred-replica-election,手动触发优先副本选主。

九、分区常见面试考点(整理成Obsidian卡片)

tags: #Kafka #分区 #面试 #原理
题型:简答/方案设计
题目:为什么消费组消费者不能超过分区数量?
精简答案:一个分区同一时刻只能被组内一个消费实例占用,超出的实例空闲。
拓展:分区是消费最小调度单元,提升并发只能扩容分区。
易错点:误以为加消费者就能无限提升消费速度。
关联:[[Kafka 分区 Partition 完整详解|消费者 Rebalance 机制]]

十、一句话总结

分区是Kafka分布式存储与并行IO的最小单元,依托多副本实现高可用、依托分区粒度实现生产路由与消费并发,分区数量直接决定集群吞吐上限。


关联文档