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