一、优先副本(Preferred Replica)
1.定义
创建Topic时,副本列表第一个位置的副本 = 优先副本。
例:P0副本排布 [broker1,broker2,broker3],broker1是优先副本。
设计初衷:分区Leader理想状态优先落在优先副本上,实现全集群Leader负载均匀分布。
创建分区时Controller按照副本分配算法,打散所有分区的优先副本到不同Broker,均衡初始Leader。
2.优先副本失衡场景
Broker宕机 → 分区从ISR里另选新Leader;
故障节点恢复上线后,该分区Leader还在别的Follower节点,优先副本闲置不做Leader,长期积累出现:部分Broker承载大量Leader,部分Broker几乎没有Leader,磁盘、网卡负载严重不均。
3.自动/手动均衡Leader
- 自动均衡:
auto.leader.rebalance.enable=true(默认开启)
Kafka后台定时线程,在集群空闲时,触发优先副本竞选Leader,把Leader切回首选副本。
隐患:自动切换瞬间生产消费会短暂断开重连,生产环境高峰期常关闭自动均衡,改用脚本定时手动执行。
- 手动命令
kafka-preferred-replica-election.sh --bootstrap-server xxx
批量把所有分区Leader切回优先副本,运维低峰执行。
4.面试易错点
优先副本≠永远是当前Leader,只是分区规划的首选候选;只有触发副本选举才会成为Leader。
二、分区重分配(Partition Reassign)
1.使用场景
- 集群新增Broker,原有分区没有自动落到新机器,需要迁移部分分区均衡负载;
- 某台Broker硬件故障下线、老旧机器下架,迁移其上所有分区;
- 分区副本跨机架不合理,调整副本分布满足机房容灾。
2.重分配原理
- 编写json分配方案文件:写明topic、目标分区、目标存放broker列表;
- 提交重分配任务给Controller;
- Controller下发指令:在目标Broker上生成新Follower副本;
- 新Follower从原Leader全量拉取日志数据,同步完成后加入ISR;
- 同步完毕,可选触发Leader切换到新副本;
- 旧Broker上的副本数据异步删除,完成迁移。
整个过程在线热迁移,不中断生产消费。
3.实操三步
- 生成迁移配置json
kafka-reassign-partitions --generate ...
- 执行迁移
kafka-reassign-partitions --execute ...
- 查看迁移进度
kafka-reassign-partitions --verify ...
4.生产注意事项
- 避开业务高峰期:迁移大量分区会占用磁盘IO、带宽,引发生产消费延迟;
- 分批迁移,不要一次性全量迁移。
三、分区副本扩容(动态增加副本数)
原生不能直接alter改副本数量,依赖分区重分配工具实现扩副本:
在json配置里,给分区增加新broker到副本列表,工具自动新增Follower、同步数据。
关联文档
- Kafka 高可用架构完整详解 — 高可用机制
- Kafka 分区 Partition 完整详解 — 分区机制