Kafka 的 Rebalance (重平衡) 是 Consumer Group (消费者组) 中的一个核心机制,它用于在 Consumer Group 内部重新分配 Topic 的分区(Partition)所有权。 Rebalance 确保了在集群运行过程中,Consumer Group 里的所有消费者能均匀、独占地消费所有相关的分区。
1.什么是 Rebalance (重平衡)?
在 Kafka 中,一个 Consumer Group 消费一个或多个 Topic。每个分区在同一时刻只能被 Consumer Group 内的一个 Consumer 实例消费。
Rebalance 就是 Consumer Group 内部达成一致,确定“谁”来消费“哪个”分区的过程。
1.1 核心目标
负载均衡:将分区均匀地分配给组内所有健康的 Consumer 实例。
高可用性:当有 Consumer 实例失败或退出时,Rebalance 机制会将它之前负责的分区重新分配给组内其他Consumer,确保消费不会中断。
1.2 Rebalance 的过程
整个过程由 Consumer Group 的 Coordinator(协调器,通常是某个 Broker) 负责协调:
-Join Group (加入组):新的 Consumer 加入或旧的 Consumer 重新连接时,会向 Coordinator 发送请求。
-Sync Group (同步组):Coordinator 在收到所有 Consumer 的 Join 请求后,会选出一个 Leader Consumer。
-分配方案:Leader Consumer 负责制定分区到 Consumer 的映射关系(分配策略)。
-执行分配:Coordinator 将分配方案通知给所有 Consumer,各个 Consumer 按照方案开始消费新分配的分区。
2.什么情况下会出现 Rebalance?
任何导致 Consumer Group 内部成员发生变化或分区信息发生变化的操作,都会触发 Rebalance。
2.1 Consumer 成员变化
新 Consumer 加入:启动一个新的 Consumer 实例并将其加入到现有 Consumer Group 中,以增加消费能力。
Consumer 退出(正常退出):一个 Consumer 实例正常关闭,需要将其负责的分区释放出来。
Consumer 崩溃或掉线(非正常退出):
Consumer 实例在发送心跳(Heartbeat)给 Coordinator 的间隔内(session.timeout.ms)没有响应。
Coordinator 认为该 Consumer 死亡,将其踢出 Group,触发 Rebalance。
2.2 Topic/Partition 变化
Topic 分区数发生变化:如果一个 Group 正在消费的 Topic,其分区数量被手动增加,Group 必须进行 Rebalance 来分配新的分区。
Group 订阅的 Topic 列表发生变化:如果 Consumer Group 动态订阅了新的 Topic。
2.3 配置参数变化
心跳超时:如果 Consumer 停止向 Coordinator 发送心跳,并且超出了配置的 session.timeout.ms,Coordinator 将认为 Consumer 实例死亡,触发 Rebalance。
获取分区超时:如果 Consumer 在加入 Group 时,获取分区信息超时,也可能触发 Rebalance 尝试。
注意: Rebalance 是一个“Stop-The-World”操作。在 Rebalance 过程中,Consumer 组会暂停消费,这会引入短暂的消费延迟。因此,频繁的 Rebalance 是需要尽量避免的。