Kafka

Kafka 分区 Partition 完整详解

·6 分钟阅读·2190 字

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

📋 目录

Kafka 分区 Partition 完整详解

1. 分区核心作用

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

2. 分区物理存储结构

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

3. 副本分配规则(机架感知)

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

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

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

4.1. 种内置分发规则

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

4.2. 自定义分区器

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

5. 消费者与分区绑定关系

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

6. 分区扩容与缩容

6.1. 分区扩容(常用)


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

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

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

  1. 新建少分区新Topic;
  2. 工具迁移数据+双写切换。 原因:缩容会破坏key哈希路由,同key数据分散,数据错乱。

7. 分区数量生产规划(面试高频)

7.1. 分区太少弊端

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

7.2. 分区太多弊端

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

7.3. 经验公式

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

8. 分区Leader均衡(自动/手动)

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

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


tags: #Kafka #分区 #面试 #原理

题型:简答/方案设计

题目:为什么消费组消费者不能超过分区数量?

精简答案:一个分区同一时刻只能被组内一个消费实例占用,超出的实例空闲。

拓展:分区是消费最小调度单元,提升并发只能扩容分区。

易错点:误以为加消费者就能无限提升消费速度。

关联:[[Kafka 分区 Partition 完整详解|消费者 Rebalance 机制]]

10. 一句话总结

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


关联文档

Yanche Blog

记录云原生、Linux、数据库等技术领域的学习心得,以及日常生活的思考与感悟。

© 2026 Yanche Blog. All rights reserved.

Powered by Astro