当前位置: 首页 > news >正文

Kafka 典型问题与排查以及相关优化

Kafka 是一个高吞吐量的分布式消息系统,但在实际应用中,用户经常会遇到一些性能问题和消息堆积的问题。本文将介绍 Kafka 中一些典型问题的原因和排查方法,帮助用户解决问题并优化 Kafka 集群的性能。

一、Topic 消息发送慢,并发性能低

问题描述:

某个或某几个 Topic 的消息并发发送性能低,具体表现为 Producer 的平均请求延迟大,平均生产吞吐量低。

可能原因:

  1. 网络带宽不足,导致 IO 等待时间长。
  2. 消息未压缩,导致网络流量超负荷。
  3. 消息未批量发送或批量阈值配置不当,导致发送速率慢。
  4. Topic 分区数量不足,导致 Broker 接收消息积压。
  5. Broker 磁盘性能低,导致磁盘同步慢。
  6. Broker 分区总量过多,导致碎片化,磁盘读写过载。

排查方法: 

1、确认网络带宽:

检查 Producer 的平均 IO 等待时间指标,判断 Producer 到 Broker 之间的网络带宽是否满足业务的流量要求。

在一个节点上作为服务器启动 iperf
iperf -s在另一个节点上作为客户端测试网络带宽
iperf -c 192.168.10.21

2、确认消息压缩:

检查 Producer 的平均压缩率指标,确保压缩率符合预期。

在 Producer 配置中启用消息压缩
compression.type=gzip

3、消息未批量发送或批量阈值配置不当

 检查 Producer 的批量发送配置 batch.sizelinger.ms

操作命令: 查看 Producer 配置文件或代码,确认 batch.sizelinger.ms 设置。

优化方法: 调整 Producer 配置,增大批量发送大小和延迟时间:

batch.size=32768
linger.ms=10

4、增加 Topic 分区:

使用 Kafka 提供的命令行工具查看 Topic 分区数量

kafka-topics.sh --describe --topic <your_topic> --zookeeper <zookeeper_host>:2181

优化方法增加 Topic 的分区数量以提高并发处理能力:

kafka-topics.sh --alter --topic <your_topic> --partitions 10 --zookeeper <zookeeper_host>:2181

5、检查磁盘 IO 使用率:

确认 Broker 磁盘 IO 使用率是否在安全范围内,若使用率较高则考虑扩容 Broker 或增加 Topic 分区数。

 使用 iostatdstat 命令查看磁盘 IO 使用率:

iostat -x 1 10
dstat -d 1

优化方法

  • 升级磁盘为 SSD,提高磁盘性能。
  • 优化磁盘配置,确保磁盘 IO 性能最佳。

6、检查分区总量:

查看集群的总分区数和单个 Broker 的分区数量,确保在规划的容量范围内。

使用 Kafka 提供的命令行工具查看集群分区情况: 

kafka-topics.sh --describe --zookeeper <zookeeper_host>:2181

优化方法

  • 水平扩展 Broker,增加 Broker 数量以分散分区负载。
  • 通过增加 Broker 节点来均衡分区分布,减少单个 Broker 的分区数量。

二、Topic 消息堆积

问题描述:
某个或某几个 Topic 的消息堆积持续增加,具体表现为 Group 消费延迟数量持续增加。

可能原因:

  1. Producer 生产消息流量增大。
  2. Consumer 由于业务变化导致消费延迟增加。
  3. Consumer 数量不足。
  4. Consumer 数量频繁变化,导致 Group 不断做再平衡(Rebalance)。
  5. Broker 未收到 Consumer 的消息确认消息。

排查方法:

确认生产量:

检查 Producer 的消息生产量指标,判断是否明显增加。

确认消费量:

检查 Consumer 的消息流量指标,判断是否明显下降

检查 Consumer 数量:

通过 Kafka Broker 提供的命令,确认 Topic 对应的 Consumer 数量与实际的 Consumer 数量是否一致。如果不一致,说明某些 Consumer 未正确连接到 Broker,需要排查 Consumer 是否正常运行。

kafka-consumer-groups.sh --describe --group your_consumer_group --bootstrap-server broker_host:9092

观察 Consumer 变化:

观察 Consumer 的数量是否频繁变化而触发再平衡。由于网络或其他原因,可能导致 Consumer 与 Broker 之间的连接不稳定,Consumer 能持续消费消息,但 Broker 始终认为消息未确认,导致消费位点不变。此时可能需要确认 Consumer 与 Broker 之间的网络稳定性,甚至重启 Consumer。

三、优化 Kafka 生产性能

优化方法:

1、增大 Producer 发送消息的批量大小(batch.size)和批量发送等待时间(linger.ms)。

batch.size=32768
linger.ms=10

2、启用压缩

使用压缩算法减少网络带宽占用。

compression.type=gzip

3、增加分区数:

通过增加 Topic 的分区数,提高并发写入能力。

4、调整 Broker 配置

优化 Broker 的磁盘配置和 IO 设置,例如调整 log.segment.bytes 和 log.retention.hours。

四、优化 Kafka 消费性能

优化方法:

1、增大消费并发:

增加 Consumer 数量和分区数,提升并发消费能力。

2、优化消费逻辑:

确保 Consumer 的业务逻辑高效,减少单个消息处理时间。

3、平衡负载:

确保 Consumer Group 的每个 Consumer 都能均匀分配到分区。

五、Kafka 集群扩展与维护

扩展方法:

1、水平扩展 Broker:

增加 Broker 数量,均衡负载,提高集群容量。

(1)安装新Broker:

在新的服务器上安装Kafka,步骤与之前的安装步骤相同,确保Java已经安装。

(2)配置新 Broker:

编辑server.properties文件,设置新的broker.idlog.dirs,确保 zookeeper.connect指向现有的 Zookeeper集群。

broker.id=3  # 新的 Broker ID
listeners=PLAINTEXT://:9092
log.dirs=/data/kafka-logs
zookeeper.connect=192.168.10.20:2181,192.168.10.21:2181,192.168.10.22:2181
num.partitions=3
default.replication.factor=3

(3)启动新Broker

sudo su - kafka
/usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties

 (4)重新分配分区:

使用Kafka自带的工具将现有分区重新分配到新 Broker 上。

生成当前分区副本分配:

kafka-reassign-partitions.sh --zookeeper 192.168.10.20:2181 --generate --topics-to-move-json-file topics.json --broker-list "0,1,2,3"

topics.json内容:

{"version": 1,"topics": [{"topic": "test-topic"}]
}

 执行分区重新分配:

kafka-reassign-partitions.sh --zookeeper 192.168.10.20:2181 --execute --reassignment-json-file reassignment.json

2、动态扩展 Topic:

根据流量需求动态调整 Topic 的分区数。

 增加 Topic 的分区数量

kafka-topics.sh --alter --topic test-topic --partitions 10 --zookeeper 192.168.10.20:2181

维护方法:

定期监控:

使用 Kafka 自带的工具或第三方监控工具(如 Prometheus + Grafana)定期监控集群状态。

检查集群状态: 

kafka-broker-api-versions.sh --bootstrap-server 192.168.10.20:9092

检查 Topic 信息: 

kafka-topics.sh --describe --topic test-topic --zookeeper 192.168.10.20:2181

定期优化:

定期检查并优化配置,清理过期数据,保持集群健康运行。

优化server.properties中的配置,根据实际使用情况调整参数,如调整日志段大小和保留时间:

log.segment.bytes=1073741824  # 1 GB
log.retention.hours=168       # 7 days

清理过期数据

kafka-delete-records.sh --bootstrap-server 192.168.10.20:9092 --offset-json-file offsets.json

相关文章:

Kafka 典型问题与排查以及相关优化

Kafka 是一个高吞吐量的分布式消息系统&#xff0c;但在实际应用中&#xff0c;用户经常会遇到一些性能问题和消息堆积的问题。本文将介绍 Kafka 中一些典型问题的原因和排查方法&#xff0c;帮助用户解决问题并优化 Kafka 集群的性能。 一、Topic 消息发送慢&#xff0c;并发性…...

C# 策略模式(Strategy Pattern)

策略模式定义了一系列的算法&#xff0c;并将每一个算法封装起来&#xff0c;使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户。 // 策略接口 public interface IStrategy { void Execute(); } // 具体策略A public class ConcreteStrategyA : IStra…...

【初阶数据结构】1.算法复杂度

文章目录 1.数据结构前言1.1 数据结构1.2 算法1.3 如何学好数据结构和算法 2.算法效率2.1 复杂度的概念2.2 复杂度的重要性 3.时间复杂度3.1 大O的渐进表示法3.2 时间复杂度计算示例3.2.1 示例13.2.2 示例23.2.3 示例33.2.4 示例43.2.5 示例53.2.6 示例63.2.7 示例7 4.空间复杂…...

(图文详解)小程序AppID申请以及在Hbuilderx中运行

今天小编给大家带来了如何去申请APPID&#xff0c;如果你是小程序的开发者&#xff0c;就必须要这个id。 申请步骤 到小程序注册页面&#xff0c;注册一个小程序账号 微信公众平台 填完信息后提交注册 会在邮箱收到 链接激活账号 确认。邮箱打开链接后&#xff0c;会输入实…...

科技创新引领水利行业升级:深入分析智慧水利解决方案的核心价值,展望其在未来水资源管理中的重要地位与作用

目录 引言 一、智慧水利的概念与内涵 二、智慧水利解决方案的核心价值 1. 精准监测与预警 2. 优化资源配置 3. 智能运维管理 4. 公众参与与决策支持 三、智慧水利在未来水资源管理中的重要地位与作用 1. 推动水利行业转型升级 2. 保障国家水安全 3. 促进生态文明建设…...

ExcelVBA运用Excel的【条件格式】(三)

ExcelVBA运用Excel的【条件格式】&#xff08;三&#xff09;前面知识点回顾1. 访问 FormatConditions 集合 Range.FormatConditions2. 添加条件格式 FormatConditions.Add 方法语法表达式。添加 (类型、 运算符、 Expression1、 Expression2)其中 TextOperator:***&am…...

coco数据集格式计算mAP的python脚本

目录 背景说明COCOeval 计算mAPtxt文件转换为coco json 格式自定义数据集标注 背景说明 在完成YOLOv5模型移植&#xff0c;运行在板端后&#xff0c;通常需要衡量板端运行的mAP。 一般需要两个步骤 步骤一&#xff1a;在板端批量运行得到目标检测结果&#xff0c;可保存为yol…...

Linux学习——Linux中无法使用ifconfg命令

Linux学习——Linux中无法使用ifconfg命令&#xff1f; &#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅…...

二分查找3

1. 有序数组中的单一元素&#xff08;540&#xff09; 题目描述&#xff1a; 算法原理&#xff1a; 二分查找解题关键就在于去找到数组的二段性&#xff0c;这里数组的二段性是从单个数字a开始出现然后分隔出来的&#xff0c;如果mid落入左半部分那么当mid为偶数时nums[mid1]…...

从零开始学习嵌入式----C语言框架梳理与后期规划

目录 一、环境搭建. 二、见解 三、C语言框架梳理 四、嵌入式学习规划流程图&#xff08;学习顺序可能有变&#xff09; 一、环境搭建. C语言是一门编程语言&#xff0c;在学习的时候要准备好环境。我个人比较喜欢用VS,具体怎么安装请百度。学习C语言的时候&#xff0c;切忌…...

ESP32 步进电机精准控制:打造高精度 DIY 写字机器人,实现流畅书写体验

摘要: 想让你的 ESP32 不再仅仅是控制灯光的工具吗&#xff1f; 本文将带你使用 ESP32 开发板、步进电机和简单的机械结构打造一个能够自动写字的机器人。我们将深入浅出地讲解硬件连接、软件代码以及控制逻辑&#xff0c;并提供完整的项目代码和电路图&#xff0c;即使是 Ardu…...

传知代码-图神经网络长对话理解(论文复现)

代码以及视频讲解 本文所涉及所有资源均在传知代码平台可获取 概述 情感识别是人类对话理解的关键任务。随着多模态数据的概念&#xff0c;如语言、声音和面部表情&#xff0c;任务变得更加具有挑战性。作为典型解决方案&#xff0c;利用全局和局部上下文信息来预测对话中每…...

部署前端项目

常见部署方式有&#xff1a;静态托管服务、服务器部署 1. 静态托管服务 使用平台部署代码&#xff0c;比如 GitHub。 | 创建一个仓库&#xff0c;仓库名一般是 yourGithubName.github.io。 | 将打包后的静态文件文件上传到仓库。 | 在“Settings”&#xff08;选项&#xff0…...

使用POI实现Excel文件的读取(超详细)

目录 一 导入poi相关的maven坐标 二 实现创建并且写入文件 2.1实现步骤 2.2实现代码 2.3效果展示 ​编辑 2.4注意 三 实现从Excel文件中读取数据 3.1实现步骤 3.2实现代码 3.3结果展示 一 导入poi相关的maven坐标 <!-- Apache poi --><dependency><gro…...

Debezium系列之:记录一次数据库某张表部分数据未同步到hive表的原因

Debezium系列之:记录一次数据库某张表部分数据未同步到hive表的原因 一、背景二、查找数据丢失流程三、数据丢失原因四、解决方法一、背景 反馈mysql数据库中某张表的数据没有同步到hive中,现在需要排查定位下原因数据丢失一般常见需求排查的方向: 数据是否采集到hdfs上采集…...

爆破器材期刊

《爆破器材》简介   《爆破器材》自1958年创刊以来&#xff0c;深受广大读者喜爱&#xff0c;是中国兵工学会主办的中央级技术刊物&#xff0c;在国内外公开发行&#xff0c;近几年已发行到10个国家和地区。《爆破器材》杂志被美国著名检索机构《化学文摘》&#xff08;CA&a…...

Nginx Websocket 协议配置支持

前后分离的 Web 架构应用&#xff0c;在开发环境启动是可以直接连接支持 websocket 协议&#xff0c;因为没有中间件做转发处理。 当我们对前端进行编译后&#xff0c;通过 nginx 反向代理访问时&#xff0c;需要在nginx 配置文件中增加一些特定的头信息&#xff0c;让服务端识…...

【生成式对抗网络】GANs在数据生成、艺术创作,以及在增强现实和虚拟现实中的应用

一、GANs在数据生成中的应用 生成对抗网络&#xff08;Generative Adversarial Networks, GANs&#xff09;在数据生成领域具有显著的应用价值。GANs通过生成器&#xff08;Generator&#xff09;和判别器&#xff08;Discriminator&#xff09;两个相互竞争的神经网络&#x…...

大模型面试(三)

这次是某家公司的一个电话面试&#xff0c;问的过程还比较简单直接。 问&#xff1a;我们在大模型开源项目的应用上遇到了什么困难&#xff1f; 这个。。有两个困难&#xff0c;一个是RAG的优化&#xff0c;一开始RAG是比较慢的&#xff0c;而且召回率不高&#xff1b; 后来…...

pycharm中快捷键汇总

Pycarm指令汇总 Ctrl鼠标 单击&#xff0c;能直接查看其用法 Ctrl/ 快速注释 CtrlC 在pycharm的terminal中可以停止运行, 其他的地方可以复制。 CtrlV 粘贴 CtrlA 全选 CtrlP 查看&#xff08;&#xff09;中需要填写什么参数 Altenter 自动不补全所需要的库...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...