kafka消费者组重平衡分析

一 概念

一个consumer group 通过一定的分配算法来分配消费订阅的topic的所有分区。具体有协调者完成重平滑流程。

二 触发条件

组成员发送变更,如consumer增加或减少如consumer进程崩溃、consumer进程所在机器宕机、consumer异常比如poll间隔太久;

组订阅的topic数变更,如使用基于正则的订阅,当匹配正则的新的topic创建时会触发;

组订阅topic的分区数变化,如使用命令增加了topic的分区数。

三 分区分配算法

range算法

round-roubin算法

四 重平衡协议

group与协调者共同使用协议完成组的重平衡,主要包括5个协议:

1 JointGroup: consumer请求加入组,consumer->协调者

2 LeaveGroup: consumer主动请求立刻组,consumer->协调者

3 DescribeGroup: 描述组信息如成员/订阅信息/分配方案,管理员>协调者

4 SyncGroup: 群主(第一个加入的consumer)把分配方案同步到组内所有成员,consumer LEADER->协调者

4 HeartBeat: consumer定期向协调者发送心跳,表面自己依然运行。每个consumer根据心态响应中是否包含重平衡标注决定是否开启新一轮平衡。consumer->协调者

 

五 重平衡流程

5.1 确定协调者所在的broker

确定协调者的算法与确定offset被提交到__consumer_offsets的目标分区算法相同:

计算abs(group_id)%offtsets.topic.num.partions(默认是50)设为a

寻找__consumer_offstes主题分区a对应的LEADER副本所在broker(通过consumer发送MetaDataRequest请求到任意一个broke即可,具体参考https://blog.csdn.net/yanerhao/article/details/106120753

然后consumer连接与该broker的socket连接。

5.2 开始重平衡(加入组和同步更新)

1 重平衡条件触发,协调者在所有组内consumer的心跳响应中加入重平衡标注

2 加入组。组内consumer收到响应后开始重平衡。向协调者发送JointGroup请求,当收集完所有JointGroup请求后,从中选择第一个加入的consumer作为群主,并把所有成员信息以及订阅的信息发送给群主。故可以看到协调者是一个broker,群主是一个consumer,是由群主而非协调者完成分区分配,协调者主要是协调完成重平衡。

3 分区分配。群主获取所有consumer和分区后采用range或round-roubin或其他算法完成所有topic的所有分区与组内消费组的分配。

4 同步分区结果。群主会把分区分配方案装入SyncGroup请求发送给协调者,再由协调者从请求中把属于每个consumer的方案单独抽出来作为SyncGroup响应下发给所有consumer。故SyncGroup请求是所有consumer发给协调者但只有群主的才有方案,SyncGroup响应是协调者下方给所有consumer。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值