0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Kafka的再平衡机制的三种分区重分配

汽车玩家 来源:oschina 作者:oschina 2020-05-03 18:29 次阅读

什么是再平衡

所谓的再平衡,指的是在kafka consumer所订阅的topic发生变化时发生的一种分区重分配机制。一般有三种情况会触发再平衡:

consumer group中的新增或删除某个consumer,导致其所消费的分区需要分配到组内其他的consumer上;

consumer订阅的topic发生变化,比如订阅的topic采用的是正则表达式的形式,如test-*此时如果有一个新建了一个topic test-user,那么这个topic的所有分区也是会自动分配给当前的consumer的,此时就会发生再平衡;

consumer所订阅的topic发生了新增分区的行为,那么新增的分区就会分配给当前的consumer,此时就会触发再平衡。

Kafka提供的再平衡策略主要有三种:Round Robin,Range和Sticky,默认使用Range。这三种分配策略的主要区别在于:

Round Robin:会采用轮询的方式将当前所有的分区依次分配给所有的consumer;

Range:首先会计算每个consumer可以消费的分区个数,然后按照顺序将指定个数范围的分区分配给各个consumer;

Sticky:这种分区策略是最新版本中新增的一种策略,其主要实现了两个目的:

将现有的分区尽可能均衡的分配给各个consumer,存在此目的的原因在于Round Robin和Range分配策略实际上都会导致某几个consumer承载过多的分区,从而导致消费压力不均衡;

如果发生再平衡,那么重新分配之后在前一点的基础上会尽力保证当前未宕机的consumer所消费的分区不会被分配给其他的consumer上;

本文主要会通过几个示例来对上面讲解的三种分区重分配策略的基本实现原理进行讲解。

Round Robin

关于Roudn Robin重分配策略,其主要采用的是一种轮询的方式分配所有的分区,该策略主要实现的步骤如下。这里我们首先假设有三个topic:t0、t1和t2,这三个topic拥有的分区数分别为1、2和3,那么总共有六个分区,这六个分区分别为:t0-0、t1-0、t1-1、t2-0、t2-1和t2-2。这里假设我们有三个consumer:C0、C1和C2,它们订阅情况为:C0订阅t0,C1订阅t0和t1,C2订阅t0、t1和t2。那么这些分区的分配步骤如下:

1) 首先将所有的partition和consumer按照字典序进行排序,所谓的字典序,就是按照其名称的字符串顺序,那么上面的六个分区和三个consumer排序之后分别为:

Kafka的再平衡机制的三种分区重分配

2) 然后依次以按顺序轮询的方式将这六个分区分配给三个consumer,如果当前consumer没有订阅当前分区所在的topic,则轮询的判断下一个consumer:

尝试将t0-0分配给C0,由于C0订阅了t0,因而可以分配成功;

尝试将t1-0分配给C1,由于C1订阅了t1,因而可以分配成功;

尝试将t1-1分配给C2,由于C2订阅了t1,因而可以分配成功;

尝试将t2-0分配给C0,由于C0没有订阅t2,因而会轮询下一个consumer;

尝试将t2-0分配给C1,由于C1没有订阅t2,因而会轮询下一个consumer;

尝试将t2-0分配给C2,由于C2订阅了t2,因而可以分配成功;

同理由于t2-1和t2-2所在的topic都没有被C0和C1所订阅,因而都不会分配成功,最终都会分配给C2。

按照上述的步骤将所有的分区都分配完毕之后,最终分区的订阅情况如下:

Kafka的再平衡机制的三种分区重分配

从上面的步骤分析可以看出,轮询的策略就是简单的将所有的partition和consumer按照字典序进行排序之后,然后依次将partition分配给各个consumer,如果当前的consumer没有订阅当前的partition,那么就会轮询下一个consumer,直至最终将所有的分区都分配完毕。但是从上面的分配结果可以看出,轮询的方式会导致每个consumer所承载的分区数量不一致,从而导致各个consumer压力不均一。

Range

所谓的Range重分配策略,就是首先会计算各个consumer将会承载的分区数量,然后将指定数量的分区分配给该consumer。这里我们假设有两个consumer:C0和C1,两个topic:t0和t1,这两个topic分别都有三个分区,那么总共的分区有六个:t0-0、t0-1、t0-2、t1-0、t1-1和t1-2。那么Range分配策略将会按照如下步骤进行分区的分配:

需要注意的是,Range策略是按照topic依次进行分配的,比如我们以t0进行讲解,其首先会获取t0的所有分区:t0-0、t0-1和t0-2,以及所有订阅了该topic的consumer:C0和C1,并且会将这些分区和consumer按照字典序进行排序;

然后按照平均分配的方式计算每个consumer会得到多少个分区,如果没有除尽,则会将多出来的分区依次计算到前面几个consumer。比如这里是三个分区和两个consumer,那么每个consumer至少会得到1个分区,而3除以2后还余1,那么就会将多余的部分依次算到前面几个consumer,也就是这里的1会分配给第一个consumer,总结来说,那么C0将会从第0个分区开始,分配2个分区,而C1将会从第2个分区开始,分配1个分区;

同理,按照上面的步骤依次进行后面的topic的分配。

最终上面六个分区的分配情况如下:

Kafka的再平衡机制的三种分区重分配

可以看到,如果按照Range分区方式进行分配,其本质上是依次遍历每个topic,然后将这些topic的分区按照其所订阅的consumer数量进行平均的范围分配。这种方式从计算原理上就会导致排序在前面的consumer分配到更多的分区,从而导致各个consumer的压力不均衡。

Sticky

Sticky策略是新版本中新增的策略,顾名思义,这种策略会保证再分配时已经分配过的分区尽量保证其能够继续由当前正在消费的consumer继续消费,当然,前提是每个consumer所分配的分区数量都大致相同,这样能够保证每个consumer消费压力比较均衡。关于这种分配方式的分配策略,我们分两种情况进行讲解,即初始状态的分配和某个consumer宕机时的分配情况。

1 初始分配

初始状态分配的特点是,所有的分区都还未分配到任意一个consumer上。这里我们假设有三个consumer:C0、C1和C2,三个topic:t0、t1和t2,这三个topic分别有1、2和3个分区,那么总共的分区为:t0-0、t1-0、t1-1、t2-0、t2-1和t2-2。关于订阅情况,这里C0订阅了t0,C1订阅了t0和1,C2则订阅了t0、t1和t2。这里的分区分配规则如下:

1) 首先将所有的分区进行排序,排序方式为:首先按照当前分区所分配的consumer数量从低到高进行排序,如果consumer数量相同,则按照分区的字典序进行排序。这里六个分区由于所在的topic的订阅情况各不相同,因而其排序结果如下:

Kafka的再平衡机制的三种分区重分配

2) 然后将所有的consumer进行排序,其排序方式为:首先按照当前consumer已经分配的分区数量有小到大排序,如果两个consumer分配的分区数量相同,则会按照其名称的字典序进行排序。由于初始时,这三个consumer都没有分配任何分区,因而其排序结果即为其按照字典序进行排序的结果:

Kafka的再平衡机制的三种分区重分配

3) 然后将各个分区依次遍历分配给各个consumer,首先需要注意的是,这里的遍历并不是C0分配完了再分配给C1,而是每次分配分区的时候都整个的对所有的consumer从头开始遍历分配,如果当前consumer没有订阅当前分区,则会遍历下一个consumer。然后需要注意的是,在整个分配的过程中,各个consumer所分配的分区数是动态变化的,而这种变化是会体现在各个consumer的排序上的,比如初始时C0是排在第一个的,此时如果分配了一个分区给C0,那么C0就会排到最后,因为其拥有的分区数是最多的。上面的六个分区整体的分配流程如下:

3.1) 首先将t2-0尝试分配给C0,由于C0没有订阅t2,因而分配不成功,继续轮询下一个consumer;

3.2) 然后将t2-0尝试分配给C1,由于C1没有订阅t2,因而分配不成功,继续轮询下一个consumer;

3.3) 接着将t2-0尝试分配给C2,由于C2订阅了t2,因而分配成功,此时由于C2分配的分区数发生变化,各个consumer变更后的排序结果为:

Kafka的再平衡机制的三种分区重分配

3.4) 接下来的t2-1和t2-2,由于也只有C2订阅了t2,因而其最终还是会分配给C2,最终在t2-0、t2-1和t2-2分配完之后,各个consumer的排序以及其分区分配情况如下:

Kafka的再平衡机制的三种分区重分配

3.5) 接着继续分配t1-0,首先尝试将其分配给C0,由于C0没有订阅t1,因而分配不成功,继续轮询下一个consumer;

3.6) 然后尝试将t1-0分配给C1,由于C1订阅了t1,因而分配成功,此时各个consumer以及其分配的分区情况如下:

Kafka的再平衡机制的三种分区重分配

3.7) 同理,接下来会分配t1-1,虽然C1和C2都订阅了t1,但是由于C1排在C2前面,因而该分区会分配给C1,即:

Kafka的再平衡机制的三种分区重分配

3.9) 最后,尝试将t0-0分配给C0,由于C0订阅了t0,因而分配成功,最终的分配结果为:

Kafka的再平衡机制的三种分区重分配

上面的分配过程中,需要始终注意的是,虽然示例中的consumer顺序始终没有变化,但这是由于各个分区分配之后正好每个consumer所分配的分区数量的排序结果与初始状态一致。这里读者也可以比较一下这种分配方式与前面讲解的Round Robin进行对比,可以很明显的发现,Sticky重分配策略分配得更加均匀一些。

3.2 模拟consumer宕机

由于前一个示例中最终的分区分配方式模拟宕机的情形比较简单,因而我们使用另一种订阅策略。这里我们的示例的consumer有三个:C0、C1和C2,topic有四个:t0、t1、t2和t3,每个topic都有两个分区,那么总的分区有:t0-0、t0-1、t1-0、t1-1、t2-0、t2-1、t3-0和t3-1。这里的订阅情况为三个consumer订阅所有的主题,那么如果按照Sticky的分区分配策略,初始状态时,分配情况如下,读者可以按照前一示例讲解的方式进行推算:

Kafka的再平衡机制的三种分区重分配

这里我们假设在消费的过程中,C1发生了宕机,此时就会发生再平衡,而根据Sticky策略,其再分配步骤如下:

1) 首先会将宕机之后未分配的分区进行排序,排序方式为:首先按照分区所拥有的consumer数量从低到高进行排序,如果consumer数量相同,则按照分区的字典序进行排序。这里需要注意的是,由于只有C1宕机,因而未分配的分区为:t0-1、t2-0和t3-1,排序之后的结果为:

Kafka的再平衡机制的三种分区重分配

2) 然后将所有的consumer进行排序,排序方式为:首先将consumer按照其所拥有的consumer数量从小到大排序,如果数量相同,则按照consumer名称的字典序进行排序,排序结果如下:

Kafka的再平衡机制的三种分区重分配

3) 接着依次遍历各个分区,将其分配给各个consumer,需要注意的是,在分配的过程中,consumer所分配的分区数量是在变化的,而这种变化是会反应在consumer的排序上的:

3.1) 首先尝试将t0-1分配给C2,由于C2订阅了t0,因而可以分配成功,此时consumer排序和分区分配情况如下,需要注意的是,虽然分配之后,C2和C0的分区数量相同,但是由于按照字典序,C0在C2前面,因而排序情况还是会发生变化:

Kafka的再平衡机制的三种分区重分配

3.2) 然后尝试将t2-0分配给C0,由于C0订阅了t2,因而分配可以成功,此时consumer排序和分区分配情况如下:

Kafka的再平衡机制的三种分区重分配

3.3) 最后尝试分配t3-1给C2,由于C2订阅了t3,因而分配可以成功,此时consumer排序与分区分配情况如下:

Kafka的再平衡机制的三种分区重分配

在上面的分区分配过程中,我们可以看到,由于分区的不断分配,各个consumer所拥有的分区数量也在不断变化,因而其排序情况也在变化,但是最终可以看到,各个分区是均匀的分配到各个consumer的,并且还保证了当前consumer已经消费的分区是不会分配到其他的consumer上的。

小结

本文首先对kafka的分区重分配策略进行了讲解,然后通过四个示例对各个策略重分配的过程进行了讲解。需要说明的是,本文所使用的示例正好是Kafka源码中所提供了三个分配策略类所演示的几个示例,只不过其并没有演示其分配的具体细节,而是只讲解了最终的结果。同样的,在网上搜索相关的博文,其也只是将分配的结果直接展示出来,而并没有演示具体的细节。本文则主要对这些示例的具体实现细节进行了一一讲解,以方便读者朋友能够更好的理解各个分区重分配策略。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 字符串
    +关注

    关注

    1

    文章

    578

    浏览量

    20505
  • kafka
    +关注

    关注

    0

    文章

    51

    浏览量

    5213
收藏 人收藏

    评论

    相关推荐

    超详细“零”基础kafka入门篇

    1、认识kafka 1.1 kafka简介 Kafka 是一个分布式流媒体平台 kafka官网:http://kafka.apache.or
    的头像 发表于 12-18 09:50 49次阅读
    超详细“零”基础<b class='flag-5'>kafka</b>入门篇

    基本放大电路有哪三种

    基本放大电路是电子电路中至关重要的组成部分,它能够将输入信号放大到所需的电平,以便后续电路进行处理。在电子工程中,基本放大电路主要有三种形式,分别是共发射极放大电路(简称共射放大电路)、共基极放大
    的头像 发表于 10-15 11:07 1000次阅读

    Windows管理内存的三种主要方式

    Windows操作系统提供了多种方式来管理内存,以确保系统资源的有效利用和性能的优化。以下是关于Windows管理内存的三种主要方式的详细阐述,包括堆内存管理、虚拟内存管理以及共享内存管理,每种方式都将从概念、原理、运作机制和应用等方面进行介绍。
    的头像 发表于 10-12 17:09 623次阅读

    mosfet的三种工作状态及工作条件是什么

    的工作状态及工作条件对于理解和设计相关电路至关重要。以下是MOSFET的三种主要工作状态及其工作条件的介绍。 一、MOSFET的三种工作状态 MOSFET根据其栅源电压(VGS)和漏源电压(VDS
    的头像 发表于 10-06 16:51 1554次阅读

    单片机的三种总线结构

    单片机的三种总线结构包括地址总线(Address Bus, AB)、数据总线(Data Bus, DB)和控制总线(Control Bus, CB)。这三种总线在单片机内部及与外部设备之间的数据传输
    的头像 发表于 09-10 11:32 2309次阅读

    在电路中电阻的连接形式有哪三种

    在电路中,电阻的连接形式主要有三种:串联、并联和混联。这三种连接方式在电路设计和应用中具有重要的作用。本文将介绍这三种连接方式的特点、计算方法和应用场景。 1. 串联(Series) 串联是指将
    的头像 发表于 08-20 10:43 1941次阅读

    Linux内核中的页面分配机制

    Linux内核中是如何分配出页面的,如果我们站在CPU的角度去看这个问题,CPU能分配出来的页面是以物理页面为单位的。也就是我们计算机中常讲的分页机制。本文就看下Linux内核是如何管理,释放和
    的头像 发表于 08-07 15:51 272次阅读
    Linux内核中的页面<b class='flag-5'>分配机制</b>

    放大电路的三种组态可以放大什么

    放大电路是电子学中非常重要的组成部分,它们可以将输入信号的幅度放大,以满足各种应用的需求。放大电路的三种基本组态包括共射放大电路、共集放大电路和共基放大电路。每种组态都有其特定的应用和特点。以下
    的头像 发表于 07-09 14:31 1010次阅读

    晶体管的三种工作状态

    晶体管作为现代电子技术的基石,其工作状态直接影响电子设备的性能和功能。晶体管通常具备三种基本的工作状态:截止状态、放大状态和饱和状态。这三种状态不仅决定了晶体管在电路中的行为,也反映了晶体管作为半导体器件的基本特性。本文将详细阐述晶体管的这
    的头像 发表于 05-28 14:53 1401次阅读

    运放的三种应用

    运放在电路中主要存在三种应用,放大器,滤波器,振荡器。再这三种应用电路中,运放的两大特点虚短虚断仍然成立吗? 在阻尼振荡器中,工作过程是否按照我描述的这样,在反相输入端加一个近似锯齿波的电流源,正半
    发表于 01-26 16:18

    运动控制的三种控制方式

    非标项目中有非常多的运动控制,根据系统配置、电机类型以及精度需求的不同主要有三种控制方式:开环控制、半闭环控制、全闭环控制。
    的头像 发表于 01-23 09:48 1452次阅读
    运动控制的<b class='flag-5'>三种</b>控制方式

    嵌入式Linux开发的三种方式

    嵌入式Linux开发主要有三种方式:裸机开发、SDK开发和驱动开发。
    的头像 发表于 01-22 14:22 956次阅读

    针对电平变频器中点电位平衡模式有哪些优缺点?

    电平结构的变频器有一个问题就是中点电位不平衡,在软件控制层面有三种平衡模式,默认模式、比例模式和PI模式,或许叫法有所不同,总之是这三种
    发表于 01-09 16:12

    kafka基本原理详解

    今天浩道跟大家分享一篇关于kafka相关原理的硬核干货,可以说即使你没有接触过kafka,也可以秒懂,一起看看!
    的头像 发表于 01-03 09:57 878次阅读
    <b class='flag-5'>kafka</b>基本原理详解

    用全志R128复刻自平衡赛车机器人,还实现了三种不同的操控方式

    更上一层楼。 硬件设计 本项目中的自平衡赛车机器人的硬件设计结构非常简单,硬件部分主要由R128开发板和几个驱动模块组成。 供电模块 自平衡机器人采用锂电池供电的方式,并利用mini360航模电池降压
    发表于 12-20 10:22