title: “Kafka 分区 Partition 完整详解” description: “Kafka 组件/原理详解” created: 2026-06-05 tags:
- kafka
- message-queue
一、分区核心作用
- 横向扩容:Topic数据打散到多台Broker,突破单机器磁盘、网卡上限,实现集群横向扩展;
- 并行读写:生产者按分区路由发送,消费者一个分区只能被组内一个消费线程消费,分区数决定消费最大并发度;
- 高可用基础:每个分区配置多副本,分散在不同Broker,依托ISR实现故障自动切换。
公式:同一个消费组最大消费并发数 = Topic分区总数。
二、分区物理存储结构
- 一个Partition在Broker上对应一个独立目录:
{topic名称}-{分区编号} - 目录内部由多个LogSegment日志分段组成:
.log:消息实体二进制文件;.index:稀疏偏移索引(offset→文件物理位置);.timeindex:时间戳→offset索引。
- 分段滚动规则:
log.segment.bytes:单个文件达到阈值拆分新段(默认1G);log.roll.ms:写入空闲超时新建分段。
- 消息在分区内严格有序,跨分区全局无序;需要全局有序:Topic只设1个分区。
三、副本分配规则(机架感知)
创建Topic指定:replication-factor副本数(生产标配3副本)
- 一个Partition = 1个Leader + N个Follower;
- 同一分区所有副本不能部署在同一Broker;
- 开启
broker.rack机架标签时,副本自动跨机架分散,规避机架断电整体故障; - Leader负责收发消息,Follower只主动拉取日志同步数据,不处理业务IO。
四、生产者分区路由策略(消息发往哪个分区)
1. 3种内置分发规则
- 指定partition(优先):代码明确
partition=2,消息固定发2号分区; - 指定key:
key.hashCode % 分区总数,相同key路由到同一个分区,保证同key消息有序; - 无key:黏性分区(Kafka2.4+),短时间内消息批量发同一个分区,满batch后轮换分区,优化批量发送效率;老版本轮询分发。
2. 自定义分区器
实现Partitioner接口,自定义业务路由(例如按用户ID、地域分区)。
五、消费者与分区绑定关系
- 一个分区同一时间只能被消费组内一个Consumer消费;
- 消费者数>分区数:多余消费者空闲闲置;
- 消费者数<分区数:单个消费者绑定多个分区;
- 新增/减少消费者、分区扩容 → 触发Consumer Rebalance,重新分配分区。
六、分区扩容与缩容
1. 分区扩容(常用)
kafka-topics --alter --topic xxx --partitions 8 --bootstrap-server xxx
- 仅增加分区数量,原有数据不动;
- 扩容后新消息按路由策略进新分区,历史数据留在老分区;
- 扩容触发消费Rebalance。
2. 分区缩容(原生不支持直接缩分区)
Kafka原生没有直接减少分区命令,缩容方案:
- 新建少分区新Topic;
- 工具迁移数据+双写切换。
原因:缩容会破坏key哈希路由,同key数据分散,数据错乱。
七、分区数量生产规划(面试高频)
1. 分区太少弊端
- 并发上不去,消费堆积;
- 单分区磁盘IO过高,单机瓶颈。
2. 分区太多弊端
- 大量日志文件,占用文件句柄;
- Controller元数据压力暴涨、ZooKeeper/KRaft元数据同步卡顿;
- 分区Leader选举、Rebalance耗时变长。
3. 经验公式
- 基准:单Broker合理分区数 100
200;集群总分区 = Broker数 × (23); - 按吞吐:单个分区写入上限≈700KB/s~1MB/s,按业务峰值反推分区;
- 预留扩容空间,避免频繁改分区。
八、分区Leader均衡(自动/手动)
- 自动Leader均衡:
auto.leader.rebalance.enable=true,空闲时自动把Leader均匀分散到各个Broker,避免单节点承载大量Leader负载过高; - 手动:
kafka-preferred-replica-election,手动触发优先副本选主。
九、分区常见面试考点(整理成Obsidian卡片)
tags: #Kafka #分区 #面试 #原理
题型:简答/方案设计
题目:为什么消费组消费者不能超过分区数量?
精简答案:一个分区同一时刻只能被组内一个消费实例占用,超出的实例空闲。
拓展:分区是消费最小调度单元,提升并发只能扩容分区。
易错点:误以为加消费者就能无限提升消费速度。
关联:[[Kafka 分区 Partition 完整详解|消费者 Rebalance 机制]]
十、一句话总结
分区是Kafka分布式存储与并行IO的最小单元,依托多副本实现高可用、依托分区粒度实现生产路由与消费并发,分区数量直接决定集群吞吐上限。
关联文档
- Kafka 底层原理详解 — 整体架构
- 优先副本与分区重分配 — 分区迁移
- Kafka 高可用架构完整详解 — 高可用