再均衡原理
再均衡rebalance
是在kafka使用中需要特别注意的一个知识点。新版kafka使用消费者协调器和组协调器对再均衡行为进行管理
消费者协调器和组协调器
kafka消费者客户端将全部消费组分成多个子集,每个消费组的子集在服务端对应一个GroupCoordinator
对其进行管理,组协调器是kafka服务端组件;而消费者协调器ConsumerCoordinator
则位于客户端的各个消费者中
ConsumerCoordinator
和GroupCoordinator
之间最重要的职责就是负责执行消费者再均衡的操作
触发再均衡的操作
- 有新的消费者加入消费组
- 有消费者宕机下线(组协调器感知不到消费者存在的统称,可能因为宕机、网络延时等)
- 有消费者主动退出消费组,如客户端主动取消订阅
- 消费组所对应的GroupCoordinator节点发生变更
- 消费组内所订阅的任一主题或者主题的分区数量发生变化
再均衡过程
这里以有新的消费者加入消费组为例,梳理再均衡的主题流程。
- 第一阶段,寻找组协调器
- 新消费者加入之后,需要确定其所加入消费组的组协调器所在broker * 消费者已保存组协调器所在broker信息,则直接进行下一步,否则:
- 消费者发送
FindCoordinatorRequest
到集群中负载最小的broker,查找组协调器所在borker
- 找到组协调器后,与之创建网络连接,以备后续通信
- 第二阶段,加入消费组
- 消费者向组协调器发送
JoinGroupRequest
,请求加入消费组,同时消费者阻塞 - 服务端组协调器接收加入消费组请求
- 选举消费组的leader
- 确定分区分配策略(每个消费者上报的
JoinGroupRequets
会携带自己支持的分区分配策略,组协调器按投票数选举最终的分区分配策略)
- 服务端发送
JoinGroupResponse
给各消费者
- 只有leader消费者会拿到最终确定的分区分配策略
- 第三阶段,同步分组信息
- leader消费者拿到分区分配策略之后,计算具体的分配方案
- 各消费者发送
SyncGroupRequest
请求给组协调器,要求同步分区方案
- leader消费者会把最终计算的分配结果放到请求中,发送给组协调器
- 组协调器拿到leader消费者传来的具体分配方案
- 将分配详情保存到kafka的默认主题
__consumer_offset
- 将各消费者的分区方案放到
SyncGroupResponse
响应中,返回给各消费者
- 第四阶段,开始工作
- 各消费者拿到自己的分区分配详情后,就准备开始工作,消费分区数据
- 正式开始前,要先从
__consumer_offset
中确认当前消费分区上次已提交的offset,并从此处开始消费