一、基础概念:
再均衡是指分区的所属权从一个消费者转移到另一个消费者的行为,它为消费组内具备高可用性和伸缩性提供保障,使我们可以既方便又安全地删除消费组内的消费者或往消费组内添加消费者。不过,在再均衡发生期间,消费组内的消费者无法读取消息,也就是说,在再均衡发生期间的这一小段时间内,消费组会变得不可用。 另外,当一个分区被重新分配到另一个消费者时,消费者当前的状态也会丢失。比如消费者消费完某个分区中的一部分消息时还没有来得及提交消费位移就发生了再均衡操作,之后这个分区又被分配给了消费组内的另一个消费者,原来被消费完的那部分消息又被重新消费了一遍,这就发生了重复消费。一般情况下,应尽量避免不必要的再均衡的发生。 以下几种情形会触发再均衡操作。
二、发生再均衡的时机
有新的消费者加入消费组;
有消费者下线;
有消费者主动退出消费组;
消费组对应的GroupCoorinator节点发生了变更;
消费组内所订阅的任一主题或者主题的分区数量发生变化。
reblance发生时,Group下的所有成员都会协调在一起共同参与,kafka能够保证最大公平的分配。但是在reblance过程中,Group下的所有成员实例都会停止消费,直到reblance完成。
三、Reblance执行步骤:
第一阶段:Find_GroupCoorinator
消费者需要确定它所属的消费组对应的GroupCoordinator所在的broker,并创建与该broker相互通信的网络连接。
第二阶段:Join_Group
在成功找到消费组对应的GroupCoordinator之后就进入加入消费组的阶段,在此阶段的消费者会向GroupCoordinator发送JoinGroupRequest请求,并处理响应。
第三阶段:Sync_Group
leader消费者根据在第二阶段中选举出来的分区分配策略来实施具体的分区分配。在此之后需要将分配的方案同步给各个消费者。通过GroupCoordinator来负责转发同步分配方案,各个消费者会向GroupCoordinator发送SyncGroupRequest请求来同步分配方案。
第四阶段:HeartBeat
正式消费之前,消费者还需要确定拉取消息的起始位置。
四、怎么避免无谓的reblance?
1.超过session.timeout.ms没有及时发送心跳信息,导致组成员被踢出组。
2.消费时间过长,超过max.poll.interval.ms还没有消费完本次poll的所有消息,导致 Consumer 主动发起离开组的请求。