Kafka——Rebalance重平衡

重平衡

1、rebalance概览

consumer group的rebalance本质上是一组协议,它规定了一个consumer group是如何达成一致来分配订阅topic的所有分区的。假设某个组下有20个consumer实例,该组订阅了一个有着l00个分区的topic。正常情况下,Kafka会为每个consumer平均分配5个分区。这个分配过程就被称为rebalance。当consumer成功地执行rebalance后,组订阅topic的每个分区只会分配给组内的一个consumer实例。

和旧版本consumer依托于ZooKeeper进行rebalance不同,新版本consumer使用了Kafka内置的一个全新的组协调协议(group coordination protocol)。对于每个组而言,Kafka的某个broker会被选举为组协调者(group coordinator)。coordinator负责对组的状态进行管理,它的主要职责就是当新成员到达时促成组内所有成员达成新的分区分配方案,即coordinator负责对组执行rebalance操作。

2、rebalance触发条件

  • 组成员发生变更,比如新consumer加入组,或已有consumer主动离开组,再或是已有consumer崩溃时则触发rebalance。
  • 组订阅opc数发生变更,比如使用基于正则表达式的订阅,当匹配正则表达式的新topic被创建时则会触发rebalance。
  • 组订阅topic的分区数发生变更,比如使用命令行脚本增加了订阅topic的分区数。

真实应用场景中引发rebalance最常见的原因就是违背了第一个条件,特别是consumer崩溃的情况。这里的崩溃不一定就是指consumer进程“挂掉”或consumer进程所在的机器宕机。当consumer无法在指定的时间内完成消息的处理,那么coordinator就认为该consumer已经崩溃,从而引发新一轮rebalance。生产环境中用户一定要结合自身业务特点仔细调优consumer参数request.timeout.msmax.poll.recordsmax.poll.interval.ms,以避免不必要的rebalance出现。

3、rebalance分区分配

在rebalance时group下所有的consumer都会协调在一起共同参与分区分配。Kafka新版本consumer默认提供了3种分配策略,分别是range策略、round-robin策略和sticky策略。

所谓的分配策略决定了订阅topic的每个分区会被分配给哪个consumer。

  • range策略主要是基于范围的思想。它将单个topc的所有分区按照顺序排列,然后把这些分区划分成固定大小的分区段并依次分配给每个consumer;
  • round-robin策略则会把所有topic的所有分区顺序摆开,然后轮询式地分配给各个consumer。
  • sticky策略有效地避免了上述两种策略完全无视历史分配方案的缺陷,采用了“有黏性”的策略对所有consumer实例进行分配,可以规避极端情况下的数据倾斜并且在两次rebalance间最大限度地维持了之前的分配方案。

通常意义上认为,如果group下所有consumer实例的订阅是相同,那么使用round-robin会带来更公平的分配方案,否则使用range策略的效果更好。此外,sticky策略在0.11.0.0版本才被引入,故目前使用的用户并不多。新版本consumer默认的分配策略是range。用户根据consumer参数partition.assignment.strategy来进行设置。另外Kafka支持自定义的分配策略,用户可以创建自己的consumer分配器(assignor)。

针对rebalance过程中的分区分配,下面举一个简单的例子,加以说明。假设目前某个consumer group下有两个consumer:A和B。当第3个成员C加入时,满足了前面谈到的第一个触发条件,因此coordinator会执行rebalance,并根据range分配策略重新为A、B和C分配分区,如图所示。

在这里插入图片描述

由此可见,原先A和B分别处理3个分区的数据,rebalance之后A、B和C各自承担2个分区的消费,可以说这个分配方案非常公平,每个consumer上的负载是相同的。

4、rebalance generation

某个consumer group可以执行任意次rebalance。为了更好地隔离每次rebalance上的数据,新版本consumer设计了rebalance generation用于标识某次rebalance。generation这个词类似于JVM分代垃圾收集器中“分代”(严格来说,JVM GC使用的是generational)的概念。表示rebalance之后的一届成员,在consumer中它是一个整数,通常从0开始。

Kafka引入consumer generation主要是为了保护consumer group的,特别是防止无效offset提交。比如上一届的consumer成员由于某些原因延迟提交了offset,但rebalance之后该group产生了新一届的group成员,而这次延迟的offset提交携带的是旧的generation信息,因此这次提交会
被consumer group拒绝。很多Kafka用户在使用consumer时经常碰到的ILLEGAL GENERATION异常就是这个原
因导致的。事实上,每个group进行rebalance之后,generation号都会加l,表示group进入了一个新的版本。如图所示,Generation1时group有3个成员,随后成员2退出组,coordinator触发rebalance,consumer group进入到Generation2时代,之后成员4加入,再次触发rebalance,group进入到Generation3时代。

在这里插入图片描述

5、rebalance协议

前面提到过rebalance本质上是一组协议。group与coordinator共同使用这组协议完成group的rebalance。最新版本Kafka中提供了下面5个协议来处理rebalance相关事宜。

  • JoinGroup请求:consumer请求加入组
  • SyncGroup请求:group leader把分配方案同步更新到组内所有成员中
  • Heartbeat请求:consumer定期向coordinator汇报心跳表明自己依然存货
  • LeaveGroup请求:consumer主动通知coordinator该consumer即将离组
  • DescribeGroup请求:查看组的所有信息,包括成员信息、协议信息、分配方案以及订阅信息等。该请求类型主要供管理员使用。coordinator不使用该请求执行rebalance。

在rebalance过程中,coordinator主要处理consumer发过来的JoinGroup和SyncGroup请求。当consumer主动离组时会发送LeaveGroup请求给coordinator。

在成功rebalance之后,组内所有consumer都需要定期地向coordinator发送Heartbeat请求。而每个consumer也是根据Heartbeat请求的响应中是否包含REBALANCE IN PROGRESS来判断当前group是否开启了新一轮rebalance。

6、rebalance流程

consumer group在执行rebalance之前必须首先确定coordinator所在的broker,并创建与该broker相互通信的Socket连接。确定coordinator的算法与确定offset被提交到__consumer_offsets目标分区的算法是相同的。算法如下:

  • 计算Math.abs(groupID.hashCode) % offsets.topic.num.partitions参数值(默认是50),假设是10
  • 寻找__consumer_offsets分区10的leader副本所在的broker,该即为这个group的coordinator。

成功连接coordinator之后便可以执行rebalance操作。目前rebalance主要分为两步:加入组和同步更新分配方案。

  • 加入组:这一步中组内所有consumer(即group.id相同的所有consumer实例)向coordinator发送JoinGroup请求。当收集全JoinGroup请求后,coordinator从中选择一个consumer担任group的leader,并把所有成员信息以及它们的订阅信息发送给leader。特别需要注意的是,group的leader和coordinator不是一个概念。leader是某个
    consumer实例,coordinator通常是Kafka集群中的一个broker。另外leader而非coordinator负责为整个group的所有成员制定分配方案。
  • 同步更新分配方案:这一步中leader开始制定分配方案,即根据前面提到的分配策略决定每个consumer都负责哪些topic的哪些分区。一旦分配完成,leader会把这个分配方案封装进SyncGroup请求并发送给coordinator。比较有意思的是,组内所有成员都会发送SyncGroup请求,不过只有leader发送的SyncGroup请求中包含了分配方案。
    coordinator接收到分配方案后把属于每个consumer的方案单独抽取出来作为SyncGroup请求的response返还给各自的consumer。

在这里插入图片描述

在这里插入图片描述

consumer group分配方案是在consumer端执行的。Kafka将这个权力下放给客户端主要是因为这样做可以有更好的灵活性。比如在这种机制下用户可以自行实现类似于Hadoop那样的机架感知(rack-aware)分配方案。同一个机架上的分区数据被分配给相同机架上的consumer,减少网络传输的开销。而且,即使以后分区策略发生了变更,也只需要重启consumer应用即可,不必重启Kafka服务器。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Kafka的rebalance会影响消费者组内各个消费者的分区分配,从而影响消费者的消费速度和消费顺序。 当消费者加入或离开消费者组时,Kafka会触发rebalance操作,新分配消费者组内各个消费者所消费的分区。这个过程可能会导致一些消费者需要新连接分区,从而影响消费速度;同时也可能会导致某些消息的消费顺序发生变化,因为消费者之间新分配了分区。 因此,在使用Kafka时,需要考虑好消费者组的设置和rebalance的触发条件,以及如何处理rebalance操作对消费者的影响。 ### 回答2: Kafka的rebalance平衡)是指在Kafka集群中添加或删除broker或者消费者时,自动新分配分区给消费者的过程。它主要影响了Kafka集群的可用性、消费者的负载均衡和消费顺序。 首先,rebalance会影响Kafka集群的可用性。当添加或删除broker时,集群需要新分配分区以保持数据的冗余备份,这可能导致集群的可用性下降,在平衡期间,某些分区可能无法访问。 其次,rebalance会影响消费者的负载均衡。消费者组内的不同消费者订阅同一个主题的不同分区,rebalance新分配分区给消费者,以确保每个消费者负责处理大致相同数量的分区。这样可以确保消费者之间的负载均衡,避免某个消费者过载而导致延迟增加,同时还能充分利用集群的吞吐量。 另外,rebalance还会影响消费顺序。Kafka保证同一个分区中的消息顺序,但在rebalance之后,分区被新分配给其他消费者,这可能导致之前已经按顺序消费的消息新分配给新的消费者,打乱消息的顺序。因此,消费者需要在rebalance之后新定位到正确的位置,以确保顺序消费。 总之,Kafka的rebalance对可用性、负载均衡和消费顺序都有一定程度的影响。它在集群扩容、缩容或消费者组内的消费者变化时自动进行,为Kafka提供了高可靠性和可伸缩性的支持。 ### 回答3: Kafka的rebalance指的是Kafka集群新分配partition给不同的consumer,主要影响如下: 1. 分区的新分配: 当某个consumer加入或离开Kafka集群时,rebalance会导致已有partition的新分配。这可能会导致消费者复消费或漏掉某些消息。新分配带来的分区变化会影响到消费者的消息处理。 2. 消费者群组的平衡: 当消费者群组内的消费者数量发生变化时,rebalance新分配分区给各个消费者,以达到负载均衡。消费者的平衡操作可能会导致消费者停止消费一段时间,从而影响整个消费群组的消息处理能力和延迟。 3. 消费者的会话过期: 在Kafka中,消费者与broker保持心跳连接来维持会话状态。如果一个消费者长时间没有发送心跳,broker会将该消费者视为失效,从而触发rebalance。消费者的会话过期会导致分区的新分配,从而影响消费者停止消费和新分配分区。 4. 效率和性能问题: rebalance涉及到大量partition的新分配和消费者的新注册,会导致一定的性能损耗和网络传输开销。尤其在集群中有大量的分区和消费者时,rebalance可能会导致大量的网络流量和延迟增加。 综上所述,Kafka的rebalance可以影响消费者群组中消息的分配和消费,引起消息复或丢失的问题,并可能导致消费者停止消费一段时间。因此,在设计Kafka应用程序时,需要合理规划消费者群组和分区的数量,以减少rebalance对系统运行的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值