Redis 备份恢复实战
核心原则: 备份不等于恢复。有了备份文件不算完,必须定期演练恢复流程。
四层备份策略
| 层级 | 方案 | 目的 | 成本 |
|---|---|---|---|
| L1 | 自动持久化(RDB + AOF) | 防进程崩溃 | 最低 |
| L2 | 定时全量备份(RDB 文件) | 防误操作/灾难 | 低 |
| L3 | 增量备份(AOF 文件) | 时间点恢复 | 中 |
| L4 | 异地容灾(跨机房/S3) | 防本地灾难 | 高 |
推荐备份频率
| 容忍度 | RDB 快照 | AOF 策略 | 外部备份 |
|---|---|---|---|
| 1 小时 | 每小时 | everysec | 每天 |
| 15 分钟 | 每 15 分钟 | everysec | 每 6 小时 |
| 1 分钟 | 每 1 分钟 | everysec | 每 1 小时 |
| 1 秒 | 辅助 RDB | always | 每 30 分钟 |
备份脚本
RDB 备份(crontab 每天凌晨)
#!/bin/bash
# redis_rdb_backup.sh
BACKUP_DIR="/data/redis_backup"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/dump_${DATE}.rdb"
REDIS_DATA_DIR="/var/lib/redis"
MAX_BACKUPS=7
mkdir -p ${BACKUP_DIR}
redis-cli BGSAVE
sleep 2
# 等待 BGSAVE 完成
while [ $(redis-cli LASTSAVE) -eq $(redis-cli LASTSAVE) ]; do sleep 1; done
cp ${REDIS_DATA_DIR}/dump.rdb ${BACKUP_FILE}
# 清理旧备份
cd ${BACKUP_DIR} && ls -t dump_*.rdb | tail -n +$((MAX_BACKUPS+1)) | xargs -r rm -f
综合备份(RDB + AOF + S3)
# /etc/cron.d/redis_backup
0 3 * * * root /usr/local/bin/redis_backup.sh >> /var/log/redis_backup.log 2>&1
完整的综合备份脚本见原始文章:RDB 快照 → 复制 RDB → 复制 AOF → 生成备份信息 → 上传 S3 → 清理旧备份。
恢复操作流程
标准恢复(本地备份)
① 记录当前状态 → ② 停止 Redis → ③ 备份现有数据文件(防二次损失)
④ 复制备份文件 → ⑤ 设置权限 → ⑥ 启动 Redis → ⑦ 验证数据
# 1. 停止
systemctl stop redis
# 或 redis-cli SHUTDOWN NOSAVE
# 2. 备份现有数据(防二次损失)
mv /var/lib/redis/dump.rdb /var/lib/redis/dump.rdb.bak_$(date +%Y%m%d)
mv /var/lib/redis/appendonly.aof /var/lib/redis/appendonly.aof.bak_$(date +%Y%m%d)
# 3. 复制备份
cp /data/redis_backup/20240115/dump_20240115.rdb /var/lib/redis/dump.rdb
cp /data/redis_backup/20240115/appendonly_20240115.aof /var/lib/redis/appendonly.aof
# 4. 启动并验证
systemctl start redis
redis-cli PING
redis-cli DBSIZE
redis-cli INFO keyspace
AOF 修复
# AOF 文件损坏时
cp /var/lib/redis/appendonly.aof /var/lib/redis/appendonly.aof.bak
redis-check-aof --fix /var/lib/redis/appendonly.aof
从 RDB 恢复(AOF 禁用时)
停止 Redis → 注释 appendonly yes 或设为 no → 确保 RDB 存在 → 启动 → 确认数据 → 重新开启 AOF
主从架构下的备份
备份应在从库执行,不影响主库性能。
redis-cli -h <slave-ip> BGSAVE
# 等待 LASTSAVE 更新后
scp <slave-ip>:/var/lib/redis/dump.rdb /data/backup/dump_$(date +%Y%m%d).rdb
容灾方案
跨机房备份
tar czf /tmp/redis_backup_${DATE}.tar.gz ${SOURCE_DIR}
rsync -avz --bwlimit=5000 /tmp/redis_backup_${DATE}.tar.gz \
user@dr-site:/mnt/dr_backup/redis/
云对象存储(S3)
aws s3 cp /tmp/redis_${DATE}.tar.gz s3://my-redis-backups/
aws s3api put-object-lifecycle-configuration \
--bucket my-redis-backups \
--lifecycle-configuration '{"Rules":[{"ID":"expiry","Prefix":"redis_","Status":"Enabled","Expiration":{"Days":30}}]}'
关键提醒
- 主从不是备份 — 主从切换依然可能丢数据,复制不能替代备份。Redis 高可用方案参见 redis-ha-replication-sentinel
- 定期演练恢复 — 很多团队的备份文件实际上无法恢复
- 生产操作前先备份配置 — 修改 redis.conf 前先备份
- 监控持久化状态 —
rdb_last_bgsave_status、aof_last_write_status必须告警 - 安全配置 —
rename-command FLUSHALL ""、requirepass、protected-mode
关联页面
| 页面 | 关联点 |
|---|---|
| redis-persistence-strategy | Redis 持久化机制 RDB/AOF/混合模式(备份的数据基础) |
| redis-ha-replication-sentinel | Redis 高可用:主从复制/哨兵/脑裂/集群踩坑 |
| redis-memory-optimization | Redis 内存优化完全指南(fork/COW 对 BGSAVE 的影响) |