专栏首页haifeiWu与他朋友们的专栏Kafka Consumer 的 Rebalance 机制

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 期间可以继续运行

参考文章

作 者:haifeiWu 原文链接:https://www.hchstudio.cn/

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 高性能无锁队列 Disruptor 初体验

    最近一直在研究队列的一些问题,今天楼主要分享一个高性能的队列 Disruptor 。

    haifeiWu
  • Redis协议规范(译文)

    Redis客户端使用名为RESP(Redis序列化协议)的协议与Redis服务器进行通信。 虽然该协议是专为Redis设计的,但它可以用于其他CS软件项目的通讯...

    haifeiWu
  • Git 命令

    熟练使用工具决定工作效率,Git 是工作中常见的分布式版本控制系统。本篇文章总结一些常用的命令以及原理。

    haifeiWu
  • Kafka剖析系列之Consumer解析

    High Level Consumer 很多时候,客户程序只是希望从Kafka读取数据,不太关心消息offset的处理。同时也希望提供一些语义,例如同一条消息只...

    用户1263954
  • Kafka学习笔记之Kafka Consumer设计解析

      本文主要介绍了Kafka High Level Consumer,Consumer Group,Consumer Rebalance,Low Level C...

    Jetpropelledsnake21
  • Unity 3D Avatar换装系统

       游戏中的换装系统一直是游戏中不可或缺的一部分,在Unity中如何去实现换装?换装需要注意哪些问题?接下来我们就上面两个问题展开讨论。

    py3study
  • FPGA设计三大法则

    这里的面积指的是FPGA的芯片资源,包括逻辑资源和I/O资源等;这里的速度指的是FPGA工作的最高频率(和DSP或者ARM不同,FPGA设计的工 作频率是不固定...

    数字芯片社区
  • 更正

    更正一个知识点:那便是在flask框架中的一些常见问题一文中请求钩子部分有部分叙述错误,详情如下:

    小闫同学啊
  • 【Python】07、python内置数

    当不指定maxsplit参数时,str.rsplit()和str.split()完全一样,当str.split()效率更高

    py3study
  • 【电工与电子技术A】一:电路及其基本物理量

    一类电路用以实现电能的生产,传输,转换和分配,如店里供电设备与各用电设备组成的电力系统。

    周旋

扫码关注云+社区

领取腾讯云代金券