Redis 开启 AOF 的一个注意点
事故背景
今天生产环境的应用程序突然出现异常。经排查发现,运维同事按照要求对 Redis 的持久化策略进行了调整,开启了 AOF(AppendOnlyFile)模式。在开启过程中由于操作不当,导致 Redis 数据丢失。
事故过程
- 运维同事修改 Redis 配置文件,开启 AOF 模式
- 重启 Redis 服务器使配置生效
- 应用程序无法正常访问数据,发现 Redis 中的数据已经丢失
技术分析
Redis 持久化数据的两种模式
一、RDB 模式(默认)
- Redis 默认启用的持久化模式
- 按配置定期进行全量快照备份,生成 dump.rdb 文件
save 900 1 #900 秒内至少 1 个 key 被更新就全量备份 RDB save 300 10 #300 秒内至少 10 个 key 被更新就全量备份 RDB save 60 10000 #60 秒内至少 10000 个 key 被更新就全量备份 RDB
- 原理:Redis fork 子进程进行 RDB 快照备份
- 局限性:
- 两次备份间隔期的数据可能丢失
- 备份时会占用双倍内存空间
二、AOF 模式
- AppendOnlyFile 模式,增量备份方式,默认未开启
- 类似数据库 binlog,记录所有写操作命令
appendonly yes #开启 AOF appendfilename "appendonly.aof" #设置备份文件名 appendfsync everysec #每秒同步一次
- 工作原理:Redis 进程实时记录写操作日志
- 特点:以追加方式记录操作,保证数据安全性
持久化模式优先级
- AOF 优先级高于 RDB
- 两种模式相互独立,不会交互
事故原因分析
-
开启 AOF 后重启 Redis 的影响:
- Redis 重启时优先加载 AOF 文件
- 新启用的 AOF 文件为空
- Redis 内存数据被清空
- RDB 触发条件满足后,空数据被写入 RDB 文件
- 原有 RDB 备份文件被覆盖
-
数据丢失原因:
- AOF 文件为空导致内存数据清空
- 空数据覆盖了原有的 RDB 备份
- 最终导致历史数据无法恢复
正确的 AOF 启用方法
在线修改 AOF 配置
-
登录 Redis 客户端
# 查看 AOF 状态 127.0.0.1:6379> config get appendonly 1) "appendonly" 2) "no" # 在线开启 AOF 127.0.0.1:6379> config set appendonly yes OK 执行
config set appendonly yes
命令后,Redis 会立即开始记录写操作日志,并生成新的 AOF 文件。 -
确认数据完整性
# 验证数据 127.0.0.1:6379> keys * 1) "name" 2) "gender" 3) "age" -
确认备份文件
# 查看备份文件 127.0.0.1:6379> config get dir 1) "dir" 2) "/data/redis" 127.0.0.1:6379> exit ls /data/redis appendonly.aof dump.rdb ... -
修改 Redis 配置文件
因为 Redis 配置文件中默认没有开启 AOF 模式,所以手动开启,以后 Redis 重启时,会自动加载 AOF 文件。
# 修改配置文件 appendonly yes
事故恢复措施
通过每日 RDB 备份文件恢复了大部分数据,但备份时间点到事故发生期间的增量数据已无法恢复。
经验教训
- Redis 配置变更须谨慎,特别是持久化相关配置
- 建议使用在线修改命令而非重启服务
- 重要配置变更前需要进行完整的备份
- 建议在测试环境充分验证后再在生产环境实施
后续改进建议
- 完善 Redis 运维操作规范
- 建立配置变更审核机制
- 优化备份策略,缩短备份间隔
- 加强运维人员技术培训
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
2022-02-09 ⌊lgN⌋=(N 的二进制表示的位数)-1