概念

Rebalance 本质上是一种协议,规定了一个 Consumer Group 下的所有 consumer 如何达成一致,来分配订阅 Topic 的每个分区。

例如:某 Group 下有 20 个 consumer 实例,它订阅了一个具有 100 个 partition 的 Topic 。正常情况下,kafka 会为每个 Consumer 平均的分配 5 个分区。这个分配的过程就是 Rebalance

触发 Rebalance 的时机

Rebalance 的触发条件有3个。

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

Rebalance 的好处

Rebalance 发生时,Group 下所有 consumer 实例都会协调在一起共同参与,kafka 能够保证尽量达到最公平的分配

Rebalance 的坏处

  • Rebalance 过程对 consumer group 会造成比较严重的影响。在 Rebalance 的过程中 consumer group 下的所有消费者实例都会停止工作,等待 Rebalance 过程完成。

  • 数据重复消费: 消费过的数据由于提交offset任务也会失败,在partition被分配给其他消费者的时候,会造成重复消费,数据重复且增加集群压力

  • Rebalance扩散到整个ConsumerGroup的所有消费者,因为一个消费者的退出,导致整个Group进行了Rebalance,并在一个比较慢的时间内达到稳定状态,影响面较大

  • 频繁的Rebalance反而降低了消息的消费速度,大部分时间都在重复消费和Rebalance

  • 数据不能及时消费,会累积lag,在Kafka的TTL之后会丢弃数据

Rebalance 的过程

如何避免不必要的rebalance

要避免 Rebalance,还是要从 Rebalance 发生的时机入手。我们在前面说过,Rebalance 发生的时机有三个:
组成员数量发生变化
订阅主题数量发生变化
订阅主题的分区数发生变化
后两个我们大可以人为的避免,发生rebalance最常见的原因是消费组成员的变化。

消费者成员正常的添加和停掉导致rebalance,这种情况无法避免,但是时在某些情况下,Consumer 实例会被 Coordinator 错误地认为 “已停止” 从而被“踢出”Group。从而导致rebalance

四个参数

session.timeout.ms 表示 consumer 向 broker 发送心跳的超时时间。例如 session.timeout.ms = 180000 表示在最长 180 秒内 broker 没收到 consumer 的心跳,那么 broker 就认为该 consumer 死亡了,会启动 rebalance。

heartbeat.interval.ms 表示 consumer 每次向 broker 发送心跳的时间间隔。heartbeat.interval.ms = 60000 表示 consumer 每 60 秒向 broker 发送一次心跳。一般来说,session.timeout.ms 的值是 heartbeat.interval.ms 值的 3 倍以上。

max.poll.interval.ms 表示 consumer 每两次 poll 消息的时间间隔。简单地说,其实就是 consumer 每次消费消息的时长。如果消息处理的逻辑很重,那么市场就要相应延长。否则如果时间到了 consumer 还么消费完,broker 会默认认为 consumer 死了,发起 rebalance。

max.poll.records 表示每次消费的时候,获取多少条消息。获取的消息条数越多,需要处理的时间越长。所以每次拉取的消息数不能太多,需要保证在 max.poll.interval.ms 设置的时间内能消费完,否则会发生 rebalance。

简单来说,会导致崩溃的几个点是:

消费者心跳超时,导致 rebalance。
消费者处理时间过长,导致 rebalance。

参考

Kafka Rebalance机制分析 - gaoyanliang - 博客园

困扰许久的Kafka Rebalance问题 - 知乎

线上Kafka突发rebalance异常,如何快速解决? - 知乎

kafka reblance入门相关推荐

  1. 消息中间件 --- Kafka快速入门

    消息中间件 --- Kafka 快速入门 消息中间件:https://blog.51cto.com/u_9291927/category33 GitHub: GitHub - scorpiostudi ...

  2. 大数据技术之 Kafka (第 2 章 Kafka快速入门)

    第 2 章 Kafka 快速入门 下载安装kafka集群 1.需要jdk 2.需要zookeeper,这个东西在最新版的Kafka中内置. 3.下载Kafka安装包 (下载官网地址:Apache Ka ...

  3. 副本与ISR设计--Kafka从入门到精通(十四)

    上篇文章说了,broker的消息设计,采用紧凑的byteBuffer,存储设计主要包含attribute后三个表示压缩类型,还有crc效验,以及key和value,后面新增了时间戳. Broker消息 ...

  4. 大数据技术之Kafka(一)Kafka概述、Kafka快速入门、Kafka架构深入

    文章目录 1 Kafka 概述 1.1 定义 1.2 消息队列 1.2.1 传统消息队列的应用场景 1.2.2 消息队列的两种模式 1.3 Kafka 基础架构 2 Kafka 快速入门 2.1 安装 ...

  5. Apache Kafka开发入门指南

    Apache Kafka开发入门指南 作者:chszs,转载需注明.博客主页: http://blog.csdn.net/chszs Apache Kafka可以帮助你解决在发布/订阅架构中遇到消费数 ...

  6. Kafka 快速入门(安装)

    kafka学习目录:kafka目录 二.Kafka 快速入门 2.1.windows版安装 2.1.1.Quick Start 本次安装学习在Windows操作系统进行.(Linux版本的差别不大,运 ...

  7. kafka基础入门_CodingPark编程公园

    文章介绍 本文是kafka基础入门篇,讲解内容包括: 1. 消息队列对比表 2. Kafka概念及特性 3. kafka总体结构 4. kafka各项配置 5. 生产者 6. kafka Broker ...

  8. Apache Kafka教程--Kafka新手入门

    Apache Kafka教程–Kafka新手入门 Kafka Assistant 是一款 Kafka GUI 管理工具--管理Broker,Topic,Group.查看消费详情.监控服务器状态.支持多 ...

  9. Kafka【入门】就这一篇!

    一.Kafka 简介 Kafka 创建背景 Kafka 是一个消息系统,原本开发自 LinkedIn,用作 LinkedIn 的活动流(Activity Stream)和运营数据处理管道(Pipeli ...

最新文章

  1. LeetCode简单题之判断路径是否相交
  2. Kamailio v4.4.6 发布,开源 SIP 服务器
  3. SQLServer · 最佳实践 · RDS for SQL Server 2012 权限限制的提升与改善
  4. 4G EPS 中建立 eNB 与 MME 之间的 S1 连接
  5. windows命令行帮助文档如何使用
  6. python中创建对象的七种方式
  7. 大有可为的GNN:DeepWalk
  8. boost::python::indirect_traits相关的测试程序
  9. Vue之代码自动格式化
  10. Atitit jOrgChart的使用  组织架构图css html
  11. Redis学习笔记整理(黑马程序员视频课程)
  12. c#元胞自动机_元胞自动机+生命游戏
  13. RHadoop安装和使用
  14. 地脚螺钉直径系列_地脚螺栓规格
  15. shopex PHP Notice,shopex官网用PHP为SHOPEX增加日志功能代码
  16. 课程设计------学生考勤管理系统
  17. EarthSDK 项目开发使用说明
  18. 《社交app攻击风险应对策略》
  19. java 数字补零_java数字位数不足在前后补0
  20. 【Java并发编程实战】(十七):Future和CompletableFuture的原理及实战——异步编程没有那么难

热门文章

  1. 输入上标的html标签是,HTML上标sup与下标注sub标签元素
  2. java 容易犯错_写Java程序最容易犯错误有哪些呢?
  3. pycharm开启鼠标滚动调节字体大小
  4. php 怎么输入php ini,PHP怎么找到php.ini配置文件?-php教程
  5. python 字典 列表 元祖_Python基础之列表、元祖、字典、集合,你都知道吗?附视频...
  6. 深度学习掩膜_学习资源 | NOAA连接AI与环境科学(九)—海洋环境视频和图像分析教程...
  7. gdal ImportError: DLL load failed
  8. spo机试题JAVA_基于龙芯处理器的Java运行环境的移植与优化
  9. Query 中使用 text() 或者 html() 函数可bai以获取font or td 的内容:
  10. mysql查询单个员工信息_PHP+MySQL实现模糊查询员工信息功能示例