1. Redis 持久化方式
RDB (Redis Database)
快照式持久化
-
在指定时间间隔内,将内存中的数据生成快照保存到磁盘
-
默认文件名:
dump.rdb
配置示例:
bash
# redis.conf
save 900 1 # 900秒内有1个key变化则保存
save 300 10 # 300秒内有10个key变化则保存
save 60 10000 # 60秒内有10000个key变化则保存
dir /var/lib/redis # RDB文件保存目录
dbfilename dump.rdb
优点:
-
性能好,适合备份和灾难恢复
-
恢复大数据集速度比AOF快
缺点:
-
可能丢失最后一次保存后的数据
-
数据集大时fork子进程可能耗时
AOF (Append Only File)
日志式持久化
- 记录所有写操作命令
配置示例:
bash
# redis.conf
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec # 同步频率:always/everysec/no
重写机制:
bash
# 自动重写配置
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
优点:
-
数据安全性更高
-
AOF文件易读
缺点:
-
文件体积通常比RDB大
-
恢复速度较慢
2. 备份策略
手动备份
bash
# 创建RDB备份
redis-cli SAVE # 同步保存,阻塞其他命令
redis-cli BGSAVE # 后台异步保存
# 创建AOF备份
# 只需复制当前的AOF文件即可
cp appendonly.aof /backup/appendonly-$(date +%Y%m%d).aof
自动化备份脚本
bash
#!/bin/bash
# backup_redis.sh
BACKUP_DIR="/backup/redis"
DATE=$(date +%Y%m%d_%H%M%S)
REDIS_CLI="/usr/bin/redis-cli"
# 创建备份目录
mkdir -p $BACKUP_DIR
# 执行BGSAVE
$REDIS_CLI BGSAVE
# 等待RDB文件生成
sleep 30
# 复制RDB文件
cp /var/lib/redis/dump.rdb $BACKUP_DIR/dump_$DATE.rdb
# 如果使用AOF,也备份AOF文件
if [ -f /var/lib/redis/appendonly.aof ]; then
cp /var/lib/redis/appendonly.aof $BACKUP_DIR/appendonly_$DATE.aof
fi
# 删除7天前的备份
find $BACKUP_DIR -name "*.rdb" -mtime +7 -delete
find $BACKUP_DIR -name "*.aof" -mtime +7 -delete
3. 还原/恢复操作
从RDB文件恢复
bash
# 1. 停止Redis服务
sudo systemctl stop redis
# 2. 备份当前数据文件
cp /var/lib/redis/dump.rdb /var/lib/redis/dump.rdb.bak
# 3. 复制备份文件到数据目录
cp /backup/dump_backup.rdb /var/lib/redis/dump.rdb
# 4. 修改文件权限
chown redis:redis /var/lib/redis/dump.rdb
# 5. 启动Redis服务
sudo systemctl start redis
从AOF文件恢复
bash
# 1. 停止Redis服务
sudo systemctl stop redis
# 2. 备份当前AOF文件
cp /var/lib/redis/appendonly.aof /var/lib/redis/appendonly.aof.bak
# 3. 复制备份文件
cp /backup/appendonly_backup.aof /var/lib/redis/appendonly.aof
# 4. 修改权限
chown redis:redis /var/lib/redis/appendonly.aof
# 5. 启动Redis(Redis会自动加载AOF并重放命令)
sudo systemctl start redis
数据迁移恢复
bash
# 将数据从一台Redis迁移到另一台
# 方法1:使用redis-cli
redis-cli -h source_host -p 6379 --rdb /tmp/dump.rdb
scp /tmp/dump.rdb user@dest_host:/tmp/
ssh user@dest_host "redis-cli -h localhost -p 6379 --pipe < /tmp/dump.rdb"
# 方法2:使用redis-dump工具
redis-dump -u source_host:6379 > data.json
redis-load -u dest_host:6379 < data.json
4. 最佳实践
混合持久化配置
bash
# redis.conf
# 同时启用RDB和AOF
save 900 1
save 300 10
save 60 10000
appendonly yes
appendfsync everysec
# AOF重写时使用RDB格式(Redis 4.0+)
aof-use-rdb-preamble yes
监控持久化状态
bash
# 查看持久化信息
redis-cli INFO persistence
# 查看最近一次保存状态
redis-cli INFO | grep -A5 "持久化"
# 检查AOF文件状态
redis-cli INFO persistence | grep aof
灾难恢复演练脚本
bash
#!/bin/bash
# disaster_recovery_test.sh
echo "=== Redis灾难恢复演练 ==="
# 1. 模拟数据丢失
echo "1. 清空测试数据库..."
redis-cli -n 15 FLUSHDB
# 2. 从备份恢复
echo "2. 从备份恢复数据..."
sudo systemctl stop redis
cp /backup/latest/dump.rdb /var/lib/redis/
sudo systemctl start redis
# 3. 验证数据
echo "3. 验证恢复结果..."
redis-cli DBSIZE
echo "恢复完成!"
5. 注意事项
-
备份前确保有足够磁盘空间
-
定期测试恢复流程
-
对于生产环境,建议:
-
RDB和AOF同时启用
-
备份文件存放到不同物理位置
-
使用监控工具监控持久化状态
-
-
大Key处理:
-
避免单个Key过大影响持久化性能
-
使用
redis-cli --bigkeys分析大Key
-
6. 常用命令总结
bash
# 持久化相关
BGSAVE # 后台保存RDB
LASTSAVE # 获取最后保存时间
BGREWRITEAOF # 重写AOF文件
# 备份相关
redis-cli --rdb <filename> # 导出RDB
redis-cli --pipe < <rdb-file> # 导入RDB
# 状态检查
redis-cli INFO persistence
redis-cli CONFIG GET dir
通过合理配置持久化策略和定期备份,可以确保Redis数据的安全性和可靠性。