3.10.5 典型故障场景与应急处理
本节聚焦存储与文件系统的典型故障场景与应急处理,强调“快速止损、数据优先、可回滚”。处理流程建议遵循:确认影响范围→保护现场(只读或隔离)→收集证据→采取应急措施→恢复服务→复盘与预防。
应急处理流程草图:
典型故障场景与应急处理(含示例与排错)#
1) 磁盘满导致写入失败#
定位与清理
# 1. 查看文件系统使用率
df -hT
# 2. 定位大目录(按占用排序)
du -xh /var | sort -hr | head -n 20
# 3. 查找大文件(>1G)
find / -xdev -type f -size +1G -print 2>/dev/null
# 4. 清理日志(示例:保留最近7天)
find /var/log -type f -mtime +7 -name "*.log" -exec rm -f {} \;
临时止损与扩容
# 临时挂载新盘迁移数据
mkdir -p /mnt/newdisk
mount /dev/sdb1 /mnt/newdisk
# 迁移大目录(确保服务已停或只读)
rsync -aH --progress /var/lib/app/ /mnt/newdisk/app/
排错要点
- 避免直接删除数据库数据目录,优先使用应用层清理机制。
- 关注日志暴增、缓存堆积、core dump 堆积。
练习
- 制造一个大文件填满 1G 临时目录并清理:
fallocate -l 900M /tmp/bigfile
du -h /tmp/bigfile
rm -f /tmp/bigfile
2) I/O延迟突增或队列飙高#
定位
# 1. 实时 I/O 观察
iostat -x 1 5
# 2. 进程级 I/O 排查
iotop -o
# 3. 统计磁盘延迟
sar -d 1 5
命令解释
- iostat -x:关注 await、svctm、%util。
- iotop -o:仅显示当前有 I/O 的进程。
应急处理
# 将高I/O任务错峰(示例:暂停备份任务)
systemctl stop backup.service
# 业务限流或临时切流
# 示例:Nginx 限制并发(若为 Web 服务)
练习
- 使用 dd 触发 I/O 并观察:
dd if=/dev/zero of=/tmp/io_test bs=1M count=1024 oflag=direct
iostat -x 1 3
rm -f /tmp/io_test
3) 文件系统只读或挂载失败#
排错与修复
# 1. 查看内核日志
dmesg | tail -n 50
# 2. 检查挂载状态
mount | grep sda
# 3. 进入只读保护(如已只读,禁止进一步写入)
mount -o remount,ro /dev/sda1 /
# 4. 备份后执行修复(ext4示例)
umount /dev/sda1
fsck -f /dev/sda1
应急恢复
- 如有快照或备份,优先恢复。
- 修复后立即验证业务关键路径数据。
练习
- 使用 fsck -n 进行无破坏检查:
fsck -n /dev/sda1
4) 设备掉盘或RAID降级#
排错与应急
# 1. 查看 RAID 状态(mdadm示例)
cat /proc/mdstat
mdadm --detail /dev/md0
# 2. 检查磁盘健康
smartctl -a /dev/sdb
更换与重建(示例)
# 将故障盘标记为失效并移除
mdadm /dev/md0 --fail /dev/sdb1
mdadm /dev/md0 --remove /dev/sdb1
# 加入新盘
mdadm /dev/md0 --add /dev/sdc1
# 观察重建进度
watch -n 5 cat /proc/mdstat
5) inode 耗尽#
定位
# 1. 查看 inode 使用率
df -i
# 2. 统计小文件目录
find /var -xdev -type f | awk -F/ '{print $1"/"$2"/"$3}' | sort | uniq -c | sort -nr | head
应急处理
- 合并/打包小文件,调整日志切分策略。
- 规划文件系统 inode 参数或重建分区。
练习
# 制造小文件并观察 inode
mkdir -p /tmp/inode_test
for i in $(seq 1 10000); do touch /tmp/inode_test/file_$i; done
df -i | grep /tmp
rm -rf /tmp/inode_test
6) 网络存储抖动或中断(NFS示例)#
排错与切换
# 检查挂载
mount | grep nfs
# 临时切换为只读避免写入失败
mount -o remount,ro /mnt/nfs
# 应急切换到本地缓存(示例)
mkdir -p /mnt/local_cache
rsync -a /mnt/nfs/ /mnt/local_cache/
练习
- 断开网络接口模拟抖动并观察应用报错与重试策略。
7) LVM 元数据损坏或卷不可用#
排错与恢复
# 1. 查看 LVM 状态
pvs; vgs; lvs
# 2. 备份 LVM 元数据
vgcfgbackup -f /root/vg_backup.conf vg0
# 3. 尝试恢复
vgcfgrestore -f /root/vg_backup.conf vg0
8) 误删或误格式化#
应急步骤
- 立即停止写入,卸载分区。
- 使用备份/快照恢复。
- 如无备份,可尝试专用恢复工具(需严格评估写入风险)。
示例(快照恢复思路)
# LVM 快照恢复示例(需提前有快照)
lvconvert --merge /dev/vg0/snap_data
通用信息收集清单(应急必备)#
# 系统与磁盘信息
uname -a
df -hT
df -i
lsblk -f
# 内核与错误日志
dmesg | tail -n 100
journalctl -p err -b
# I/O 统计
iostat -x 1 3
应急演练建议#
- 每季度至少进行一次“磁盘满”“只读挂载”“RAID降级”演练。
- 演练必须含:故障定位 → 应急措施 → 业务验证 → 复盘记录。