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

文章目录

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

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 log
	at org.apache.kafka.common.errors.KafkaStorageException

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

2. 问题排查方向

(1)磁盘空间不足

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

如何检查磁盘空间?

sh 复制代码
df -h

示例输出:

复制代码
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       50G   50G   0G   100% /

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

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

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

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

方法 2:删除过期日志

sh 复制代码
rm -rf /var/lib/kafka-logs/*

方法 3:扩容磁盘

如果空间不足,考虑 增加磁盘更改 Kafka 日志目录

properties 复制代码
log.dirs=/new/path/to/kafka/logs

然后重启 Kafka:

sh 复制代码
bin/kafka-server-stop.sh
bin/kafka-server-start.sh -daemon config/server.properties

(2)磁盘 I/O 故障

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

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

sh 复制代码
iostat -x 1 10

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

解决方案

  • 更换磁盘检查磁盘 SMART 状态

    sh 复制代码
    smartctl -a /dev/sdX
  • 检查 Kafka 日志路径 是否可写:

    sh 复制代码
    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

如何检查日志文件?

sh 复制代码
ls -lh /var/lib/kafka-logs

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

解决方案

  • 手动删除损坏日志

    sh 复制代码
    rm -rf /var/lib/kafka-logs/*
  • 启用 unclean leader election,防止副本同步异常

    properties 复制代码
    unclean.leader.election.enable=true
  • 强制格式化 Kafka 存储

    sh 复制代码
    bin/kafka-storage.sh format -t <cluster-id> -c config/kraft/server.properties

    ** 注意**:此操作会删除所有 Kafka 数据,仅在不可恢复时使用。

(4)Kafka 进程权限不足

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

如何检查 Kafka 进程用户?

sh 复制代码
ps -ef | grep kafka

示例输出:

复制代码
kafka     12345  1  0 10:00 ?        00:00:00 /usr/bin/java -jar kafka.jar

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

sh 复制代码
ls -ld /var/lib/kafka-logs

示例输出:

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

如果 Kafka 无法写入,执行:

sh 复制代码
chown -R kafka:kafka /var/lib/kafka-logs
chmod -R 755 /var/lib/kafka-logs

然后重启 Kafka:

sh 复制代码
systemctl restart kafka

(5)Kafka 配置错误

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

检查 Kafka 日志路径

查看 server.properties

properties 复制代码
log.dirs=/var/lib/kafka-logs

确保这个目录 存在且可写

sh 复制代码
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. 清理过期日志:

    sh 复制代码
    rm -rf /var/lib/kafka-logs/*
  2. 限制 Kafka 日志大小:

    sh 复制代码
    retention.bytes=1073741824  # 1GB
    retention.ms=86400000  # 1天

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

现象

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

解决方案

  1. 更换 SSD,提高磁盘吞吐量。

  2. 限制 Kafka 负载:

    properties 复制代码
    num.partitions=3
    log.segment.bytes=536870912  # 512MB
    log.flush.interval.messages=10000

案例 3:Kafka 无法写入日志

现象

  • server.log 显示 Permission denied

解决方案

  1. 修复 Kafka 目录权限:

    sh 复制代码
    chown -R kafka:kafka /var/lib/kafka-logs
    chmod -R 755 /var/lib/kafka-logs
相关推荐
JZC_xiaozhong1 天前
数据不互通、审批慢?企业多系统智能协同与流程自动化解决方案
运维·自动化·流程管理·流程自动化·数据集成与应用集成·流程监控·流程可视化设计
爱学习的小囧1 天前
ESXi 8.0 原生支持 NVMe 固态硬盘吗?VMD 配置详解教程
linux·运维·服务器·esxi·esxi8.0
lUie INGA1 天前
在2023idea中如何创建SpringBoot
java·spring boot·后端
坚持就完事了1 天前
Linux中的变量
linux·运维·服务器
hERS EOUS1 天前
nginx 代理 redis
运维·redis·nginx
geBR OTTE1 天前
SpringBoot中整合ONLYOFFICE在线编辑
java·spring boot·后端
Porunarufu1 天前
博客系统UI自动化测试报告
java
Cat_Rocky1 天前
利用Packet Tracer网络实验
linux·运维·服务器
嵌入式×边缘AI:打怪升级日志1 天前
Linux 驱动实战:SR501 人体红外传感器驱动开发与调试全记录
linux·运维·驱动开发