文章目录
- [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 状态 :
shsmartctl -a /dev/sdX
-
检查 Kafka 日志路径 是否可写:
shls -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),需要修复。
解决方案
-
手动删除损坏日志 :
shrm -rf /var/lib/kafka-logs/*
-
启用
unclean leader election
,防止副本同步异常 :propertiesunclean.leader.election.enable=true
-
强制格式化 Kafka 存储 :
shbin/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
显示磁盘已满
解决方案
-
清理过期日志:
shrm -rf /var/lib/kafka-logs/*
-
限制 Kafka 日志大小:
shretention.bytes=1073741824 # 1GB retention.ms=86400000 # 1天
案例 2:磁盘 I/O 过载导致 Kafka 失败
现象
- Kafka 频繁崩溃,
iostat
显示%iowait
过高
解决方案
-
更换 SSD,提高磁盘吞吐量。
-
限制 Kafka 负载:
propertiesnum.partitions=3 log.segment.bytes=536870912 # 512MB log.flush.interval.messages=10000
案例 3:Kafka 无法写入日志
现象
server.log
显示Permission denied
解决方案
-
修复 Kafka 目录权限:
shchown -R kafka:kafka /var/lib/kafka-logs chmod -R 755 /var/lib/kafka-logs