1.什么是Rebalance重新负载?
Rebalance,即对 Kafka 中的分区进行重新分配的过程。如需详细了解 Kafka 的分区分配策略,请点击链接跳转了解更多:8.Kafka 分区分配策略
2.什么时候触发Rebalance操作
当出现以下几种情况时,Kafka 会进行一次重新分区分配操作,即 Kafka 消费者端的 Rebalance 操作
① 同一个 consumer 消费者组 group.id 中,新增了消费者进来,会执行 Rebalance 操作
② 消费者离开当期所属的 consumer group组。比如 主动停机 或者 宕机
③ 分区数量发生变化时(即 topic 的分区数量发生变化时)
④ 消费者主动取消订阅
3.Rebalance操作过程
3.1 由谁来执行 Rebalance 操作?由谁来管理消费端 consumer 的 group ?
Kafka 提供了一个 角色:Coordinator。Coordinator 来完成对消费端 group 的管理。当 consumer group 的第一个 consumer启动的时候,它会去和 Kafka Server 去确定到底谁是它们组的 Coordinator。之后该 group 组内的所有成员都会和该 Coordinator 进行通信。
3.2 consumer group 如何确定自己的 Coordinator是谁?
当消费者向 kafka 集群中的任意一个 broker 发送一个 GroupCoordinatorRequest 请求,Kafka Server 服务端会返回一个当前负载最小的 broker 节点的 id,并将该 id 所对应的的 broker 节点设置为当前 consumer group 的 Coordinator。
3.3 Rebalance 过程
整个rebalance的过程分为两个步骤:①JoinGroup過程 和 ②Synchronizing Group State 阶段
3.3.1 确定 Coordinator
3.3.2 JoinGroup 过程
JoinGroup过程,表示消费者加入到consumer group中的过程。
当确定了 Coordinator 之后,所有的 Consumer 都会向 Coordinator 发送一个 JoinGroup 请求(只要启动,所有消费者都会发送该请求)。此时 Coordinator 会从 Consumer group 中选取一个 consumer 担任 leader 角色,并把组成员信息和订阅的消息发送给所有的消费组
3.3.3 Synchronizing Group State 阶段
完成分区分配之后,就进入了 Synchronizing Group State阶段。该阶段主要完成 leader 将消费者对应的 partition 分配方案同步给consumer group 中的所有 consumer。每一个消费者,都会向 Coordinator 发送一个 SyncGroupRequest 请求。请求内容:包含group_id、member_id、generation_id 。在 leader 层面,还会有一个 member_assignment 内容。
每个消费者,还会向 Coordinator 发送 SyncGroup 请求,不过只有 leader 节点会发送分配方案,其他消费者也会发送分配方案,不过发送内容都是空,只是打打酱油而已。当 leader 把方案发给 Coordinator 以后,Coordinator 会把结果设置到 SyncGroupResponse 中。这样所有成员都知道自己应该消费哪个分区。
Kafka 每个客户端,在收到分发策略 SyncGroupResponse 后,会根据返回结果去执行。(consumer group 的分区分配方案是在客户端执行的。Kafka 将这个权利下放给客户端主要是因为这样做可以有更好的灵活性。在很早版本的时候,这个操作时在zookeeper执行,之后版本便在客户端执行了)
到这里,Kafka 消息的分区分发策略 Rebalance 操作就介绍完了。
如果本文对你有所帮助,那就给我点个赞呗 ^_^
End ^_^