第6章 Rebalance详解

zz/2023/6/3 16:21:10

rebalance本质是一种协议,规定了一个consumer group下的所有consumer如何达成一致来分配订阅的topic的每个分区。比如某个group下有20个consumer,它订阅了一个具有100个分区的topic。正常情况下,Kafka平均会为每个consumer分配5个分区。这个分配的过程就叫rebalance。

6.1 触发rebalance的条件

rebalance的触发条件有三种:

  • 组成员发生变更(新consumer加入组、已有consumer主动离开组或已有consumer崩溃)
  • 订阅主题数发生变更——这当然是可能的,如果你使用了正则表达式的方式进行订阅,那么新建的匹配正则表达式的topic就会触发rebalance
  • 订阅主题的分区数发生变更

6.2 rebalance分配机制

Kafka新版本consumer默认提供了两种分配策略:range和round-robin。当然Kafka采用了可插拔式的分配策略,可以自定义分配器以实现不同的分配策略。实际上,由于目前range和round-robin两种分配器都有一些弊端,Kafka社区已经提出第三种分配器来实现更加公平的分配策略,目前还在开发中。

简单举个例子,假设目前某个consumer group下有两个consumer:A和B,当第三个成员加入时,kafka会触发rebalance并根据默认的分配策略重新为A、B和C分配分区,如下图所示
在这里插入图片描述

6.3 执行rebalance和consumer group管理

Kafka由Coordinator执行Rebalance和consumer group管理;

首先是0.8版本的coordinator,那时候coordinator是依赖zookeeper来实现对consumer group进行管理。Coordinator监听zookeeper的/consumers/<group>/ids的子节点变化以及/brokers/topics/<topic>数据变化来判断是否需要进行rebalance。group下的每个consumer都自己决定要消费哪些分区,并把自己的决定抢先在zookeeper中的/consumers/<group>/owners/<topic>/<partition>下注册。很明显,这种方案要依赖于zookeeper的帮助,而且每个consumer是单独做决定的,没有那种“大家属于一个组,要协商做事情”的精神。

基于这些潜在的弊端,0.9版本的kafka改进了coordinator的设计,提出了group coordinator——每个consumer group都会被分配一个这样的coordinator用于组管理和位移管理。这个group coordinator比原来承担了更多的责任,比如组成员管理、位移提交保护机制等。当新版本consumer group的第一个consumer启动的时候,它会和kafka server确定谁是它们组的coordinator。之后该group内的所有成员都会和该coordinator进行协调通信。显而易见,这种coordinator设计不再需要zookeeper了,性能上可以得到很大的提升。

6.4 如何确定Coordinator

那么consumer group如何确定自己的coordinator是谁呢? 简单来说分为两步

  1. 确定consumer group消费位移信息写入__consumer_offsets的哪个分区。具体计算公式:
__consumer_offsets_partitionId = Math.abs(groupId.hashCode() % groupMetadataTopicPartitionCount)

注意:groupMetadataTopicPartitionCount由参数offsets.topic.num.partitions指定,默认是50个分区。

  1. 该分区leader所在的broker就是被选定的coordinator

6.5 Rebalance generation

Rebalance generation它表示rebalance之后的新一届成员,主要是用于保护consumer group,防止无效offset提交。例如,上一届的consumer成员是无法提交位移到新一届的consumer group中。否则报ILLEGAL_GENERATION错误。每次group进行rebalance之后,generation号都会加1,表示group进入到了一个新的版本,如下图所示,Generation 1时group有3个成员,随后成员2退出组,coordinator触发rebalance,consumer group进入Generation 2,之后成员4加入,再次触发rebalance,group进入Generation 3。
在这里插入图片描述

6.6 协议(protocol)

rebalance本质是一组协议。group与coordinator共同使用它来完成group的rebalance。目前kafka提供了5个协议处理与consumer group coordination相关的问题

  1. Heartbeat请求:consumer需要定期给coordinator发送心跳来表明自己还活着
  2. LeaveGroup请求:主动告诉coordinator我要离开consumer group
  3. SyncGroup请求:group leader把分配方案告诉组内所有成员
  4. JoinGroup请求:成员请求加入组
  5. DescribeGroup请求:显示组的所有信息,包括成员信息、协议名称、分配方案、订阅信息等。通常该请求是给管理员使用

Coordinator在rebalance的时候主要用到了前面4种请求。

6.7 Liveness

consumer如何向coordinator证明自己还活着?通过定时向coordinator发送Heartbeat请求。如果超过了设定的超时时间,那么coordinator就认为这个consumer已经挂了。一旦coordinator认为某个consumer挂了,那么它就会开启新一轮rebalance,并且在当前其他consumer的心跳response中添加“REBALANCE_IN_PROGRESS”,告诉其他consumer:不好意思各位,你们重新申请加入组吧!

6.8 Rebalance过程

rebalance的前提是coordinator已经确定了。总体而言,rebalance分为2步:Join和Sync

  1. Join:顾名思义就是加入组。所有成员都向coordinator发送JoinGroup请求,请求入组。一旦所有成员都发送了JoinGroup请求,coordinator会从中选择一个consumer担任leader的角色,并把组成员信息以及订阅信息发给leader——注意leader和coordinator不是一个概念。leader负责消费分配方案的制定。
  2. Sync:leader开始分配消费方案,即哪个consumer负责消费哪些topic的哪些partition。一旦完成分配,leader会将这个方案封装进SyncGroup请求中发给coordinator,非leader也会发SyncGroup请求,只是内容为空。coordinator接收到分配方案之后会把方案塞进SyncGroup的response中发给各个consumer。这样组内的所有成员就都知道自己应该消费哪些分区了。
    在这里插入图片描述

注意:在coordinator收集到所有成员请求前,它会把已收到请求放入一个叫purgatory(炼狱)的地方。

然后是分发分配方案的过程,即SyncGroup请求:
在这里插入图片描述

注意:consumer group的分区分配方案是在客户端执行的!Kafka将这个权利下放给客户端主要是因为这样做可以有更好的灵活性。比如这种机制下可以实现类似于Hadoop那样的机架感知(rack-aware)分配方案,即为consumer挑选同一个机架下的分区数据,减少网络传输的开销。可以覆盖consumer的参数partition.assignment.strategy来实现自己分配策略。

6.9 Consumer group状态机

consumer group也做了个状态机来表明组状态的流转。coordinator根据这个状态机会对consumer group做不同的处理,如下图所示
在这里插入图片描述

简单说明下图中的各个状态

  • Dead:组内已经没有任何成员的最终状态,组的元数据也已经被coordinator移除了。这种状态响应各种请求都是一个response: UNKNOWN_MEMBER_ID
  • Empty:组内无成员,但是位移信息还没有过期。这种状态只能响应JoinGroup请求
  • PreparingRebalance:组准备开启新的rebalance,等待成员加入
  • AwaitingSync:正在等待leader consumer将分配方案传给各个成员
  • Stable:rebalance完成!可以开始消费了~

6.10 Rebalance场景剖析

6.10.1 新成员入组

在这里插入图片描述

6.10.2 组成员崩溃

组成员崩溃和组成员主动离开是两个不同的场景。因为在崩溃时成员并不会主动地告知coordinator此事,coordinator有可能需要一个完整的session.timeout周期才能检测到这种崩溃,这必然会造成consumer的滞后。可以说离开组是主动地发起rebalance;而崩溃则是被动地发起rebalance。
在这里插入图片描述

6.10.3组成员主动离组
在这里插入图片描述

6.10.4提交位移
在这里插入图片描述

http://www.ngui.cc/zz/2389882.html

相关文章

电话机器人核心技术之NLP

什么是NLPNLP是神经语言程序学 (Neuro-Linguistic Programming) 的英文缩写; NLP译为“身心语法程式学”或“神经语言程序学”。N&#xff08;Neuro&#xff09;指神经系统&#xff0c;意译为身心。指我们比较稳定的身心素质&#xff0c;结构及比较逸动的身心状态。L&#xff0…

产品用户-缩写

tts : text to speech 语音合成 IVR&#xff1a;(Interactive Voice Response)即互动式语音应答&#xff0c;您只须用电话即可进入服务中心&#xff0c;可以根据操作提示收听手机娱乐产品&#xff0c;也可以根据用户输入的内容播放有关的信息。 CTI&#xff1a;一般指计算机电…

java 常用缩写简表_java 常用缩写

java EE -->Java Platform Enterprise Edition //平台企业版此版本中主要包括如下技术&#xff1a;EJB 3.0、Java Persistance Architecture (JPA)、Web 服务、JAX-WS。.包含J2SE 中的类&#xff0c;并且还包含用于开发企业级应用的类。比如&#xff1a;EJB、servlet、JS…

Android--控件的单位(px,pt,dp,sp)

px&#xff1a;代表像素&#xff0c;即在屏幕中可显示的最小单位元素&#xff0c;应用程序中任何控件都是由一个像素点组成的&#xff0c;分辨率越高的手机&#xff0c;屏幕的像素点就越多。因此&#xff0c;如果使用px控制控件的大小&#xff0c;在分辨率不同的手机控件显示的…

web前端常用长度单位(px,em,rem,pt)

px像素&#xff08;Pixel&#xff09;。相对长度单位。像素px是相对于显示器屏幕分辨率而言的。 em是相对长度单位。相对于当前对象内文本的字体尺寸。如当前对行内文本的字体尺寸未被人为设置&#xff0c;则相对于浏览器的默认字体尺寸&#xff0c;最初是指字母M的宽度&…

css font size 单位,css中font-size的单位总结:px、em、pt

px:基于像素的单位.像素是一种有用的单位,因为在任何媒体上都可以保证一个像素的差别确实是可见的.em :一般用来测量长度的通用单位(例如元素周转的页边空白和填充),当用于指定字体大小时,em单位是指父元素的字体大小.比如这里的字是24px如果使用em来指定填充,填充的宽度是相对…

探究px像素与pt磅,mm毫米之间的换算

文章目录DPI(dots per inch)dpcm&#xff08;dots per centimeter&#xff09;dppx&#xff08;dots per px 别名为&#xff1a;x&#xff09;px像素(Pixel)emrem (font size of the root element)in英寸(Inch)pt磅(Point)mm毫米(Millimeter)cm厘米(Centimeter)pt与px换算公式m…

C语言数组元素的左移、右移

想到数组元素的移动&#xff0c;我最初的想法是这样的。 贴代码&#xff1a; for(i 0; i < it_Length - it_Steps; i){if(it_Direction -1){Array[i] pt_Array[i it_Steps];}else{Array[i it_Steps] pt_Array[i];}}for(i 0; i < it_Steps; i){if(it_Direction -…

页面适配之pt、px、em、rem用法和特点

因为自己也经常做移动端的开发工作&#xff0c;现总结一份页面适配的笔记。 1. pt 点&#xff08;Points&#xff09;&#xff0c;绝对长度单位。 印刷业上常使用的单位&#xff0c;磅的意思&#xff0c;一般用于页面打印排版。 不知道经常做设计的同学知不知道zeplin这个网…

jQuery---获取dom元素

目录一、基本选择器二、层级选择器三、筛选器四、内容选择器五、可见性选择器六、子元素选择器七、表单选择器八、表单对象属性选择器九、属性选择器十、混淆选择器<button class"btn">按钮</button><button id"btninfo" class"btn&qu…