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/