线上 kafka rebalance 解决

        

        上周末我们服务上线完毕之后发生了一个kafka相关的异常,线上的kafka频繁的rebalance,详细的报错我已经贴到下面,根据字面意思:消费者异常 org.apache.kafka.clients.consumer.CommitFailedException: 无法完成提交,因为消费者组已经重新平衡并将分区分配给另一个成员。这意味着连续调用 poll() 之间的时间超过了配置的 max.poll.interval.ms,通常意味着轮询循环在消息处理上花费了太多时间。您可以通过增加会话超时时间或通过减少 poll() 返回的批次的最大大小(使用 max.poll.records)来解决这个问题。

        当然我们的解决方案也是从两个方面展开,分别是“开源” + “截流”。开源就是通过增加处理时间的配置。截流就是通过每一批次的处理数量。上线之后报警消失。通过这次的问题,正好总结一下频繁kafka rebalance 解决方案,希望可以帮助到大家。

consumer ex org.apache.kafka.clients.consumer.CommitFailedException:Commit cannot be completed since the group has already rebalanced and assigned the partitions to another member. This means that the time between subsequent calls to poll() was longer than the configured max.poll.interval.ms, which typically implies that the poll loop is spending too much time message processing. You can address this either by increasing the session timeout or by reducing the maximum size of batches returned in poll() with max.poll.records.

        Kafka是一个高性能、分布式的消息队列系统,但在实际应用中,有时会遇到频繁发生Rebalance的问题。本文将介绍Rebalance的原因、影响以及解决该问题的技术方案。

1. 什么是Kafka的Rebalance

        Kafka的Rebalance是指在消费者组中新增或移除消费者时者消费者所订阅的Topic的分区数量发生变化时,Kafka会重新分配分区给消费者,以实现负载均衡。Rebalance的目的是确保每个消费者都能平均地处理分区,提高整体的消费能力,以实现负载均衡和高可用性。

        在Rebalance过程中,Kafka会根据配置的Rebalance策略(如Range或RoundRobin)来决定如何分配分区给消费者。具体的分配算法会根据消费者组内的消费者数量、消费者的订阅关系和分区的分配情况来确定。

Rebalance的过程包括以下几个步骤:

  1. 消费者加入或退出消费者组:当有新的消费者加入或退出消费者组时,Kafka会触发Rebalance操作。
  2. 分区分配计算:Kafka会根据配置的Rebalance策略和消费者组内的消费者数量,计算出每个消费者应该负责处理的分区。
  3. 分区分配通知:Kafka会将分区分配结果通知给消费者,告知它们负责处理的分区。
  4. 消费者重新分配分区:消费者收到分区分配通知后,会重新分配自己负责处理的分区,并开始消费数据。
  5. 消费者消费数据:消费者根据分配到的分区,从对应的分区中拉取数据并进行消费。

2. Rebalance的原因

        Rebalance的发生通常有以下几个原因:

2.1 消费者组中新增或移除消费者

        当消费者组中新增或移除消费者时,Kafka会触发Rebalance操作。新增消费者会导致分区重新分配,而移除消费者会导致其所负责的分区重新分配给其他消费者。

2.2 分区的增加或减少

        当主题的分区数量发生变化时,Kafka也会触发Rebalance操作。新增分区会导致分区重新分配,而减少分区会导致一些消费者无法分配到分区。

2.3 消费者心跳超时

        Kafka通过心跳机制来检测消费者是否存活。如果消费者长时间未发送心跳,Kafka会认为该消费者已经宕机,并将其分区重新分配给其他消费者。

3. Rebalance的影响

        Rebalance的频率和耗时取决于多个因素,包括消费者组内的消费者数量、消费者的启停频率、Topic的分区数量和分区的分配情况等。频繁的Rebalance可能会导致消费者在重新分配分区的过程中发生停顿,影响系统的稳定性和性能。因此,合理配置和调优Rebalance相关的参数和策略,对于提高Kafka集群的稳定性和性能非常重要。

3.1 消费延迟增加

        Rebalance会导致消费者重新分配分区,消费者需要重新建立与分区的关联关系,这个过程需要一定的时间。频繁的Rebalance会增加消费延迟,影响消息的实时性。

3.2 消费者重复消费

        在Rebalance期间,消费者可能会重复消费一些消息。当一个消费者失去分区时,它可能无法及时提交消费位移,导致其他消费者接管该分区时,会重新消费已经消费过的消息。

3.3 消费者失去分区

        在Rebalance期间,消费者可能会失去分区,导致消息无法被及时消费。这会导致消息堆积,进一步影响整体的消费能力。

4. 解决频繁Rebalance的技术方案

        为了解决频繁发生Rebalance的问题,可以采取以下技术方案:

4.1 增加消费者组的稳定性

消费者组的稳定性对于减少Rebalance非常重要。可以通过以下方式增加消费者组的稳定性:

  • 避免频繁地新增或移除消费者,尽量保持消费者组的稳定性。
  • 设置合理的心跳超时时间,避免误判消费者宕机。
  • 避免消费者长时间阻塞,及时处理消费任务。

4.2 增加分区的稳定性

分区的稳定性也对减少Rebalance非常重要。可以通过以下方式增加分区的稳定性:

  • 避免频繁地增加或减少分区,尽量保持分区数量的稳定。
  • 合理规划分区的分配策略,避免某些消费者负载过重或无法分配到分区。

4.3 动态调整消费者组和分区的配置

根据实际情况,动态调整消费者组和分区的配置,可以有效减少Rebalance的频率。可以通过以下方式进行配置调整:

  • 根据消费者组的负载情况,适时增加或减少消费者的数量。
  • 根据主题的负载情况,适时增加或减少分区的数量。

4.4 使用Kafka的自动Rebalance策略

Kafka提供了多种Rebalance策略,可以根据实际需求选择合适的策略。可以通过配置文件或代码来指定Rebalance策略,以减少Rebalance的频率。

5. 相关配置

        Kafka提供了一些相关的配置参数,可以用于调整和控制Rebalance的行为。下面是一些常用的Kafka Rebalance相关配置参数的详细说明:

  1. group.initial.rebalance.delay.ms:
  • 类型:long
  • 默认值:0
  • 描述:设置消费者组初始Rebalance的延迟时间,单位为毫秒。默认值为0,表示立即触发Rebalance。增加延迟时间可以给消费者更多的时间加入消费者组,减少Rebalance的频率。
  1. group.max.rebalance.delay.ms:
  • 类型:long
  • 默认值:300000(5分钟)
  • 描述:设置消费者组最大Rebalance的延迟时间,单位为毫秒。默认值为300000,表示最多延迟5分钟触发Rebalance。增加延迟时间可以减少Rebalance的频率,但也会增加消费者加入或退出消费者组的等待时间。
  1. partition.assignment.strategy:
  • 类型:String
  • 默认值:

org.apache.kafka.clients.consumer.RangeAssignor

  • 描述:设置Rebalance的策略。Kafka提供了多种策略可供选择,包括

org.apache.kafka.clients.consumer.RangeAssignor(按照分区范围分配)和

org.apache.kafka.clients.consumer.RoundRobinAssignor(轮询分配)。可以根据实际需求选择合适的策略。

  1. num.partitions:
  • 类型:int
  • 默认值:1
  • 描述:设置Topic的分区数量。通过增加分区数量可以减少Rebalance的频率,但需要注意分区数的增加可能会导致消费者端的负载增加。在创建Topic时,可以通过指定分区数量来设置。

        这些配置参数可以通过在Kafka的配置文件(如server.properties)中进行设置,或者通过编程方式在消费者端进行配置。根据实际需求和场景,可以调整这些参数的值来优化Rebalance的行为,提高Kafka集群的稳定性和性能。

        需要注意的是,调整这些配置参数时需要综合考虑系统的负载、消费者组的规模和消费者的启停情况等因素,以避免引入新的问题或影响系统的正常运行。在进行调优时,建议先进行测试和评估,以确保调整后的配置能够满足实际需求。

6. 调优策略

  1. 监控消费者组的消费情况:通过监控消费者组的消费情况,可以及时发现消费者的启停情况,避免因消费者的频繁启停导致Rebalance的频繁发生。
  2. 预估消费者组的消费能力:通过预估消费者组的消费能力,可以合理配置消费者的数量和分区的数量,避免因消费者数量和分区数量不匹配导致Rebalance的频繁发生。
  3. 配置合适的Rebalance超时时间:根据实际情况,调整Rebalance超时时间,避免Rebalance的频繁触发。

7. 结论

        频繁发生Rebalance会对Kafka的性能和稳定性产生一定的影响,因此解决该问题非常重要。本文介绍了Rebalance的原因、影响以及解决该问题的技术方案。通过增加消费者组和分区的稳定性,动态调整配置以及使用合适的Rebalance策略,可以有效减少Rebalance的频率,提高Kafka的性能和稳定性。       

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/123994.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式-状态模式 golang实现

一 什么是有限状态机 有限状态机,英⽂翻译是 Finite State Machine,缩写为 FSM,简称为状态机。 状态机不是指一台实际机器,而是指一个数学模型。说白了,一般就是指一张状态转换图。 已订单交易为例: 1.…

unity打AB包,AssetBundle预制体与图集(三)

警告: spriteatlasmanager.atlasrequested wasn’t listened to while 条件一:图片打图集里面去了 条件二:然后图集打成AB包了 条件三:UI预制体也打到AB包里面去了 步骤一:先加载了图集 步骤二:再加载UI预…

Spring Cloud LoadBalancer基础知识

LoadBalancer 概念常见的负载均衡策略使用随机选择的负载均衡策略创建随机选择负载均衡器配置 Nacos 权重负载均衡器创建 Nacos 负载均衡器配置 自定义负载均衡器(根据IP哈希策略选择)创建自定义负载均衡器封装自定义负载均衡器配置 缓存 概念 LoadBalancer(负载均衡器)是一种…

jenkins部署job

apt install fontconfig openjdk-11-jre wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/war/2.429/jenkins.wardeb包安装 wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/debian-stable/jenkins_2.414.3_all.debdpkg -i jenkins_2.414.3_all.deb 访问 http://…

垂直领域大模型落地思考

相比能做很多事,但每件事都马马虎虎的通用大模型;只能做一两件事,但这一两件事都能做好,可被信赖的垂直大模型会更有价值。这样的垂直大模型能帮助我们真正解决问题,提高生产效率。 本文将系统介绍如何做一个垂直领域…

JavaScript脚本操作CSS

脚本化CSS就是使用JavaScript脚本操作CSS,配合HTML5、Ajax、jQuery等技术,可以设计出细腻、逼真的页面特效和交互行为,提升用户体验,如网页对象的显示/隐藏、定位、变形、运动等动态样式。 1、CSS脚本化基础 CSS样式有两种形式&…

学习笔记:CANOE模拟LIN主节点和实际从节点进行通信测试

先写点感想,在LIN开发阶段,我一般用图莫斯USB工具来进行模拟主机节点发送数据。后来公司买了CANOE工具就边学习边搭建了LIN的测试工程,网上的资料真的很少,主要是靠自己一点点摸索前进,总算入门。几个月后的今天&#…

基于swing的人事管理系统

概述 个人项目人事管理系统,针对部门和人员之间的管理。 详细 一、项目UI 二、项目结构 三、项目使用方法 Eclipse导入现有现有项目到工作空间即可,会自动加载包内相关jar包,使用的java源文件 四、部分代码 MainFrm.java package view…

Docker指定容器使用内存

Docker指定容器使用内存 作者:铁乐与猫 如果是还没有生成的容器,你可以从指定镜像生成容器时特意加上 run -m 256m 或 --memory-swap512m来限制。 -m操作指定的是物理内存,还有虚拟交换分区默认也会生成同样的大小,而–memory-…

ubuntu系统黑屏,且光标不闪烁

选择第二个,进入恢复模式 选择第二个,进入恢复模式 选择root 输入: startx然后就可以进入文本界面或者图形化界面了,如果不行,报错,可能需要需要下载这个包,把这个错误到网上搜索一下就可以找…

批量迁移redis实例的key

我们知道migrate 命令可以迁移redis的多个key,但是如果redis的key有非常多,那用起来就很不方便了。 所以下面分享一个脚本来实现批量key的迁移,主要使用的命令为dump和restore 脚本如下: #!/bin/bash redis-cli -h host1 -p 63…

Redis被攻击纪实

一、前言 声明:本文仅供技术交流使用,严禁采用本文的方法进行任何非法活动。 上周新来的同事分享Redis的原理和机制,想起2017年的时候测试环境Redis被攻击,最后只能重新安装服务器,今天试验一把利用Redis漏洞进行攻击…

成集云 | 英克对接零售O2O+线上商城 | 解决方案

方案介绍 零售O2O线上商城是一种新型的商业模式,它通过线上和线下的融合,提供更加便捷的购物体验。其中,O2O指的是线上与线下的结合,通过互联网平台与实体店面的结合,实现线上线下的互动和协同。线上商城则是指通过互…

AI优秀企业案例——机器人流程自动化:达观数据RPA

通过学习业内领先公司的最佳实践,我们可以更好地将它们应用到我们自己的公司和业务中。特别是第三部分,提供了大量应用案例,让我们一起期待看到这些案例的结尾。 1.简介 达观数据是一家专注于智能文本机器人的国家高新技术企业,…

Leetcode-面试题 02.02 返回倒数第 k 个节点

快慢指针:让快指针先移动n个节点,之后快慢指针一起依次向后移动一个结点,等到快指针移动到链表尾时,慢指针则移动到倒数第n个结点位置。 /*** Definition for singly-linked list.* public class ListNode {* int val;* …

矩阵等价和向量组等价的一些问题

什么是向量组?答:向量组是由若干同维数的列向量(或同维数的行向量)组成的集合。什么是向量组等价?答:两个向量组,各自拼成矩阵A和B,向量组等价就是三秩相等,即r&#xff…

点信息标注_BillboardTextActor3D

开发环境: Windows 11 家庭中文版Microsoft Visual Studio Community 2019VTK-9.3.0.rc0vtk-example参考代码 demo解决问题:点附近创建左边或其他信息,且信息面板显示状态不受相机缩放、旋转影响 prj name: BillboardTextActor3D #include…

STM32笔记—定时器

目录 一、TIM简介 二、基本定时器(TIM6和TIM7) 1. TIM6和TIM7简介 2. TIM6和TIM7的主要特性 3. TIM6和TIM7的功能 3.1 时基单元 3.2 计数模式 3.3 时钟源 三、通用定时器 1. TIMx(2、3、4、5)简介 2. TIMx主要功能 3. 时钟选择 4. 影子寄存…

计算机视觉驾驶行为识别应用简述

一、什么是计算机视觉识别? 计算机视觉识别是一种基于图像处理和机器学习的人工智能应用技术,可以用于多个场景。常见应用场景包括人脸识别、场景识别、OCR识别以及商品识别等。今天以咱们国产系统豌豆云为例,为大家梳理一下在车辆驾驶行为中…

在Google Kubernetes集群创建分布式Jenkins(二)

上一篇博客在Google Kubernetes集群创建分布式Jenkins(一)-CSDN博客我介绍了如何在GCP的K8S集群上部署一个分布式的Jenkins,并实现了一个简单的Pipeline的运行。 在实际的开发中,我们通常都会按照以下的CICD流程来设置Pipeline 在我司的实际实践中&…
最新文章