Kafka

优先副本与分区重分配

·4 分钟阅读·1448 字

Kafka 组件/原理详解

📋 目录

一、优先副本(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

  1. 自动均衡:auto.leader.rebalance.enable=true(默认开启)
    Kafka后台定时线程,在集群空闲时,触发优先副本竞选Leader,把Leader切回首选副本。

隐患:自动切换瞬间生产消费会短暂断开重连,生产环境高峰期常关闭自动均衡,改用脚本定时手动执行。

  1. 手动命令
kafka-preferred-replica-election.sh --bootstrap-server xxx

批量把所有分区Leader切回优先副本,运维低峰执行。

4.面试易错点

优先副本≠永远是当前Leader,只是分区规划的首选候选;只有触发副本选举才会成为Leader。

二、分区重分配(Partition Reassign)

1.使用场景

  1. 集群新增Broker,原有分区没有自动落到新机器,需要迁移部分分区均衡负载;
  2. 某台Broker硬件故障下线、老旧机器下架,迁移其上所有分区;
  3. 分区副本跨机架不合理,调整副本分布满足机房容灾。

2.重分配原理

  1. 编写json分配方案文件:写明topic、目标分区、目标存放broker列表;
  2. 提交重分配任务给Controller;
  3. Controller下发指令:在目标Broker上生成新Follower副本;
  4. 新Follower从原Leader全量拉取日志数据,同步完成后加入ISR;
  5. 同步完毕,可选触发Leader切换到新副本;
  6. 旧Broker上的副本数据异步删除,完成迁移。

整个过程在线热迁移,不中断生产消费

3.实操三步

  1. 生成迁移配置json
kafka-reassign-partitions --generate ...
  1. 执行迁移
kafka-reassign-partitions --execute ...
  1. 查看迁移进度
kafka-reassign-partitions --verify ...

4.生产注意事项

  • 避开业务高峰期:迁移大量分区会占用磁盘IO、带宽,引发生产消费延迟;
  • 分批迁移,不要一次性全量迁移。

三、分区副本扩容(动态增加副本数)

原生不能直接alter改副本数量,依赖分区重分配工具实现扩副本
在json配置里,给分区增加新broker到副本列表,工具自动新增Follower、同步数据。


关联文档