3. Topic与Partition规划

在 Kafka 中,Topic 是逻辑概念,Partition 才是并行与存储的物理单元。分区数一旦确定,后续调整代价很高:增加分区会触发分区重分配与消费者组再平衡,减少分区几乎不可行。因此,分区规划是容量治理中最需要前置决策的一环。本节围绕四个问题展开:分区数怎么估算、分区如何分布、热点如何识别、再平衡为什么影响性能。

一、分区数估算:从吞吐与并行度反推

分区数的本质约束来自两端:生产者端要能并行写入,消费者端要能并行消费。估算时先看单分区吞吐能力。经验上,单个分区在普通机械盘上顺序写可达 50~100 MB/s,SSD 上更高;但真实瓶颈往往在副本同步、网络和页缓存。保守估算可取单分区有效写入 10~30 MB/s 作为规划基线(示例假设值,需按实际压测修正)。

设目标峰值写入吞吐为 T(MB/s),单分区有效吞吐为 t,则分区数下限为:

P_min = ceil(T / t)

示例:T = 600 MB/s,t = 20 MB/s
P_min = ceil(600 / 20) = 30 个分区

再看消费者并行度。若消费者线程数为 C,分区数应不小于 C,否则会有线程空闲。通常取 P = max(P_min, C),并预留 20%~50% 余量应对突发流量。但分区不是越多越好:每个分区对应一组文件句柄、一段索引和一次副本同步开销,分区过多会拉长 Controller 元数据管理和再平衡时间。经验上单 Broker 承载分区数控制在 2000~4000 以内较为稳妥。

二、分区分布策略:副本与 Leader 的均衡

分区分布包含两层:分区在 Broker 间的分配,以及副本的摆放。Kafka 默认使用轮询方式将分区均匀分配到 Broker,并把每个分区的副本分散到不同 Broker 上,避免同一分区的多个副本落在同一台机器。关键原则是:Leader 要均衡、副本要分散、机架要隔离。

如果 Broker 数量为 B,分区数为 P,副本因子为 R,则每个 Broker 平均承载 P/B 个分区、P×R/B 个副本。当 P 不能被 B 整除时,会出现少量 Broker 多承担一两个分区,这属于正常范围。真正需要警惕的是人为指定副本分配导致的倾斜,例如所有分区 Leader 集中在少数 Broker 上。

分区分布与副本摆放示意(P=6, B=3, R=2) Broker 1 P0 Leader P3 Follower P2 Leader P5 Follower P4 Leader P1 Follower Leader: 3 Follower: 3 Broker 2 P1 Leader P4 Follower P3 Leader P0 Follower P5 Leader P2 Follower Leader: 3 Follower: 3 Broker 3 P2 Follower P5 Leader P0 Follower P3 Leader P1 Follower P4 Leader Leader: 3 Follower: 3 每个分区副本分散在不同 Broker,Leader 均匀分布,避免单点倾斜

三、分区热点识别:从指标到根因

分区热点指某些分区的流量、存储或请求量显著高于其他分区。识别热点主要看三类指标:

  • 字节速率:用 kafka-log-dirs.sh 或 JMX 的 BytesInPerSec 按分区维度观察,若某分区持续高于均值 3 倍以上,即为写入热点。
  • 消息条数:条数不均往往源于 Key 设计问题,例如用用户 ID 做 Key 时大客户集中。
  • 请求延迟:热点分区所在 Broker 的 RequestQueueTimeMs 会明显升高,拖慢同 Broker 上其他分区。

热点根因通常有三类:一是 Key 分布倾斜,二是分区数过少导致单分区承载过高,三是副本分配不均导致某 Broker 磁盘 IO 饱和。定位时先看分区级指标,再对照 Key 分布和副本分布。

四、再平衡对性能的影响

再平衡分两种:消费者组再平衡和分区重分配。消费者组再平衡由成员增减触发,期间所有消费者暂停消费,分区数越多、成员越多,再平衡耗时越长。分区重分配由运维操作触发,会跨 Broker 迁移副本数据,占用大量网络和磁盘带宽。

再平衡期间典型现象是消费延迟(Lag)快速上升、生产端 P99 延迟抖动。控制影响的手段包括:使用静态成员(group.instance.id)减少非必要再平衡;用 StickyAssignor 或 CooperativeStickyAssignor 减少分区迁移量;分区重分配时用 kafka-reassign-partitions.sh 配合限流参数 --throttle,避免打满带宽。

分区规划的核心权衡是:分区多则并行度高、再平衡慢、元数据开销大;分区少则单分区压力大、扩展性差。建议按峰值吞吐估算下限,再结合消费者并行度取整,并预留余量,而不是一次性开到最大。

五、可参考的分区规划检查表

检查项判断依据建议动作
分区数下限峰值吞吐 / 单分区有效吞吐向上取整并预留 20%~50%
消费者并行度分区数 ≥ 消费者线程数不足时增加分区
Leader 均衡各 Broker Leader 数差异 ≤ 1用 kafka-preferred-replica-election.sh 修正
副本分散同一分区副本不在同一 Broker调整副本分配策略
热点分区单分区流量 > 均值 3 倍检查 Key 分布,必要时增加分区
再平衡频率非计划再平衡频繁发生启用静态成员与协作式分配器

分区规划不是一次性的静态决策,而是随业务增长持续校准的过程。建议在容量治理中把分区级指标纳入常规监控,当热点或再平衡频率超过阈值时,及时评估是否需要调整分区数或副本分布,避免问题积累到影响整体吞吐。