Redis版本回退实践,轻松回退数据,让每一次操作都安心无忧
AOF持久化+定时备份是最简单的回退实践:开启AOF(appendonly yes),设置auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb,然后用crontab定时cp重命名备份本地的AOF文件,回退时停止Redis,用旧AOF替换后重启即可快速回溯数据。结合RDB快照,每小时生成一次全量备份,回退粒度可到小时级,避免操作失误带来的数据丢失,让运维安心。
实践一:AOF日志回退
Redis的AOF是操作日志,回退时可以截断AOF文件到指定位置。比如用redis-check-aof --fix修复,然后手动编辑AOF删除错误命令,重启加载即可回滚到干净状态。我们线上就是这样处理的,某次误删key后,找到时间点前5分钟的AOF备份,diff对比后截取粘贴,3分钟搞定数据回溯。
实践二:RDB快照回退
配置save 900 1 save 300 10 save 60 10000,生成RDB快照。回退时停止服务,mv新RDB旧的,启动后数据回滚到最近快照点。缺点是丢失快照后操作,但结合AOF混合模式(hybrid),回退时先RDB快速加载,再AOF增量回放,完美。
实践三:主从延迟切换回退
线上用哨兵架构,误操作主库后,立即提升延迟几分钟的slave为主,新主接管流量,老主变slave清空重同步。实际案例:高峰期flushall后5秒内切换,数据回退损失最小,用户无感知,超级安心。
实践四:Lua脚本原子回退
用Lua脚本封装高危操作,如批量del前先scan备份到临时key,回退时restore即可。代码示例:local keys=redis.call('SCAN',0,'MATCH','prefix*'); for i,v in ipairs(keys[2]) do redis.call('SET','backup:'..v,redis.call('GET',v)) end,这样操作出错直接从backup恢复。
实践五:Docker容器回退
Redis跑在Docker,volume挂载数据目录,误操作后docker stop,git revert数据卷或从s3拉备份,docker start,新容器瞬间回退。结合watchtower自动更新但手动确认,版本回退超轻松。
实践六:集群槽回退
Redis Cluster中,误迁移槽后,用cluster slots查看,用cluster meet重新加入节点,reshard回滚槽位。实践经验:先在测试环境模拟flushdb,然后reshard -100恢复,数据完整无损。
FAQ
Q: AOF回退会丢失多少数据?
A: 取决于fsync策略,always最安全,每条命令立即落盘,回退几乎无丢失。
Q: RDB和AOF哪个回退快?
A: RDB快照加载秒级,但丢失尾部操作;AOF逐命令回放慢点但精确。
Q: 线上怎么防止误操作?
A: rename-command FLUSHALL ''禁用危险命令,加requirepass保护。
Q: 回退需要停机吗?
A: 主从切换无停机,单机回退需短暂停几秒。