Kafka报 IO Exception(many open files)

楼高2年前技术文章872

1 线上问题

kafka报错many open files,查看日志如下截取部分错误信息

image.png

image.png

2 问题分析

首先看kafka监控平台的一些监控指标,topic列表中关于topic的信息项如下所示:

(1)topic名称,Partitions分区数,该topic 队列分布的broker数量

(2)Brokers Spread %:该topic中队列在Broker中的使用率,例如集群中有5个broker,但topic只在4个broker上创建了队列,那使用率为80%

(3)Brokers Skew %:topic的队列倾斜率。如果集群中存在5个broker节点,topic的总分区数量为4,副本因子为2,但这些队列只分布在其中的4台broker中,那topic的broker使用率(Broker Spread)为80%。

引入多节点的目的就是负载均衡,队列在broker中的分配自然是希望越均衡越好,期望每台broker上存储2个队列(副本因子为2,总共8个队列),表示没有发生倾斜,如果一台broker中的存在3个队列,而另外一个broker上1个队列,那说明发生了倾斜,计算公式为超过平均队列数的broker节点个数除以总所在Broker数量,其Brokers Skew等于(1/3)=33%。

(4)Brokers Leader Skew %:topic分区中Leader分区的倾斜率。在Kafka中,只有分区的Leader节点具有读写权限,真正影响性能读写性能的是Leader分区是否均衡,试想一下,如果一个topic有6个分区,但所有的Leader分区只分布在一两个Broker节点上,这个topic的写入、读取性能将受到制约,这个值建议维持在0%

(5)Replicas:副本数、副本因子,即一个分区数据存储的份数,该数值包含Leader分区。

(6)Under Replicated %:没有跟上复制进度的副本比例,在Kafka的复制模型中,主分区负责读写,该复制组内的其他副本从主节点同步数据,如果跟不上主节点的复制进度,将被提出ISR,被剔除ISR的副本不具备选举Leader的资格,这个数据如果长期或频繁高于0,说明集群一定出现了问题。

经过对Topic列表观察,发现开发环境存在大量的topic都只有一个队列,并且都分布在第一节点上,其截图如下:

在这里插入图片描述

从界面上对应的指标:Brokers Spread即Broker的利用率只有3分之一,抽取几个数据量大的主题,判断其路由信息,得知都分布在第一个Broker节点上,这样就导致其中一个节点大量出现文章开头部分提到的错误:Too many open files。

3.解决方案

(1)扩分区

问题定位出来了,由于Broker利用率不均匀,大量topic只创建了一个队列,并且还集中落到了第一个节点。


针对这种情况,首先想到的方案:扩分区。

(2)分区移动

由于存在大量的只有一个分区的topic,并且这些topic都分布到了第一个节点,是不是可以将某些topic的分区移动到其他节点呢?

准备需要执行迁移的topic信息,例如将如下信息保存在文件dw_kafka_040802-topics-to-move.json中。

{"topics":[{"topic":"dw_kafka_040802"}],"version": 1

}

使用kafka提供的kafka-reassign-partitions.sh命令生成执行计划

4. 分区进行迁移是否影响业务正常使用

作为一名运维人员,特别是对中间件做变更时,考虑对业务的影响范围是必备的一步,直接影响到实施的复杂度。

从源码实现机制分析:

只有在Leader选举期间会对消息发送、消息消费造成影响,但通过Zookeeper实现Leader选举可在秒级别响应,结合Kafka消息发送端的缓冲队列、重试机制,

在理论上可以做到对业务无影响


相关文章

Mysql删除binlog

binlog 是记录所有数据库表结构变更(例如CREATE、ALTER TABLE…)以及表数据修改(INSERT、UPDATE、DELETE…)的二进制日志。一、手动删除直接在 /var/lib/m...

SpringBootWeb 篇-深入了解 SpringBoot + Vue 的前后端分离项目部署上线与 Nginx 配置文件结构(3)

SpringBootWeb 篇-深入了解 SpringBoot + Vue 的前后端分离项目部署上线与 Nginx 配置文件结构(3)

4.0 SpringBoot 后端代码进行打包上传服务器        将 SpringBoot 项目进行打包:      &nb...

oracle11g db打补丁

1 升级opatch升级的方式就是解压安装包到ORACLE_HOME即可。oracle下执行Plain Text复制代码su - oracle1.备份原opatchcd $ORACLE_HOMEmv...

MySQL 8.0 新特性深度解析,成为数据库高手的必备!

MySQL 8.0 新特性深度解析,成为数据库高手的必备!

前言MySQL 5.7 在 2023 年 10 月 31 日起,就已经终止软件生命周期了,意味着 MySQL 官方将不再提供对 MySQL 5.7 版本的技术支持和更新。8.0 版本成为官方长期支持版...

AD域主备部署

AD域主备部署

总览在本篇文章中, 我将记录部署多 DC 实现高可用方案的详细步骤, 期间我会尽量使用 PowerShell 来实现相应的动作, 实在找不到命令或者 GUI 更方便的再附截图. 主要步骤分为:部署 2...

spark与mr的异同

1.MR:抽象层次低,需要使用手工代码来完成程序编写,使用上难以上手;Spark:Spark 采用RDD 计算模型,简单容易上手。2.MR:只提供map 和reduce 两个操作,表达能力欠缺;Spa...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。