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:关注 awaitsvctm%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降级”演练。
  • 演练必须含:故障定位 → 应急措施 → 业务验证 → 复盘记录。