Redis 持久化
Redis 持久化主要有 RDB 和 AOF 两种方式。生产环境是否开启持久化,取决于 Redis 承载的数据能否丢失、恢复时间要求和磁盘性能。
RDB
RDB 是某一时间点的数据快照,文件通常为 dump.rdb。
dir /data/redis/6379/data
dbfilename dump.rdb
save 900 1
save 300 10
save 60 10000
优点:
- 文件紧凑,适合备份和全量恢复。
- 恢复速度较快。
- 对主线程影响较小,快照由子进程完成。
风险:
- 两次快照之间的数据可能丢失。
- fork 子进程时需要额外内存,内存压力大时可能失败。
AOF
AOF 记录写命令日志,恢复时通过重放命令还原数据。
appendonly yes
appenddirname appendonlydir
appendfsync everysec
aof-use-rdb-preamble yes
appendfsync 常见取值:
| 取值 | 说明 |
|---|---|
always | 每次写入都刷盘,可靠性高但性能差 |
everysec | 每秒刷盘,通常最多丢失 1 秒数据 |
no | 交给操作系统刷盘,性能好但风险更高 |
生产环境常用 everysec。
混合持久化
Redis 4+ 支持 AOF 重写时使用 RDB 前缀:
aof-use-rdb-preamble yes
这种方式兼顾恢复速度和 AOF 的增量日志能力,生产环境建议开启。
手动持久化命令
BGSAVE
BGREWRITEAOF
LASTSAVE
INFO persistence
不要在生产高峰期随意执行 SAVE,它会阻塞 Redis 主线程。
备份策略
推荐备份 RDB 快照,并保留 AOF 目录用于更细粒度恢复。
BACKUP_DIR=/data/redis/6379/backup/$(date +%F-%H%M%S)
mkdir -p "$BACKUP_DIR"
cp -a /data/redis/6379/data/dump.rdb "$BACKUP_DIR"/
cp -a /data/redis/6379/data/appendonlydir "$BACKUP_DIR"/
备份注意事项:
- 备份前检查
INFO persistence,确认最近一次bgsave或 AOF rewrite 状态正常。 - 备份文件要放到独立磁盘或远端存储。
- 定期做恢复演练,不只验证备份文件存在。
恢复流程
- 停止 Redis。
- 备份当前异常数据目录。
- 将目标
dump.rdb和 AOF 文件复制到dir指定目录。 - 确认文件属主为
redis用户。 - 启动 Redis 并查看日志。
- 使用
DBSIZE、抽样 key 和业务检查验证数据。
systemctl stop redis-6379
mv /data/redis/6379/data /data/redis/6379/data.bak.$(date +%F-%H%M%S)
mkdir -p /data/redis/6379/data
cp -a /backup/redis/6379/dump.rdb /data/redis/6379/data/
chown -R redis:redis /data/redis/6379/data
systemctl start redis-6379
journalctl -u redis-6379 -n 100
常见异常
| 现象 | 排查方向 |
|---|---|
MISCONF 写入失败 | 检查 stop-writes-on-bgsave-error、磁盘空间、RDB 失败原因 |
| AOF 文件过大 | 检查 AOF rewrite 是否执行、磁盘 IO 是否正常 |
| 启动恢复慢 | 检查数据量、AOF 大小、是否开启混合持久化 |
fork 失败 | 检查内存、overcommit、透明大页和系统日志 |
关键命令:
INFO persistence
INFO memory
CONFIG GET dir
CONFIG GET appendonly
CONFIG GET appenddirname