💾 Redis 数据备份与恢复

保障数据安全的核心技术

备份与恢复概述

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 服务已停止,并备份当前数据以防意外。

🚨 灾难恢复

应对严重故障的恢复策略:

灾难恢复步骤:

  1. 评估损失:确定数据丢失程度
  2. 选择备份:选择最近的可用备份
  3. 环境准备:准备恢复环境
  4. 数据恢复:执行数据恢复操作
  5. 验证测试:验证数据完整性
  6. 服务恢复:恢复业务服务
# 灾难恢复脚本示例 #!/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,使用混合持久化
  • 定期测试备份文件的完整性
  • 将备份文件存储到不同的物理位置
  • 建立自动化备份和监控机制
  • 制定详细的恢复流程文档
  • 定期进行恢复演练
重要提醒: 备份策略应该根据业务需求制定,平衡数据安全性和系统性能。