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

    文章

    550

    浏览量

    20109
  • kafka
    +关注

    关注

    0

    文章

    48

    浏览量

    5158
收藏 人收藏

    评论

    相关推荐

    运放的三种应用

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

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

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

    kafka基本原理详解

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

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

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

    如何保证kafka消息不丢失

    如果在简历上写了使用过kafka消息中间件,面试官大概80%的概率会问你:"如何保证kafka消息不丢失?"反正我是屡试不爽。
    的头像 发表于 12-19 09:52 290次阅读
    如何保证<b class='flag-5'>kafka</b>消息不丢失

    在AUTOSAR系统中如何将BSW模块分配到不同的分区和内核呢?

    AUTOSAR 提供了一系列机制来解决这些问题,支持高效、安全的 BSW 多核分配
    的头像 发表于 11-16 17:49 1209次阅读
    在AUTOSAR系统中如何将BSW模块<b class='flag-5'>分配</b>到不同的<b class='flag-5'>分区</b>和内核呢?

    kafka相关命令详解

    kafka常用命令详解
    的头像 发表于 10-20 11:34 351次阅读

    Kafka架构技术:Kafka的架构和客户端API设计

    Kafka 给自己的定位是事件流平台(event stream platform)。因此在消息队列中经常使用的 "消息"一词,在 Kafka 中被称为 "事件"。
    的头像 发表于 10-10 15:41 278次阅读
    <b class='flag-5'>Kafka</b>架构技术:<b class='flag-5'>Kafka</b>的架构和客户端API设计

    Spring Kafka的各种用法

    最近业务上用到了Spring Kafka,所以系统性的探索了下Spring Kafka的各种用法,发现了很多实用的特性,下面介绍下Spring Kafka的消息重试机制。 0. 前言
    的头像 发表于 09-25 17:04 393次阅读

    电机转子动平衡机使用过程中的常见问题

    在电机运行过程中,转子动平衡是确保电机稳定运行和减少振动噪声的关键步骤。电机转子动平衡机作为专用设备广泛应用于电机制造、维修和调试等领域。杭州集智本文将深入探讨电机转子动平衡机的原理和
    的头像 发表于 08-07 10:15 641次阅读

    电机转子动平衡机的常见的问题有哪些

    在电机运行过程中,转子动平衡是确保电机稳定运行和减少振动噪声的关键步骤。电机转子动平衡机作为专用设备广泛应用于电机制造、维修和调试等领域。杭州集智本文将深入探讨电机转子动平衡机的原理和
    发表于 08-07 10:12 652次阅读

    曲轴动平衡机的基本原理解析及维修方法

    按:这是笔者在汽车发动机工厂做维修工程师时的一篇文字,文中所涉及的曲轴平衡机是英国产品,文中大部分内容仍具有参考价值,发出来以飨同行。
    的头像 发表于 07-26 11:43 3523次阅读
    曲轴动<b class='flag-5'>平衡机</b>的基本原理解析及维修方法

    物通博联5G-kafka工业网关实现kafka协议对接到云平台

    Kafka协议是一种基于TCP层的网络协议,用于在分布式消息传递系统Apache Kafka中发送和接收消息。Kafka协议定义了客户端和服务器之间的通信方式和数据格式,允许客户端发送消息到K
    的头像 发表于 07-11 10:44 301次阅读

    Kafka 的简介

    ,即使对TB级以上数据也能保证常数时间的访问性能 高吞吐率。即使在非常廉价的机器上也能做到单机支持每秒100K条消息的传输 支持Kafka Server间的消息分区,及分布式消费,同时保证每个
    的头像 发表于 07-03 11:10 343次阅读
    <b class='flag-5'>Kafka</b> 的简介

    二轮自平衡机器人开源设计

    电子发烧友网站提供《二轮自平衡机器人开源设计.zip》资料免费下载
    发表于 06-12 10:43 2次下载
    二轮自<b class='flag-5'>平衡机</b>器人开源设计