首页/数据/Redis 进阶速查/fsync 错误与数据安全
持久化56 条

fsync 错误与数据安全

Linux 上 fsync 返回错误后,脏页可能已被丢弃:此时继续写入会让「已确认落盘」的假设失效,Redis 检测到写错误会停写并告警,需要人工介入。

Redis 进阶速查数据更新于 2026-10-13

写入失败意味着什么

在 Linux 上,fsync 返回错误之后,内核可能已经把待写的脏页丢弃,也就是说「调用已成功」并不代表数据真的落到了盘上。Redis 检测到写错误后会停止接受写命令,并在状态字段里标记为错误,避免在数据无法落盘的前提下继续对业务承诺写入成功。这类错误的常见原因是磁盘写满、磁盘或控制器硬件故障、文件系统异常。

基本信息

错误表现状态字段变为 err,写命令开始报错
常见原因磁盘写满、硬件故障、文件系统或存储链路异常
处置顺序先停写、保留现场、再排查存储、必要时切副本
观察入口INFO persistence 的状态字段与系统日志
数据影响已确认但未落盘的数据可能丢失

典型使用场景

  • 应用侧出现写失败报错,需要快速判断是实例问题还是存储问题
  • 磁盘告警与写入报错同时出现,确认二者是否同源
  • 切换到备用实例前评估数据损失范围,为对账做准备
  • 复盘存储故障时梳理当时的状态字段与系统日志证据
  • 制定存储层巡检项,把 fsync 错误纳入日常监控

排查命令

排查命令
redis-cli INFO persistence | grep -E 'aof_last_write_status|rdb_last_bgsave_status'
df -h /data/redis                       # 是否磁盘写满
dmesg | tail -30                        # 内核层面的 IO 或设备错误
tail -50 /var/log/redis/redis.log       # 实例记录的写入失败原文
mount | grep /data                      # 确认文件系统类型与挂载参数

状态字段判读

状态字段正常值异常时的含义
AOF 写状态okerr 表示最近一次写入失败,写命令被拒
RDB 保存状态okerr 表示后台保存失败,会触发写保护
磁盘剩余空间留有重写峰值余量空间耗尽是最常见的直接原因
内核设备日志无 IO 错误出现设备或文件系统错误指向硬件层
出现该错误后直接重启可能掩盖问题:重启会清掉现场,而磁盘或硬件故障依旧存在,先保留日志与磁盘状态再恢复服务。
关键数据场景要评估底层存储链路是否可靠上报写入错误,某些虚拟化或网络存储层会出现「写成功但数据没落盘」的静默故障。

易错点

  • 看到写失败先重启实例,日志与磁盘现场被覆盖,后续无法定位根因
  • 只关注应用报错不去看磁盘剩余空间,错过了最简单也最常见的成因
  • 在存储故障期间继续写入并对外返回成功,恢复后需要对账的范围被放大
  • 把状态字段的 err 当成偶发抖动忽略掉,实际上底层设备已经开始出现坏道

数据来源与参考

  • Redis 官方文档:appendfsync 与 fsync 错误处理说明
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌