问题出现得很突然,日志倒是留得挺全。凌晨备份脚本把数据盘写满,之后 Redis 6.2 所有写命令都返回 MISCONF Redis is configured to save RDB snapshots, but it’s currently unable to persist to disk,读还正常,监控上只有写失败在涨。
刚开始盯着「数据目录属主被改过,子进程没有写权限,和磁盘满的表现完全一样」,折腾了半个多小时,排掉了。
把日志和配置对完,能解释这个现象的基本就这几处。磁盘写满后 fork 出来的子进程没法把快照落盘,父进程按状态标记为持久化失败。还有一种是stop-writes-on-bgsave-error 默认是 yes,落盘一失败就直接拒绝所有写命令。
还有一种情况,RDB 与 AOF 放在同一块盘,任何一次重写失败都会连带影响另一份。
先看磁盘与目录权限
df -h /var/lib/redis && ls -ld /var/lib/redis
随后确认这个策略是谁在起作用
redis-cli config get stop-writes-on-bgsave-error
腾出空间后手工触发一次落盘
redis-cli config set dbfilename dump.rdb && redis-cli bgsave
等前面都确认过,再把持久化目录挪到独立数据盘
redis-cli config set dir /data/redis && redis-cli info persistence | grep rdb_last_bgsave_status
怎么算真的好了,看的是同一批现象。写命令重新返回 OK,info persistence 里 rdb_last_bgsave_status 是 ok,error.log 不再刷 MISCONF,写 QPS 恢复到故障前。
这里还有个坑。关掉这个策略能立刻恢复写入但会丢数据,先腾空间再谈要不要关;dir 别指向会被日志或备份占满的目录。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
