扩容后执行 reassign,六小时只完成 40%,期间 leader 选举 312 次,客户端每分钟刷新元数据 20 多次,生产端超时率到 8%。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,一次迁移的分区太多,副本复制占满 broker 之间的带宽,ISR 反复收缩又扩张,leader 跟着来回切。reassignment 没有限速,等于把全量数据同时搬一遍。
「Kafka 分区重分配」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。
kafka-reassign-partitions.sh --bootstrap-server kafka:9092 \ --reassignment-json-file plan.json --throttle 52428800 --execute kafka-reassign-partitions.sh --bootstrap-server kafka:9092 \ --verify --reassignment-json-file plan.json
权限不要一口气开到最大,先加到够用再往上试,范围小才好收。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。
具体做法是,生成迁移计划时按 broker 分批 每批不超过总分区数的 10%;加 throttle 限制复制带宽 从 50MB每秒起调;迁移期间盯 ISR 和 under-replicated 两个指标;避开业务高峰 分多个窗口执行。
最后用这个标准收尾,迁移期间 leader 切换次数低于 10 次 生产端超时率回到 0.1% 以下。
