Kafka Consumer 的 Rebalance 机制 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
javaCoder
V2EX    程序员

Kafka Consumer 的 Rebalance 机制

  •  
  •   javaCoder 2019-12-22 15:59:23 +08:00 2757 次点击
    这是一个创建于 2170 天前的主题,其中的信息可能已经有所发展或是发生改变。

    上周参加了 Kafka Meetup 北京站的技术分享,本文简单介绍下 Kafka Consumer 的 Rebalance 机制以及其新版本中的优化策略~

    Kafka 之前版本的 Consumer Groups

    Consumer Group

    如上图所示,Consumer 使用 Consumer Group 名称标记自己,并且发布到主题的每条记录都会传递到每个订阅消费者组中的一个 Consumer 实例。 Consumer 实例可以在单独的进程中或在单独的机器上。

    如果所有 Consumer 实例都属于同一个 Consumer Group ,那么这些 Consumer 实例将平衡再负载的方式来消费 Kafka

    如果所有 Consumer 实例具有不同的 Consumer Group,则每条记录将广播到所有 Consumer 进程。

    Group Coordinator

    Group Coordinator 是一个服务,每个 Broker在启动的时候都会启动一个该服务。Group Coordinator 的作用是用来存储 Group 的相关 Meta 信息,并将对应 PartitionOffset 信息记录到 Kafka 内置Topic(__consumer_offsets) 中。Kafka 在 0.9 之前是基于 Zookeeper 来存储 PartitionOffset 信息 (consumers/{group}/offsets/{topic}/{partition}),因为 Zookeeper 并不适用于频繁的写操作,所以在 0.9 之后通过内置 Topic 的方式来记录对应 PartitionOffset。如下图所示:

    Kafka 0.8.2 之前是这样的

    之后是这样的:

    每个 Group 都会选择一个 Coordinator 来完成自己组内各 PartitionOffset 信息,选择的规则如下:

    1. 计算 Group 对应在 __consumer_offsets 上的 Partition
    2. 根据对应的 Partition 寻找该 Partition 的 leader 所对应的 Broker,该 Broker 上的 Group Coordinator 即就是该 Group 的 Coordinator

    Partition 计算规则:

    partition-Id(__consumer_offsets) = Math.abs(groupId.hashCode() % groupMetadataTopicPartitionCount) 

    其中 groupMetadataTopicPartitionCount 对应 offsets.topic.num.partitions 参数值,默认值是 50 个分区

    Consumer Rebalance Protocol

    发生 rebalance 的时机

    1. 组成员个数发生变化。例如有新的 consumer 实例加入该消费组或者离开组。
    2. 订阅的 Topic 个数发生变化。
    3. 订阅 Topic 的分区数发生变化。

    消费者进程挂掉的情况

    1. session 过期
    2. heartbeat 过期

    Rebalance 发生时,Group 下所有 Consumer 实例都会协调在一起共同参与,Kafka 能够保证尽量达到最公平的分配。但是 Rebalance 过程对 Consumer Group 会造成比较严重的影响。在 Rebalance 的过程中 Consumer Group 下的所有消费者实例都会停止工作,等待 Rebalance 过程完成。

    消费者的 Rebalance 协议

    Rebalance 发生后的执行过程

    1,有新的 Consumer 加入 Consumer Group

    2,从 Consumer Group 选出 leader

    3,leader 进行分区的分配

    Issues

    Known Issue #1: Stop-the-world Rebalance 如上图所示:之前版本的 Kafka 在发生 Rebalance 时候会释放 Consumer Group 的所有资源,造成比较长的 Stop-the-world

    Known Issue #2: Back-and-forth Rebalance 如上图所示:在发生 Rebalance 的时候发生的不必要的资源释放与重新分配。

    当前的 Rebalance 与 改进后的 ReBalance 对比

    渐进式 Rebalance 协议

    如上图所示,新的渐进式 Rebalance 协议,在 Rebalance 的时候不需要当前所有的 Consumer 释放所拥有的资源,而是当需要触发 Rebalance 的时候对当前资源进行登记,然后进行渐进式的 Rebalance。 这样做产生的优化效果

    • 相较之前进行了更多次数的 Rebalance,但是每次 Rebalance 对资源的消耗都是比较廉价的
    • 发生迁移的分区相较之前更少了
    • Consumer 在 Rebalance 期间可以继续运行

    参考文章

    本篇文章由一文多发平台ArtiPub自动发布

    2 条回复    2019-12-26 11:29:34 +08:00
    lovelife1994
        1
    lovelife1994  
       2019-12-22 16:40:17 +08:00 via iPhone
    ppt 能分享一下吗?
    javaCoder
        2
    javaCoder  
    OP
       2019-12-26 11:29:34 +08:00   1
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2571 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 08:57 PVG 16:57 LAX 00:57 JFK 03:57
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86