Redis 进阶 02:RDB、AOF 与备份恢复

实验基线:Redis 7.4.11,先完成环境准备。除标注为宿主机终端的代码外,Redis 命令在该课指定的 redis-cli 中执行;不复制输出结果作为命令。

学习目标#

理解 RDB 与 AOF 的恢复来源、丢失窗口和磁盘开销,用独立容器验证一次持久化恢复。

原理:持久化不等于备份#

RDB 保存某时刻的数据快照,恢复快且文件紧凑,但快照之后的写入可能丢失。AOF 记录写命令,配合重写控制文件增长。appendfsync everysec 通常每秒刷盘,仍存在约一秒级的数据丢失窗口,也受系统和故障情况影响,不是绝对承诺。

同时启用两者时 Redis 优先使用 AOF 恢复,因为它通常更完整。Redis 7 使用多文件 AOF 及 manifest,不要只拷贝一个历史 appendonly.aof 文件。复制也不是备份:误删通常会传播到副本。

实验:在宿主机创建隔离存储#

下面的卷只供本课使用。如同名卷已有重要内容,改名后同步替换所有命令,不要复用未知卷:

docker volume create redis-learning-data
docker run -d --name redis-persistence -v redis-learning-data:/data redis:7.4.11 redis-server --appendonly yes --appendfsync everysec --save ""
docker exec -it redis-persistence redis-cli

在此容器的 redis-cli 中执行:

SET learn:persistence:order:1 paid
BGSAVE
INFO persistence

SET 预期 OK。BGSAVE 开始后台生成 dump.rdb,立即读取 INFO 时 rdb_bgsave_in_progress 可能为 1;再次读取直到变成 0,且 rdb_last_bgsave_status 为 ok。AOF 相关状态也应该没有写入错误。

实验:重建容器并恢复#

QUIT 退出,然后在宿主机执行:

docker stop redis-persistence
docker rm redis-persistence
docker run -d --name redis-persistence -v redis-learning-data:/data redis:7.4.11 redis-server --appendonly yes --appendfsync everysec --save ""
docker exec redis-persistence redis-cli GET learn:persistence:order:1

预期输出 paid。正常停止会执行安全关闭,这个实验验证“卷保留后重建能恢复”,不验证突然断电的数据丢失上限。故障演练应在隔离环境进行,并先确定可接受损失。

备份与恢复流程#

  1. 确认后台保存完成,使用受控快照或停机窗口获取一致的备份文件。
  2. RDB 备份保留 dump.rdb;多文件 AOF 要保留整个 appendonlydir 和 manifest,避免在重写中复制一半。
  3. 将备份复制到不同故障域,记录版本、时间、校验值与访问权限。
  4. 在另一隔离实例恢复,检查业务样本、数量和关键 TTL,再确认恢复耗时。
  5. 同时定义 RPO(允许丢多少)与 RTO(允许停多久),定期恢复演练。

只验证备份文件存在,不等于验证备份可用。选择仅 RDB 恢复时要明确禁用 AOF 并使用正确目录;不要混放无关旧 AOF 后期待 RDB 覆盖它。

常见错误#

  • 以为挂载目录就自动开启 AOF:需检查配置与 INFO persistence。
  • 备份整个运行中 AOF 目录时忽略重写:可能得到不一致文件集。
  • 内存刚够用就触发 BGSAVE:fork 与写时复制可能增加内存峰值。
  • 开启持久化但磁盘已满:监控写入状态,不能隐藏错误。

练习与参考答案#

清理实验键并重启,确认删除也被保存:

docker exec redis-persistence redis-cli UNLINK learn:persistence:order:1
docker restart redis-persistence
docker exec redis-persistence redis-cli GET learn:persistence:order:1

预期最后为空输出(非交互模式的 nil),说明持久化会忠实保存删除,不能防止误操作。

清理#

仅删除本课创建的容器和卷:

docker stop redis-persistence
docker rm redis-persistence
docker volume rm redis-learning-data

官方参考#

持久化 · BGSAVE · Redis 7 AOF

学习导航#

上一课:Redis 进阶 01:内存、过期与淘汰 · 学习目录 · 下一课:Redis 进阶 03:Pipeline、事务与 Lua

Redis 进阶 02:RDB、AOF 与备份恢复
作者:LcooYa
CC BY-NC-SA 4.0
相关文章
随机文章