kafka-rebalance再均衡(重平衡)

回顾

  • 一个主题可以有多个分区
  • 消费组中,可以有多个消费者
  • 一个分区只能被 同一个 消费者组中的 一个 消费者消费
  • 一个分区可被不同消费者组消费
  • 一个消费者可消费多个分区
可行 不可行

rebalance再均衡(重平衡)

如果 消费者宕机、有新的消费者会加入,导致消费者消费分区会有调整
像这种,将分区的所有权从一个消费者转移到其他消费者的行为称为 再均衡(重平衡,rebalance)。

什么时候触发再均衡

主要有三个:

  • 有新的消费者加入消费组、或已有消费者主动离开组

  • 订阅主题数发生变化,当消费者组使用正则表达式订阅主题,而恰好又新建了对应的主题,就会触发重平衡

  • 订阅主题的分区数发生变更。目前kafka只支持增加分区(如果支持删除分区,那么删除分区的数据如何处理是个问题,所以目前不支持)

其他:

  • 消费者超过 session 时间未发送心跳(已有 consumer 崩溃了)

  • 一次 poll() 之后的消息处理时间超过了 max.poll.interval.ms 的配置时间,因为一次 poll() 处理完才会触发下次 poll() (已有 consumer 崩溃了)

Coordinator 协调器

在Kafka中,每一台Broker上都有一个 协调器,负责组成员管理、再均衡和提交位移管理等工作。如果有 N 台Broker,那就有 N 个协调者组件,而一个消费组只需一个协调者进行服务

如何进行组内分区分配

三种分配策略:

  • RangeAssignor
  • RoundRobinAssignor
  • StickyAssignor

详见 链接

重平衡流程

在消费者端,重平衡分为两个步骤:

  • 加入组,对应 JoinGroup 请求
  • 等待消费者组的领导者(Leader Consumer)分配方案,对应 SyncGroup 请求

发送 JoinGroup 请求

  1. 当组内成员加入组时,向协调者发送 JoinGroup 请求,请求中会含有订阅的主题信息

  2. 消费者领导:通常情况下,第一个发送 JoinGroup 请求的成员自动成为领导者。

  3. 等待 rebalance.timeout.ms 时间,收集全部成员的 JoinGroup 请求

    • 将订阅信息放在 JoinGroup 响应中,发送给 消费者领导,并告知他成为 领导
    • 同时也会发送 JoinGroup 响应给其他消费者,通知成功入组

发送 SyncGroup 请求

  1. 消费者领导 收到 JoinGroup 响应后,根据消费者的订阅信息制定 分区分配方案,把方案放在 SyncGroup 请求中,发送给协调者。

  2. 普通消费者在收到响应后,则直接发送 SyncGroup 请求,等待分配方案

  3. 协调者收到分配方案后,再通过 SyncGroup 响应把分配方案发给所有消费者,所有消费者就知道自己该消费哪些分区了

当所有消费者收到分配方案后,就意味着再均衡的结束,可以正常开始消费工作了。

缺点

重平衡是一把双刃剑,它为消费者群组带来高可用性和伸缩性的同时,还有有一些明显的缺点:

重平衡过程中,消费者无法从kafka消费消息,如果kafka集群节点较多,比如数百个,那重平衡可能会耗时极多。数分钟到数小时都有可能,而这段时间kafka基本处于不可用状态。

在实际环境中,应该尽量避免重平衡发生。

参考:
https://blog.csdn.net/u012813201/article/details/116169880
https://blog.csdn.net/qq_31960623/article/details/119805824
https://blog.csdn.net/ko0491/article/details/109674124
https://www.cnblogs.com/listenfwind/p/12662968.html
https://blog.csdn.net/qq_21383435/article/details/108720155


原文出处:/show_1IX204Orw6f5.html