Redis 6.2 开了 appendonly yes 和 appendfsync everysec,机房一次断电后从 AOF 恢复,业务方说最近一秒的写入丢了,追问是不是配置没生效。
把日志和配置对完,能解释这个现象的基本就这几处。everysec 本来就是每秒刷一次盘,掉电丢一秒是设计内的行为;AOF 重写期间新写入进缓冲区,重写没完成就断电会丢更多;磁盘 IO 打满时后台 fsync 被阻塞,主线程也跟着卡;用的是 RDB 恢复,AOF 文件损坏后退回了快照。
上来先确认 AOF 是否真的在生效
redis-cli CONFIG GET appendonly && redis-cli INFO persistence | grep aof
接着看最近一次重写和 fsync 的状态
redis-cli INFO persistence | grep -E 'rdb_last_bgsave_status|aof_last_bgrewrite_status'
然后改成 always 只对关键业务验证代价
redis-cli CONFIG SET appendfsync always
等前面都确认过,再检查 AOF 文件是否完整
redis-check-aof --fix /var/lib/redis/appendonly.aof
当时还开着另一个排查窗口,两边日志对照着看才定位到。
改完先别撤,确认这几项。INFO persistence 里 aof_enabled 为 1,aof_last_write_status 是 ok,重启后数据条数和写入量一致。
提醒一点。appendfsync always 会把每次写都刷盘,QPS 会掉一个数量级;对不能丢的数据应该让业务侧做持久化兜底。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
