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
相关推荐
guo_wen_qiang1 小时前
mac中docker desktop服务端开启远程访问
运维·服务器·macos·docker
小五传输2 小时前
消防总队信创改造实践:国产文件传输服务器解决文件传输难题
大数据·运维·安全
云飞云共享云桌面2 小时前
医疗器械设备研发:多人同时操作 SolidWorks,怎样依靠单台服务器替代多工作站
运维·服务器·网络·数据库·制造
T型码农要学习2 小时前
开源项目5|FileBrowser:免费在线文件管理器!随时随地管控服务器文件
运维·服务器·人工智能·开源
qfljg3 小时前
OpenRewrite 实战指南
java
朱 欢 庆3 小时前
云服务器附件备份到本机内网服务器
运维·服务器·前端·经验分享
Sylvia33.3 小时前
LOL实时数据接入深度解析:从WebSocket到完整数据模型
java·网络·python·websocket·网络协议
jyOverQ3 小时前
RabbitMQ 消息积压怎么办?Prefetch、消费者并发与扩容
分布式·后端·rabbitmq
智恒百亿3 小时前
8 卡 RTX 5090 服务器深度实测:256GB 显存能否支撑 70B 模型微调?选型参考
大数据·运维·服务器·人工智能
2601_962071578 小时前
【Java报错已解决】org.springframework.beans.factory.BeanCreationException
java·开发语言