再均衡原理

再均衡rebalance是在kafka使用中需要特别注意的一个知识点。新版kafka使用消费者协调器和组协调器对再均衡行为进行管理

消费者协调器和组协调器

kafka消费者客户端将全部消费组分成多个子集,每个消费组的子集在服务端对应一个GroupCoordinator对其进行管理,组协调器是kafka服务端组件;而消费者协调器ConsumerCoordinator则位于客户端的各个消费者中

ConsumerCoordinatorGroupCoordinator之间最重要的职责就是负责执行消费者再均衡的操作

触发再均衡的操作

  1. 有新的消费者加入消费组
  2. 有消费者宕机下线(组协调器感知不到消费者存在的统称,可能因为宕机、网络延时等)
  3. 有消费者主动退出消费组,如客户端主动取消订阅
  4. 消费组所对应的GroupCoordinator节点发生变更
  5. 消费组内所订阅的任一主题或者主题的分区数量发生变化

再均衡过程

这里以有新的消费者加入消费组为例,梳理再均衡的主题流程。

  1. 第一阶段,寻找组协调器
  • 新消费者加入之后,需要确定其所加入消费组的组协调器所在broker * 消费者已保存组协调器所在broker信息,则直接进行下一步,否则:
  • 消费者发送FindCoordinatorRequest到集群中负载最小的broker,查找组协调器所在borker
  • 找到组协调器后,与之创建网络连接,以备后续通信
  1. 第二阶段,加入消费组
  • 消费者向组协调器发送JoinGroupRequest,请求加入消费组,同时消费者阻塞
  • 服务端组协调器接收加入消费组请求
  • 选举消费组的leader
  • 确定分区分配策略(每个消费者上报的JoinGroupRequets会携带自己支持的分区分配策略,组协调器按投票数选举最终的分区分配策略)
  • 服务端发送JoinGroupResponse给各消费者
  • 只有leader消费者会拿到最终确定的分区分配策略
  1. 第三阶段,同步分组信息
  • leader消费者拿到分区分配策略之后,计算具体的分配方案
  • 各消费者发送SyncGroupRequest请求给组协调器,要求同步分区方案
  • leader消费者会把最终计算的分配结果放到请求中,发送给组协调器
  • 组协调器拿到leader消费者传来的具体分配方案
  • 将分配详情保存到kafka的默认主题__consumer_offset
  • 将各消费者的分区方案放到SyncGroupResponse响应中,返回给各消费者
  1. 第四阶段,开始工作
  • 各消费者拿到自己的分区分配详情后,就准备开始工作,消费分区数据
  • 正式开始前,要先从__consumer_offset中确认当前消费分区上次已提交的offset,并从此处开始消费