Partition 分区是什么
分区是 Kafka 里并行与顺序的基本单位:一个主题被拆成若干分区,分区分散在不同 Broker 上,生产与消费都以分区为单位并行。分区内消息严格按追加顺序排列,跨分区不保证任何顺序关系。扩容吞吐的手段就是增加分区。
分区键决定顺序边界
生产者未指定键时,消息按黏性策略分布到各分区;指定键后,同一个键的消息固定落入同一个分区(哈希取模)。因此「同一业务实体的事件必须有序」的需求,实现方式就是把业务主键作为消息键,让它们排在同一条队列里。
基本信息
| 作用 | 并行读写与水平扩展的基本单位 |
|---|---|
| 顺序性 | 分区内按写入顺序追加,跨分区无序 |
| 消费并行 | 一个分区同一时刻只被消费组内一个成员消费 |
| 副本 | 每分区有一个 Leader 与若干 Follower,分布在不同的 Broker |
| 扩容 | 分区数只能增加不能减少,增加会打乱既有键的分区归属 |
describe 输出逐列读法
| 列 | 含义 | 正常/异常 |
|---|---|---|
| Topic | 主题名 | 与预期一致 |
| Partition | 分区编号,从 0 开始连续 | 出现断号说明元数据异常 |
| Leader | 当前处理读写的 Broker 编号 | 为 -1 或 none 表示该分区不可用 |
| Replicas | 副本所在 Broker 列表 | 数量等于副本因子 |
| Isr | 与 Leader 保持同步的副本集合 | 短于 Replicas 说明有副本掉队 |
典型使用场景
- 提高吞吐:分区数决定消费并行度的上限,扩容时增加 Broker 与分区
- 保证顺序:按订单号、用户号分区,让同一实体的变更落在同一分区
- 隔离流量:把不同业务或不同优先级的消息拆到不同主题与分区
- 检查副本健康:describe 观察 Isr 是否持续短于 Replicas
- 容量与负载均衡:确认各分区的 Leader 在 Broker 间分布均匀
查看分区分布与副本状态
查看分区分布与副本状态
# 逐分区打印 Leader、副本与 ISR
kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic orders
# Topic: orders Partition: 0 Leader: 2 Replicas: 2,3,1 Isr: 2,3,1
# Topic: orders Partition: 1 Leader: 3 Replicas: 3,1,2 Isr: 3,1 ← 2 号副本未同步
# 只列出有副本掉队的分区,巡检用
kafka-topics.sh --bootstrap-server localhost:9092 --describe --under-replicated-partitions生产时指定分区键
生产时指定分区键
# 用业务键作为消息键,同一键的消息固定进入同一分区,从而保证局部有序
# Java 客户端
producer.send(new ProducerRecord<String, String>("orders", order.getOrderId(), json));
# 命令行验证键与分区的对应关系
kafka-console-producer.sh --bootstrap-server localhost:9092 --topic orders \
--property parse.key=true --property key.separator=:消费者数量超过分区数后,多出来的实例不会被分配任何分区,只会空转。判断「要不要加消费者」之前,先确认分区数是否够用。
增加分区会改变键到分区的映射:既有键的消息可能落到与之前不同的分区,跨扩容点的顺序性会被打破。有严格有序要求的主题,宁可一次建足分区。