监控里 order-event 只有一个分区 BytesIn 是 12 万每秒,其余九个长期为 0,对应 broker 的磁盘 IO 到 95%,另外两台几乎空闲。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,生产端把固定值 default 当成 key,所有消息按同一个哈希落到同一分区。分区再多也用不上,单分区只能落在一台 broker 上。

「Kafka 分区热点」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。改完顺手把文档补一句,省得下次自己重新推一遍。

kafka-topics.sh --bootstrap-server kafka:9092 \
  --describe --topic order-event
kafka-run-class.sh kafka.tools.GetOffsetShell \
  --bootstrap-server kafka:9092 --topic order-event

监控和日志的时间要对上,时区不一致会多绕很大一圈。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。

具体做法是,确认 key 的取值分布 别用常量或空串;换成订单号这类离散字段 让哈希散开;确实需要保序的按订单号分组 不需要保序的直接不传 key;扩分区后观察各分区 BytesIn 是否接近。

最后用这个标准收尾,十个分区的每秒写入量接近 单台 broker 的磁盘 IO 回落到 40% 以下。

作者 9823189