备份与恢复概述
Redis 数据备份与恢复是保障数据安全的重要手段。Redis 提供了两种主要的持久化方式:RDB 快照和 AOF 日志,以及多种备份策略来确保数据的可靠性和可恢复性。
📸 RDB 快照备份
RDB(Redis Database)是 Redis 的默认持久化方式,通过创建数据快照来备份数据:
# 手动创建快照
SAVE
# 或者异步创建快照(推荐)
BGSAVE
# 查看最后一次快照时间
LASTSAVE
# 配置自动快照
# 在 redis.conf 中设置
save 900 1 # 900秒内至少1个key发生变化
save 300 10 # 300秒内至少10个key发生变化
save 60 10000 # 60秒内至少10000个key发生变化
# 运行时配置
CONFIG SET save "900 1 300 10 60 10000"
RDB 特点:
- 紧凑性:文件小,适合备份和传输
- 恢复快:启动时恢复速度快
- 性能好:对 Redis 性能影响小
- 数据丢失:可能丢失最后一次快照后的数据
📝 AOF 日志备份
AOF(Append Only File)通过记录每个写操作来实现持久化:
# 启用 AOF
CONFIG SET appendonly yes
# 设置 AOF 文件名
CONFIG SET appendfilename "appendonly.aof"
# 设置同步策略
CONFIG SET appendfsync everysec # 每秒同步(推荐)
# CONFIG SET appendfsync always # 每次写入同步(最安全但慢)
# CONFIG SET appendfsync no # 由操作系统决定(最快但不安全)
# 手动重写 AOF 文件
BGREWRITEAOF
# 配置自动重写
CONFIG SET auto-aof-rewrite-percentage 100
CONFIG SET auto-aof-rewrite-min-size 64mb
同步策略 | 安全性 | 性能 | 数据丢失风险 |
---|---|---|---|
always | 最高 | 最慢 | 几乎无 |
everysec | 较高 | 较快 | 最多1秒 |
no | 最低 | 最快 | 可能较多 |
🔄 混合持久化
Redis 4.0 引入了 RDB-AOF 混合持久化,结合两者优势:
# 启用混合持久化
CONFIG SET aof-use-rdb-preamble yes
# 查看配置
CONFIG GET aof-use-rdb-preamble
混合持久化优势:
- AOF 文件开头是 RDB 格式,恢复速度快
- AOF 文件后续是增量命令,数据完整性好
- 文件大小相对较小
- 兼顾了性能和数据安全
📋 备份策略
制定合适的备份策略确保数据安全:
#!/bin/bash
# Redis 备份脚本示例
# 设置变量
REDIS_CLI="redis-cli"
BACKUP_DIR="/backup/redis"
DATE=$(date +%Y%m%d_%H%M%S)
# 创建备份目录
mkdir -p $BACKUP_DIR
# 执行 RDB 备份
$REDIS_CLI BGSAVE
# 等待备份完成
while [ $($REDIS_CLI LASTSAVE) -eq $($REDIS_CLI LASTSAVE) ]; do
sleep 1
done
# 复制 RDB 文件
cp /var/lib/redis/dump.rdb $BACKUP_DIR/dump_$DATE.rdb
# 复制 AOF 文件(如果启用)
if [ -f /var/lib/redis/appendonly.aof ]; then
cp /var/lib/redis/appendonly.aof $BACKUP_DIR/appendonly_$DATE.aof
fi
# 压缩备份文件
tar -czf $BACKUP_DIR/redis_backup_$DATE.tar.gz $BACKUP_DIR/*_$DATE.*
# 删除7天前的备份
find $BACKUP_DIR -name "redis_backup_*.tar.gz" -mtime +7 -delete
🔧 数据恢复
从备份文件恢复 Redis 数据:
# 1. 停止 Redis 服务
sudo systemctl stop redis
# 2. 备份当前数据文件(可选)
cp /var/lib/redis/dump.rdb /var/lib/redis/dump.rdb.backup
# 3. 恢复 RDB 文件
cp /backup/redis/dump_20231201_120000.rdb /var/lib/redis/dump.rdb
# 4. 恢复 AOF 文件(如果使用)
cp /backup/redis/appendonly_20231201_120000.aof /var/lib/redis/appendonly.aof
# 5. 设置正确的文件权限
chown redis:redis /var/lib/redis/dump.rdb
chown redis:redis /var/lib/redis/appendonly.aof
# 6. 启动 Redis 服务
sudo systemctl start redis
# 7. 验证数据恢复
redis-cli
127.0.0.1:6379> KEYS *
127.0.0.1:6379> INFO keyspace
注意: 恢复数据前请确保 Redis 服务已停止,并备份当前数据以防意外。
🚨 灾难恢复
应对严重故障的恢复策略:
灾难恢复步骤:
- 评估损失:确定数据丢失程度
- 选择备份:选择最近的可用备份
- 环境准备:准备恢复环境
- 数据恢复:执行数据恢复操作
- 验证测试:验证数据完整性
- 服务恢复:恢复业务服务
# 灾难恢复脚本示例
#!/bin/bash
echo "开始 Redis 灾难恢复..."
# 1. 停止相关服务
sudo systemctl stop redis
sudo systemctl stop application
# 2. 清理损坏的数据
rm -f /var/lib/redis/dump.rdb
rm -f /var/lib/redis/appendonly.aof
# 3. 从最新备份恢复
latest_backup=$(ls -t /backup/redis/redis_backup_*.tar.gz | head -1)
tar -xzf $latest_backup -C /tmp/
# 4. 恢复数据文件
cp /tmp/backup/redis/dump_*.rdb /var/lib/redis/dump.rdb
cp /tmp/backup/redis/appendonly_*.aof /var/lib/redis/appendonly.aof
# 5. 设置权限
chown redis:redis /var/lib/redis/*
# 6. 启动服务
sudo systemctl start redis
sudo systemctl start application
echo "灾难恢复完成"
📊 备份监控
监控备份状态和数据完整性:
# 检查备份状态
redis-cli INFO persistence
# 检查 RDB 文件
redis-cli LASTSAVE
redis-cli CONFIG GET save
# 检查 AOF 状态
redis-cli CONFIG GET appendonly
redis-cli CONFIG GET appendfsync
# 验证数据完整性
redis-cli --rdb /tmp/dump.rdb
redis-cli --check-rdb /var/lib/redis/dump.rdb
redis-cli --check-aof /var/lib/redis/appendonly.aof
监控项 | 命令 | 说明 |
---|---|---|
最后备份时间 | LASTSAVE | 返回最后一次成功备份的时间戳 |
备份配置 | CONFIG GET save | 查看自动备份配置 |
AOF 状态 | INFO persistence | 查看 AOF 相关状态 |
文件检查 | --check-rdb/aof | 检查备份文件完整性 |
💡 最佳实践
Redis 备份与恢复的最佳实践:
备份最佳实践:
- 同时启用 RDB 和 AOF,使用混合持久化
- 定期测试备份文件的完整性
- 将备份文件存储到不同的物理位置
- 建立自动化备份和监控机制
- 制定详细的恢复流程文档
- 定期进行恢复演练
重要提醒: 备份策略应该根据业务需求制定,平衡数据安全性和系统性能。