kafka hang 问题记录

2024-01-20 15:28
文章标签 问题 记录 kafka hang

本文主要是介绍kafka hang 问题记录,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考文档

https://cloud.tencent.com/developer/article/1821477

9092端口

端口9092通常与Apache Kafka关联。
Kafka是一个开源的分布式事件流平台,用于构建实时的数据管道和流应用。
它能够处理任意大小的数据,以容错的方式处理数据流。

在默认配置中,Kafka的代理(Broker)监听9092端口以接收来自生产者(Producers)、消费者(Consumers)以及其他Kafka代理的连接请求。
生产者将事件数据发送到Kafka,而消费者从Kafka读取这些数据。这些操作都通过9092端口完成。

注意
尽管9092是Kafka默认的端口,但它可以在Kafka的配置文件中进行修改。
这在多代理部署或网络策略需要其他端口时非常有用。

kafka-consumer-groups.sh

kafka-consumer-groups.sh 是 Apache Kafka 分发包中的一个 shell 脚本,用于列出所有消费者组
描述消费者组的详细信息,或者删除消费者组信息。

列出所有消费者组:
kafka-consumer-groups.sh --bootstrap-server localhost:9092 --list

描述特定消费者组的详细信息:
kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group my-group --describe

删除特定消费者组的信息:
kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group my-group --delete

注意:–bootstrap-server 参数指定了 Kafka 集群的一个或多个 broker 地址
如果Kafka集群布署在别的主机或者端口,那么需要修改localhost:9092参数,指向真正的Kafka集群地址

只要命令中的 --bootstrap-server 参数正确地指向了 Kafka 集群中的任意一个可用的 Broker 地址
kafka-consumer-groups.sh --bootstrap-server localhost:9092 --list 命令就能够列出该 Kafka 集群中的全部消费者组。

topic的leader为-1

如果一个topic的leader为-1,那通常意味着这个topic的所有副本都不可用。
Kafka中每个partition都有一个leader副本,所有的读写操作都会通过这个leader副本进行。
每个partition还可以有一个或多个follower副本,它们会尽可能地同步leader副本的数据,以提供高可用性和故障转移。

如果leader副本宕机或者其他原因不可用,那么Kafka会从follower副本中选举一个新的leader。
但是如果没有可用的follower副本(比如所有副本都宕机或者消失),
那么这个partition就没有可用的leader,leader的id就会显示为-1。

此时,这个partition就无法正常工作,任何试图读取或写入这个partition的操作都会失败。
需要尽快恢复副本,使partition重新有可用的leader。
可以检查Kafka集群的健康状况,并查看为什么所有的副本都不可用。
可能的原因包括磁盘故障、网络故障、Kafka broker配置问题等。

kafka-topics.sh --describe --bootstrap-server localhost:9092 --topic your_topic_name
在运行这个命令后,会输出一些列的信息
包括每个partition的ID,当前的leader,及副本和ISR(in-sync replica,同步副本)的列表

注意
Kafka集群的每个partition都有一个leader,所以一个topic可能有多个leader,分别负责不同的partition

HW采集程序,采集某个消费组下某个topic的情况

首先需要一个运行环境 (例如 Python) 并安装相应的库 (如 HW Python SDK)
然后需要连接到 Kafka 集群并订阅主题

from hwsdk import get_consumer
import time# 定义消费组和相关主题
group_id = 'your_group_id'
topics = ['topic1', 'topic2']# 创建消费者实例
consumer = get_consumer(group_id)# 订阅多个主题
consumer.subscribe(topics)# 采集数据
while True:# 在Python里面,消费者库会自动处理__consumer_offsets的读写# 只需要调用poll()或者consume()等方法就能读取到新的消息,并且库会自动更新偏移量# 如果想要手动控制偏移量,也可以使用commit()等方法msg = consumer.poll(1.0)if msg is None:continueif msg.error():print("Consumer error: {}".format(msg.error()))continueprint('Received message: {}'.format(msg.value().decode('utf-8')))time.sleep(5)  # 每5秒采集一次数据# 退出时关闭消费者连接
consumer.close()

hang住问题记录

前端时间debug问题时,消费侧hang住,积压严重,迁移了消费者还是会hang住
分区offset更新到最新后(直接丢弃业务数据用于止损),积压消除,但是后续又慢慢积压上来了

问题原因

消费侧的代码逻辑是个for循环,因为某些异常业务导致for循环5分钟以上仍未执行结束
单分区被hang住后,offset无法往前移动,导致该分区后续消息积压

解决办法

如果某个分区因为某个实例被hang住,重置某分区的offset到最新后,因为没有重启消费侧的服务
所以被hang住的消费实例还是会一直处理这个消息直到结束
处理完后提交offset时,Broker才会忽略该offset,因为offset已经重置到最新
因为处于配置封禁期,因此临时将for循环添加过滤和及时退出逻辑,才解决该问题

复线

创建一个topic,设置两个分区0和1
Broker配置滑动窗口限制为3,worker数量3,worker缓冲大小3
消费侧配置两个消费者,奇数key不阻塞,偶数key hang住10分钟(for循环20次,每次sleep 30秒)
单分区被hang住后,offset无法往前移动,导致该分区后续消息积压
发送消息,让单分区hang住,消息产生积压,当600秒执行完之后,后面的消息正常处理

__consumer_offsets

Kafka内部用于追踪消费者组对主题分区进行消费的偏移量的特殊topic。
每个消费者组对每个主题的每个分区都有一个偏移量,表示这个消费者组最后一次消费到这个分区的哪个位置。
这样在消费者重启或者其他故障恢复的时候,可以从这个位置开始接着读,不会丢失中间的消息。

__consumer_offsetstopic通常对用户是不可见的,因为它存储的是Kafka的内部数据。
对于一般的应用开发,不需要也不应该去直接操作这个topic。
但是对于理解Kafka的工作机制,以及进行一些底层的调整优化等工作,了解这个概念还是有帮助的。

这篇关于kafka hang 问题记录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/626464

相关文章

IDEA和GIT关于文件中LF和CRLF问题及解决

《IDEA和GIT关于文件中LF和CRLF问题及解决》文章总结:因IDEA默认使用CRLF换行符导致Shell脚本在Linux运行报错,需在编辑器和Git中统一为LF,通过调整Git的core.aut... 目录问题描述问题思考解决过程总结问题描述项目软件安装shell脚本上git仓库管理,但拉取后,上l

idea npm install很慢问题及解决(nodejs)

《ideanpminstall很慢问题及解决(nodejs)》npm安装速度慢可通过配置国内镜像源(如淘宝)、清理缓存及切换工具解决,建议设置全局镜像(npmconfigsetregistryht... 目录idea npm install很慢(nodejs)配置国内镜像源清理缓存总结idea npm in

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

idea突然报错Malformed \uxxxx encoding问题及解决

《idea突然报错Malformeduxxxxencoding问题及解决》Maven项目在切换Git分支时报错,提示project元素为描述符根元素,解决方法:删除Maven仓库中的resolv... 目www.chinasem.cn录问题解决方式总结问题idea 上的 maven China编程项目突然报错,是

Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题

《Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题》在爬虫工程里,“HTTPS”是绕不开的话题,HTTPS为传输加密提供保护,同时也给爬虫带来证书校验、... 目录一、核心问题与优先级检查(先问三件事)二、基础示例:requests 与证书处理三、高并发选型:

前端导出Excel文件出现乱码或文件损坏问题的解决办法

《前端导出Excel文件出现乱码或文件损坏问题的解决办法》在现代网页应用程序中,前端有时需要与后端进行数据交互,包括下载文件,:本文主要介绍前端导出Excel文件出现乱码或文件损坏问题的解决办法,... 目录1. 检查后端返回的数据格式2. 前端正确处理二进制数据方案 1:直接下载(推荐)方案 2:手动构造

Python绘制TSP、VRP问题求解结果图全过程

《Python绘制TSP、VRP问题求解结果图全过程》本文介绍用Python绘制TSP和VRP问题的静态与动态结果图,静态图展示路径,动态图通过matplotlib.animation模块实现动画效果... 目录一、静态图二、动态图总结【代码】python绘制TSP、VRP问题求解结果图(包含静态图与动态图

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

docker编写java的jar完整步骤记录

《docker编写java的jar完整步骤记录》在平常的开发工作中,我们经常需要部署项目,开发测试完成后,最关键的一步就是部署,:本文主要介绍docker编写java的jar的相关资料,文中通过代... 目录all-docker/生成Docker打包部署文件配置服务A的Dockerfile (a/Docke

MySQL使用EXISTS检查记录是否存在的详细过程

《MySQL使用EXISTS检查记录是否存在的详细过程》EXISTS是SQL中用于检查子查询是否返回至少一条记录的运算符,它通常用于测试是否存在满足特定条件的记录,从而在主查询中进行相应操作,本文给大... 目录基本语法示例数据库和表结构1. 使用 EXISTS 在 SELECT 语句中2. 使用 EXIS