redis持久化与备份

RDB 与 AOF

  • RDB 持久化:可以在 redis.conf 中配置 save 规则,在指定的时间间隔内生成数据集的时间点快照,比如:
#.格式 save <seconds> <changes>, 指定在m秒内,有n次更新操作,就将数据同步到数据文件,可以多个条件配合
save 900 1
save 300 10
save 60 10000
  • AOF 持久化:通过记录所有写操作命令来实现备份(新的操作会被追加到appendonly.aof的末尾),重启时重放命令恢复数据。它的数据安全性更高,最多可能丢失一秒的数据,但文件体积大,恢复速度慢
对比项 RDB AOF
备份类型 快照备份(全量备份) 日志备份(增量备份)
工作流程 1.fork子进程,父子进程共享相同的内存数据
2.子进程将当前内存数据以快照格式写入一个临时rdb文件
3.子进程写入完成后,用新rdb文件原子替换并删除旧文件
1.fork子进程基于当前内存数据构建写入临时新aof文件
2.重写期间,父进程继续追加到旧文件并累积到内存重写缓冲区
3.写入完成后,父进程将重写缓冲区的增量追加到新aof文件末尾
4.用新aof文件原子替换旧文件,后续命令直接追加到新文件
示例配置 save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes     #.启用rdb压缩
rdbchecksum yes
dbfilename dump.rdb     #.定义rdb文件名
dir ./dump     #.定义rdb目录
appendonly yes     #.开启aof持久化
appendfilename "appendonly.aof"
appendfsync everysec     #.每秒fsync一次
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes     #.开启混合持久化
优点 文件体积小、恢复速度快
在恢复大数据集时,RDB的速度比AOF的恢复速度要快
AOF文件是一个只进行追加操作的日志文件
即便主机故障,最多丢失一秒钟的数据
缺点 服务器故障可能会丢失数据 安全,但文件体积大,恢复速度慢
适用场景 非常适用于灾难恢复 追求更高安全
  • RDB 手动备份:在 redis-cli 中执行 save(阻塞主进程,不推荐)或 bgsave(后台异步执行,推荐)
redis-cli -h 127.0.0.1 -p 7100 -a password bgsave
  • AOF 瘦身重建:默认的 AOF 策略会不断的追加日志,执行 BGREWRITEAOF 会将内存中的数据转换为最精简的写入命令,重新生成一个新的 AOF 文件,从而丢弃掉之前记录的所有冗余操作(比如多次 INCR、中间被删除的 SET 等)

注:假设对一个 key 做了 SET num 1 -> INCR num -> INCR num(最终值是3),旧的 AOF 文件会记录 3 条命令,执行 BGREWRITEAOF 后,新 AOF 文件只会记录 1 条命令:SET num 3

redis-cli -h 127.0.0.1 -p 7100 -a password bgrewriteaof
  • 一般来说,如果想达到足以媲美 PostgreSQL 的数据安全性,可以采用 RDB + AOF 双开 + 混合持久化 的模式。在这种情况下,当 Redis 重启时,会优先使用 AOF 文件恢复数据,因为 AOF 文件保存的数据集更完整
如果只配置AOF,重启时加载AOF文件恢复数据
如果只配置RBD,重启时加载dump文件恢复数据
如果同时配置RBD和AOF,重启时只加载AOF文件恢复数据
  • aof-use-rdb-preamble 是 Redis 4.0 引入的配置项(Redis 7.0+ 默认启用),其核心作用是在 AOF 文件开头写入 RDB 格式的完整数据快照,随后再追加增量的 AOF 日志操作。这样可以实现混合持久化,结合 RDB 和 AOF 的优势,重启加载速度大幅提升,AOF 重写生成的文件更小(RDB 二进制压缩存储,远比同等数据量的文本 AOF 体积小)
  • 当触发 AOF 重写(BGREWRITEAOF)时,AOF 文件开头写入 RDB 快照,随后追加重写期间的 AOF 增量命令,最终生成的 aof 文件结构:[RDB二进制快照] + [AOF增量命令文本]。Redis 启动时先加载 RDB 快照,再执行增量 AOF 命令,实现快速恢复。
  • Redis 出于性能考虑,禁止了 BGSAVE 和 BGREWRITEAOF 同时运行
  • 如何在线调整持久化方式(记得同步修改 redis.conf):
#.开启 AOF
redis-cli> CONFIG SET appendonly yes
redis-cli> CONFIG GET appendonly

#.开启 混合持久化
redis-cli> CONFIG SET aof-use-rdb-preamble yes
redis-cli> CONFIG GET aof-use-rdb-preamble

#.关闭 RDB
redis-cli> CONFIG SET save ""
redis-cli> CONFIG GET save

#.执行一次 rdb 异步持久化
redis-cli> bgsave

#.执行一次 aof 持久化
redis-cli> bgrewriteaof

Redis 备份最佳实践

  • 第1步,配置本地持久化,采用 RDB + AOF 双开 + 混合持久化 的模式
dir /data/redis_7100/dump          #.定义备份目录
dbfilename dump.rdb                #.定义rdb文件名
appendonly yes                     #.开启aof持久化
appendfilename "appendonly.aof"    #.定义aof文件名
appendfsync everysec               #.每秒fsync一次
aof-use-rdb-preamble yes           #.开启混合持久化
  • 第2步,配置定时任务(建议每小时1次)定期冷备与异地容灾,规避物理风险,脚本示例:

注:可以进一步配置分层保留,比如保留最近48小时的每小时备份、最近30天的每日备份,支持按需回滚到特定时间

# 1.手动触发BGSAVE
redis-cli -a password -c -p 7100 bgsave

# 2.将dump.rdb复制到其他目录
cp /data/redis_7100/dump/dump.rdb /data/redis_7100/history/dump_$(date +%Y%m%d_%H%M).rdb

# 3.清理7天前的备份文件
find /data/redis_7100/history/ -type f -name "dump_*.rdb" -mtime +7 -delete

# 4.同步到云端对象存储
ossutil cp /data/redis_7100/history/dump_*.rdb oss://your-bucket/redis-backups/
Copyright © www.sqlfans.cn 2021 - 2026 All Right Reserved更新时间: 2026-08-04 09:30:25

results matching ""

    No results matching ""