MISCONF 是什么
当 RDB 快照保存失败(磁盘满、目录权限不对、fork 失败等)时,stop-writes-on-bgsave-error 会让实例拒绝写入并报 MISCONF 错误,读操作仍然可用。这是一个明确的取舍:用写入可用性换数据安全,避免在持久化已经失效的情况下继续堆积只存在于内存的数据。开启 AOF 时,AOF 写入失败同样会触发拒写。
基本信息
| 典型报错 | MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk |
|---|---|
| 触发条件 | bgsave 连续失败,或 AOF 写入失败 |
| 影响范围 | 写命令被拒,读命令正常 |
| 相关开关 | stop-writes-on-bgsave-error |
| 恢复方式 | 排除持久化故障后写入自动恢复,无需重启 |
常见根因与检查
| 根因 | 检查方式 | 处理 |
|---|---|---|
| 磁盘满 | df -h 与 df -i 看空间和 inode | 清理或扩容后确认可写 |
| 目录权限 | 检查 dir 指向路径的属主与权限 | 修正权限后重试保存 |
| fork 失败 | 日志中的 fork 报错与内存余量 | 降低内存压力,或检查内核相关参数 |
| 文件系统异常 | mount 输出与写入测试 | 修复挂载后恢复 |
| AOF 写入失败 | aof_last_write_status | 磁盘与权限一并排查 |
排查与恢复
排查与恢复
redis-cli INFO persistence | grep -E 'rdb_last_bgsave_status|aof_last_write_status'
redis-cli CONFIG GET dir
redis-cli CONFIG GET stop-writes-on-bgsave-error
df -h # 磁盘空间
df -i # inode 是否用尽
redis-cli BGSAVE # 修复后手动触发一次
redis-cli INFO persistence | grep rdb_last_bgsave_status # 确认状态转 ok典型使用场景
- 写入报错的应急处置:先确认是不是持久化失败引发的拒写
- 磁盘容量巡检:把空间与 inode 一起纳入监控
- 权限变更后的验证:改完目录属主或挂载后立即试保存
- 告警设计:拒写是强信号,应直达值班
- 复盘:区分环境问题(磁盘、权限)与配置问题
该机制是可恢复的:修好根因后写入自动恢复,不需要重启实例;恢复后建议手动触发一次保存,确认状态真的转好。
排查顺序建议:先看 INFO persistence 的保存状态与最近保存时间,再看 dir 指向的磁盘空间与权限,最后才考虑内核参数与内存规模。
为了尽快恢复写入而直接关闭 stop-writes-on-bgsave-error,等于把「持久化失效」变成「静默不落盘」,数据风险显著放大;绝大多数情况应先处理磁盘或权限。