《Redis 容灾与备份恢复:RDB/AOF 备份、复制与演练》

对比 RDB/AOF/混合持久化三种备份方式、手动与自动备份策略、多级复制与主动-主动等异地容灾架构、故障演练流程、完整恢复步骤以及备份一致性检查方法。

一、备份方式对比

1.1 三种持久化能力

Redis 提供了 RDB、AOF、混合(RDB+AOF)三种持久化方式,它们决定宕机后数据能找回多少:

方式机制数据丢失窗口恢复速度文件体积
RDB定时快照上次快照至今快小
AOF追加命令日志上次 fsync 至今慢大
混合AOF 头用 RDB + 增量 AOF极小较快中
# 查看当前持久化配置
redis-cli config get save
# 1) "save"
# 2) "3600 1 300 100 60 10000"

redis-cli config get appendonly
# 1) "appendonly"
# 2) "yes"

1.2 容灾的本质

容灾不只是「备份数据」,而是在数据不丢的前提下让服务尽快恢复。备份解决「数据找回」,复制/集群解决「服务可用」,两者组合才是完整容灾。

1.3 备份粒度

备份对象粒度典型做法
RDB 文件全量快照定时 BGSAVE
AOF 文件增量日志持续追加
从节点冗余副本只读从库
异地副本跨机房冗余多级复制

二、RDB 备份

2.1 RDB 是什么

RDB 是二进制快照,把某个时刻的全部数据序列化到文件。由 save 策略触发,或手动 BGSAVE:

# 手动生成快照(fork 子进程,不阻塞主线程)
BGSAVE
# Background saving started
redis-cli info persistence
# rdb_last_bgsave_status:ok

2.2 RDB 触发策略

# 触发条件:300 秒内 ≥1 次写,或 60 秒内 ≥10000 次写
save 3600 1
save 300 100
save 60 10000

# 关闭 RDB
save ""
# 手动阻塞式快照(不推荐,会阻塞主线程)
SAVE

2.3 RDB 的优缺点

优点缺点
文件小,恢复快数据丢失窗口大(上次快照至今)
子进程生成,不阻塞fork 大内存实例耗时且耗内存
适合定期归档不满足高实时恢复

RDB 是「周期性保险」:适合数据丢失容忍度在小时级的场景。绝不能把 RDB 当唯一备份,快照间隔内的写操作在宕机后会全部丢失。

三、AOF 备份

3.1 AOF 是什么

AOF(Append Only File)把每条写命令追加到文件,重启时重放恢复。它记录了每一次修改,数据丢失窗口只取决于 fsync 策略:

# 三种 fsync 策略
appendfsync always      # 每条命令都 fsync,最安全但慢
appendfsync everysec    # 每秒 fsync,默认,最多丢 1 秒
appendfsync no          # 交给操作系统,最多丢数秒
redis-cli config get appendfsync   # everysec

3.2 AOF 重写

AOF 随写入无限增长,需要用 BGREWRITEAOF 重写压缩(合并冗余命令、删除过期键):

BGREWRITEAOF
# Background append only file rewriting started

# 自动重写条件(增长 100% 且 ≥64MB 触发)
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# 重写原理:读内存数据 → 生成最短命令集 → 替换旧 AOF,期间新写入追加合并

3.3 AOF 的优缺点

优点缺点
数据丢失窗口极小(默认 ≤1s)文件大,恢复慢
可读(文本命令)恢复要重放全部命令
适合高实时恢复高写入下性能开销

AOF 是「实时保险」:everysec 是默认平衡点,最多丢 1 秒数据。金融、库存等场景可上 always,但要接受写性能下降。

四、混合持久化

4.1 混合 AOF

Redis 4.0+ 支持混合持久化:AOF 重写后,文件头部是 RDB 快照,后续追加增量 AOF 命令。恢复时先加载 RDB(快)再重放少量命令(省):

aof-use-rdb-preamble yes   # 开启混合持久化(默认开启)
# 文件结构: | RDB 快照数据 | 增量 AOF 命令 |...|
# 恢复 = 加载 RDB + 重放 AOF 增量

4.2 三种方式选型

场景推荐原因
缓存可重建仅 RDB 或关闭持久化恢复快、开销小
通用生产混合 AOF丢数据少、恢复较快
强一致数据AOF always丢数据接近零
大数据量混合 + 从节点主从配合

4.3 配置推荐

appendonly yes
appendfsync everysec
aof-use-rdb-preamble yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

混合持久化是当前生产主流:RDB 的恢复速度 + AOF 的实时性,两者兼得。开启后 AOF 文件虽大,但重写后头部即 RDB,启动加载大幅加快。

五、手动备份与自动备份策略

5.1 手动备份流程

# 1. 触发快照
redis-cli bgsave

# 2. 找到 RDB 位置并复制到带时间戳的备份目录
redis-cli config get dir        # 通常 /var/lib/redis
cp /var/lib/redis/dump.rdb /backup/redis/dump.rdb.$(date +%F)

# 3. 将备份同步到异地存储
rsync -av /backup/redis/ backup-server:/backup/redis/

5.2 自动备份脚本

#!/bin/bash
REDIS_CLI="redis-cli -h 127.0.0.1 -p 6379"
BACKUP_DIR="/backup/redis"
$REDIS_CLI bgsave
sleep 2
cp /var/lib/redis/dump.rdb "$BACKUP_DIR/dump.rdb.$(date +%Y%m%d%H%M)"
find "$BACKUP_DIR" -name "dump.rdb.*" -mtime +30 -delete   # 保留 30 天
# crontab 每小时执行
0 * * * * /usr/local/bin/redis_backup.sh >> /var/log/redis_backup.log 2>&1

5.3 备份策略要点

要点说明
频率RDB 至少每小时,AOF 每 1 秒 fsync
保留策略按时间多版本,至少保留 30 天
异地同步备份文件必须离源机房
定期验证备份能恢复才叫备份
备份 AOF与 RDB 分开,防止单点

备份三原则:离源存储、多版本保留、定期恢复演练。只备份不验证,等于没有备份——恢复时才发现文件损坏是最惨的容灾事故。

六、异地容灾架构

6.1 多级复制

通过级联复制把数据扩展到异地机房,形成「主-从-异地从」的多级结构:

# 机房 A(主)→ 机房 A(从)→ 机房 B(从)
# 异地从节点承担跨机房读取,同时作为容灾副本
replicaof 10.0.0.1 6379

6.2 主动-被动与主动-主动

架构写能力数据一致性复杂度
主动-被动仅主机房主从异步复制低
主动-主动多机房可写需冲突处理高
# 主动-被动:主写异地从只读,主故障后人工/哨兵提升异地从
# 主动-主动:多机房各自主从,通过 CRDT 或业务幂等解决冲突

6.3 容灾层级设计

容灾级别手段RTORPO
单机RDB/AOF分钟级秒级
同城主从 + 哨兵秒级秒级
异地多级复制分钟级分钟级
双活主动-主动秒级秒级

容灾设计先定 RTO(恢复时间目标)与 RPO(数据丢失容忍),再选架构。异地容灾的成本很高,只有核心业务值得跨机房冗余,一般业务同城主从 + 异地 RDB 备份即可。

七、故障演练流程

7.1 演练目标

故障演练验证的不是「备份存在」,而是「恢复链路可用」:

# 演练项
# 1. 单节点宕机 → 从节点晋升 / 哨兵切换
# 2. 整机房宕机 → 异地备份恢复
# 3. 备份文件损坏 → 校验与降级方案
# 4. 数据误删 → AOF/RDB 时间点恢复

7.2 演练步骤模板

# 1. 计划:定场景、时间窗口、回滚方案
# 2. 演练:真实故障注入(kill 进程、断网、删数据)
# 3. 记录:记录实际 RTO/RPO 与操作步骤
# 4. 复盘:对比目标,修复问题
# 5. 回归:修复后再演练确认

7.3 演练常用命令

# 模拟宕机
redis-cli shutdown nosave
# 模拟数据损坏:清空后用备份恢复
redis-cli flushall
# 模拟进程被杀后自动拉起
systemctl stop redis-server
systemctl start redis-server

演练要点:使用备份文件恢复必须走「完整流程」,包括拷贝、校验、加载、验证数据量一致。脚本化的演练才能发现步骤遗漏,人工演练容易「手顺而漏关键步」。

八、恢复步骤

8.1 RDB 恢复

# 1. 停服并备份当前(可能损坏的)文件
systemctl stop redis-server
mv /var/lib/redis/dump.rdb /var/lib/redis/dump.rdb.bak

# 2. 拷贝备份文件到数据目录并修权限
cp /backup/redis/dump.rdb.20260930 /var/lib/redis/dump.rdb
chown redis:redis /var/lib/redis/dump.rdb

# 3. 启动并验证
systemctl start redis-server
redis-cli dbsize

8.2 AOF 恢复

# AOF 恢复同理:拷贝到 appenddirname 目录
cp /backup/redis/appendonly.aof /var/lib/redis/appendonly.aof
# 尾部损坏时先修复
redis-check-aof --fix appendonly.aof

8.3 恢复后的检查

检查项方法
总 key 数量dbsize 对比备份记录
关键业务 key抽样 GET 对比
数据时效检查是否恢复到预期时间点
复制状态info replication 确认主从
写入验证恢复后写测试 key 再删除

恢复不是「启动成功」就结束:必须对比 key 数量与抽样数据,确认恢复到预期时间点。对一致性要求高的业务,恢复后应做数据完整性核对脚本。

九、备份一致性检查

9.1 备份校验

# RDB 文件完整性检查
redis-check-rdb /backup/redis/dump.rdb.20260930
# [offset ...] \o/ RDB looks OK!

# AOF 文件完整性检查
redis-check-aof /backup/redis/appendonly.aof

9.2 与源数据一致性对比

# 方法:dbsize 对比数量级、抽样对比 value、debug digest 全库摘要(慎用)
redis-cli debug digest
检查方式力度成本
redis-check-rdb文件完整性低
dbsize 对比数量级低
抽样 value 对比抽样中
debug digest全库高,阻塞慎用

9.3 持续监控

# 备份任务本身要监控:失败告警、检查文件大小与生成时间
# 每月做一次「备份恢复演练」并记录结果

一致性检查的终极手段是周期性恢复演练:在隔离环境加载备份、对比数据、验证可服务。演练通过,备份才算「有效备份」。

结语

  1. RDB/AOF/混合三种持久化各有取舍:RDB 快恢复大窗口,AOF 小窗口慢恢复,混合两者兼得,是生产主流。
  2. RDB 由 save 策略触发 BGSAVE,适合周期归档;快照间隔内的写操作宕机后会丢失。
  3. AOF 用 appendfsync 控制丢失窗口,everysec 默认最多丢 1 秒,强一致场景可上 always。
  4. AOF 需要 BGREWRITEAOF 重写控制体积,混合持久化重写后头部即 RDB,启动加载更快。
  5. 备份策略遵循「离源存储、多版本保留、定期恢复演练」三原则,配合 crontab 自动化。
  6. 异地容灾按 RTO/RPO 选架构:同城主从哨兵、异地主从复制或主动-主动双活。
  7. 故障演练要脚本化、走完整恢复流程,记录实际 RTO/RPO 并持续复盘修复。
  8. 恢复步骤「停服→换文件→启动→验证」五步走,用 redis-check-rdb/aof 校验与抽样对比保证一致性。

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「redis」更多文章

  1. 《Redis 对象编码与内存优化:listpack 与编码转型》
  2. 《Redis 管道、事务与批量优化:从 N 次 RTT 到一次》
  3. 《Redis 客户端缓存与 RESP3:降低往返延迟》