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. 问题概述
- 2. 问题排查方向
- (1)磁盘空间不足
- (2)磁盘 I/O 故障
- (3)Kafka 日志文件损坏
- (4)Kafka 进程权限不足
- (5)Kafka 配置错误
- 3. 案例分析
- 案例 1:磁盘满导致 Kafka 崩溃
- 案例 2:磁盘 I/O 过载导致 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 无法写入日志,会报此错误。
如何检查磁盘空间?
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 存储:
** 注意**:此操作会删除所有 Kafka 数据,仅在不可恢复时使用。bin/kafka-storage.sh format -t <cluster-id> -c config/kraft/server.properties
(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
显示磁盘已满
解决方案
- 清理过期日志:
rm -rf /var/lib/kafka-logs/*
- 限制 Kafka 日志大小:
retention.bytes=1073741824 # 1GB retention.ms=86400000 # 1天
案例 2:磁盘 I/O 过载导致 Kafka 失败
现象
- Kafka 频繁崩溃,
iostat
显示%iowait
过高
解决方案
- 更换 SSD,提高磁盘吞吐量。
- 限制 Kafka 负载:
num.partitions=3 log.segment.bytes=536870912 # 512MB log.flush.interval.messages=10000
案例 3:Kafka 无法写入日志
现象
server.log
显示Permission denied
解决方案
- 修复 Kafka 目录权限:
chown -R kafka:kafka /var/lib/kafka-logs chmod -R 755 /var/lib/kafka-logs