Kafka常见问题之 java.io.IOException: Disk error when trying to write to log

ops/2025/2/4 0:09:37/

文章目录

  • Kafka常见问题之 java.io.IOException: Disk error when trying to write to log
  • 1. 问题概述
  • 2. 问题排查方向
    • (1)磁盘空间不足
    • (2)磁盘 I/O 故障
    • (3)Kafka 日志文件损坏
    • (4)Kafka 进程权限不足
    • (5)Kafka 配置错误
  • 3. 案例分析
    • 案例 1:磁盘满导致 Kafka 崩溃
    • 案例 2:磁盘 I/O 过载导致 Kafka 失败
    • 案例 3:Kafka 无法写入日志

javaioIOException_Disk_error_when_trying_to_write_to_log_1">Kafka常见问题之 java.io.IOException: Disk error when trying to write to log

1. 问题概述

在 Kafka Broker 运行时,可能会遇到以下错误:

java.io.IOException: Disk error when trying to write to logat org.apache.kafka.common.errors.KafkaStorageException

这个错误表明 Kafka 在 写入日志文件 时遇到了 磁盘错误,通常出现在 Kafka Broker 端

2. 问题排查方向

(1)磁盘空间不足

Kafka 需要足够的磁盘空间存储日志,如果磁盘已满,Kafka 无法写入日志,会报此错误。

如何检查磁盘空间?

df -h

示例输出:

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       50G   50G   0G   100% /

这里 磁盘已满(100%),Kafka 无法写入。

解决方案
方法 1:清理 Kafka 过期日志

kafka-configs.sh --alter --zookeeper localhost:2181 --entity-type topics --entity-name my-topic --add-config retention.ms=3600000

这会将 my-topic 的日志保留时间缩短到 1 小时

方法 2:删除过期日志

rm -rf /var/lib/kafka-logs/*

方法 3:扩容磁盘
如果空间不足,考虑 增加磁盘更改 Kafka 日志目录

log.dirs=/new/path/to/kafka/logs

然后重启 Kafka:

bin/kafka-server-stop.sh
bin/kafka-server-start.sh -daemon config/server.properties

(2)磁盘 I/O 故障

如果磁盘发生硬件故障或 Kafka 进程 无权限 访问磁盘,也会导致此错误。

如何检查磁盘 I/O 状态?

iostat -x 1 10

如果 %iowait 非常高,说明磁盘 I/O 过载,Kafka 可能因为磁盘压力导致失败。

解决方案

  • 更换磁盘检查磁盘 SMART 状态
    smartctl -a /dev/sdX
    
  • 检查 Kafka 日志路径是否可写:
    ls -ld /var/lib/kafka-logs
    chown -R kafka:kafka /var/lib/kafka-logs
    chmod -R 755 /var/lib/kafka-logs
    

(3)Kafka 日志文件损坏

如果 Kafka 日志文件损坏,Broker 可能无法写入,导致 IOException

如何检查日志文件?

ls -lh /var/lib/kafka-logs

如果 Kafka 日志 异常大损坏(corrupt),需要修复。

解决方案

  • 手动删除损坏日志
    rm -rf /var/lib/kafka-logs/*
    
  • 启用 unclean leader election,防止副本同步异常
    unclean.leader.election.enable=true
    
  • 强制格式化 Kafka 存储
    bin/kafka-storage.sh format -t <cluster-id> -c config/kraft/server.properties
    
    ** 注意**:此操作会删除所有 Kafka 数据,仅在不可恢复时使用。

(4)Kafka 进程权限不足

如果 Kafka 没有足够权限 写入日志目录,也会触发 IOException

如何检查 Kafka 进程用户?

ps -ef | grep kafka

示例输出:

kafka     12345  1  0 10:00 ?        00:00:00 /usr/bin/java -jar kafka.jar

如果 Kafka 进程是 kafka 用户运行,确保它有写入权限:

ls -ld /var/lib/kafka-logs

示例输出:

drwxr-xr-x  2 root root 4096 Jan 30 10:00 /var/lib/kafka-logs

如果 Kafka 无法写入,执行:

chown -R kafka:kafka /var/lib/kafka-logs
chmod -R 755 /var/lib/kafka-logs

然后重启 Kafka:

systemctl restart kafka

(5)Kafka 配置错误

如果 Kafka 配置了 错误的 log.dirs 路径,可能会导致 Disk error

检查 Kafka 日志路径
查看 server.properties

log.dirs=/var/lib/kafka-logs

确保这个目录 存在且可写

mkdir -p /var/lib/kafka-logs
chown -R kafka:kafka /var/lib/kafka-logs
chmod -R 755 /var/lib/kafka-logs

3. 案例分析

案例 1:磁盘满导致 Kafka 崩溃

现象

  • server.log 出现 Disk error when trying to write to log
  • df -h 显示磁盘已满

解决方案

  1. 清理过期日志:
    rm -rf /var/lib/kafka-logs/*
    
  2. 限制 Kafka 日志大小:
    retention.bytes=1073741824  # 1GB
    retention.ms=86400000  # 1天
    

案例 2:磁盘 I/O 过载导致 Kafka 失败

现象

  • Kafka 频繁崩溃,iostat 显示 %iowait 过高

解决方案

  1. 更换 SSD,提高磁盘吞吐量。
  2. 限制 Kafka 负载:
    num.partitions=3
    log.segment.bytes=536870912  # 512MB
    log.flush.interval.messages=10000
    

案例 3:Kafka 无法写入日志

现象

  • server.log 显示 Permission denied

解决方案

  1. 修复 Kafka 目录权限:
    chown -R kafka:kafka /var/lib/kafka-logs
    chmod -R 755 /var/lib/kafka-logs
    

http://www.ppmy.cn/ops/155425.html

相关文章

本地部署DeepSeek教程(Mac版本)

第一步、下载 Ollama 官网地址&#xff1a;Ollama 点击 Download 下载 我这里是 macOS 环境 以 macOS 环境为主 下载完成后是一个压缩包&#xff0c;双击解压之后移到应用程序&#xff1a; 打开后会提示你到命令行中运行一下命令&#xff0c;附上截图&#xff1a; 若遇…

我的Go+语言初体验——环境搭建并用命令行和 VScode 输出 “Hello World”_gop windows helloworld

fmt.Println(“Hello, World!”) } test.go 运行成功&#xff0c;截图如下&#xff1a; ![在这里插入图片描述](https://img-blog.csdnimg.cn/82daf2752d2e40c7afac6dc4a156429d.png)#### 3.安装GO&#xff08;1&#xff09;下载Go安装包官方 GitHub 地址&#xff1a;<http…

JVM篇:对象的深度剖析

前8个字节是markword&#xff0c;它的值是&#xff1a;00000001 00000000 00000000 00000000 00000000 00000000 00000000 00000000。其中01是锁标志位&#xff0c;前面的0表示是否是偏向锁&#xff0c;我们这个对象是没有加锁的&#xff0c;所以这个地方是0。后4个字节是类型指…

音视频入门基础:RTP专题(5)——FFmpeg源码中,解析SDP的实现

一、引言 FFmpeg源码中通过ff_sdp_parse函数解析SDP。该函数定义在libavformat/rtsp.c中&#xff1a; int ff_sdp_parse(AVFormatContext *s, const char *content) {const char *p;int letter, i;char buf[SDP_MAX_SIZE], *q;SDPParseState sdp_parse_state { { 0 } }, *s1…

【C++语言】卡码网语言基础课系列----13. 链表的基础操作I

文章目录 背景知识链表1、虚拟头节点(dummyNode)2、定义链表节点3、链表的插入 练习题目链表的基础操作I具体代码实现 小白寄语诗词共勉 背景知识 链表 与数组不同&#xff0c;链表的元素存储可以是连续的&#xff0c;也可以是不连续的&#xff0c;每个数据除了存储本身的信息…

2 MapReduce

2 MapReduce 1. MapReduce 介绍1.1 MapReduce 设计构思 2. MapReduce 编程规范3. Mapper以及Reducer抽象类介绍1.Mapper抽象类的基本介绍2.Reducer抽象类基本介绍 4. WordCount示例编写5. MapReduce程序运行模式6. MapReduce的运行机制详解6.1 MapTask 工作机制6.2 ReduceTask …

【ARM】解决MDK在打开工程的时候提示CMSIS的版本不对问题

1、 文档目标 解决MDK在打开使用Compiler 6的工程的时候&#xff0c;提示CMSIS 的API版本过低的报错。 2、 问题场景 客户在Pack包中打开一个示例工程&#xff0c;打算熟悉一下对应芯片的功能和软件的功能&#xff0c;但是&#xff0c;打开软件后&#xff0c;在构建信息输出框…

Learning Vue 读书笔记 Chapter 4

4.1 Vue中的嵌套组件和数据流 我们将嵌套的组件称为子组件&#xff0c;而包含它们的组件则称为它们的父组件。 父组件可以通过 props向子组件传递数据&#xff0c;而子组件则可以通过自定义事件&#xff08;emits&#xff09;向父组件发送事件。 4.1.1 使用Props向子组件传递…