温馨提示×

Redis在Linux上的备份策略

小樊
38
2025-12-14 12:49:42
栏目: 云计算

Redis在Linux上的备份策略

一 持久化基础与取舍

  • RDB:在指定时间间隔生成数据集的时间点快照,适合做冷备/快速恢复;但存在一定数据丢失窗口。触发方式包括配置策略、手动触发、或SHUTDOWN时自动生成。RDB文件默认名为dump.rdb,路径由配置指定。
  • AOF:记录每个写命令,启动时重放重建数据,数据安全性更高;三种同步策略:appendfsync everysec(推荐,最多丢约1秒)、always(最安全、性能低)、no(性能最高、风险最大)。
  • 混备建议:同时开启AOF+BGSAVE,以AOF保障近实时恢复,以RDB便于离线归档与迁移;AOF在Redis 4.0+支持RDB preamble以提升重写与加载效率。

二 备份策略与保留周期

  • RDB快照备份:通过BGSAVESAVE触发快照,脚本拷贝dump.rdb到备份目录;适合小时级日级分层保留。
  • AOF文件备份:直接拷贝appendonly.aof;建议结合AOF重写控制体积,备份时优先在重写完成后进行以减少不一致窗口。
  • 分层保留示例
    • 每小时保留一份RDB,保留最近48小时
    • 每天保留一份RDB,保留最近1个月
    • 每日将当日全量备份同步到远程对象存储/备份服务器,用于异地容灾。
  • 自动化:使用crontab定时执行备份脚本,脚本内可轮转目录、清理过期备份、记录日志。

三 自动化脚本与定时任务示例

  • 示例目录与权限(按实际环境调整):
    • 数据目录:/var/lib/redis/6379/(含dump.rdbappendonly.aof
    • 备份目录:/usr/local/redis/snapshotting/
    • 工具:/usr/bin/redis-cli
  • 小时级RDB备份脚本(保留48小时)
#!/usr/bin/env bash
set -Eeuo pipefail

DATA_DIR="/var/lib/redis/6379"
BACKUP_BASE="/usr/local/redis/snapshotting"
DATE_HOUR=$(date +%Y%m%d%H)
KEEP_HOURS=48

# 创建目标目录
mkdir -p "$BACKUP_BASE/$DATE_HOUR"

# 等待一次BGSAVE完成(避免拿到不完整快照)
redis-cli bgsave
while :; do
  sleep 2
  [[ $(redis-cli info Persistence | awk -F: '/rdb_bgsave_in_progress/{gsub(/\r/,""); print $2}') -eq 0 ]] && break
done

# 原子拷贝
cp -a "$DATA_DIR/dump.rdb" "$BACKUP_BASE/$DATE_HOUR/dump.rdb"

# 清理过期
DEL_HOUR=$(date -d "-${KEEP_HOURS} hours" +%Y%m%d%H)
rm -rf "$BACKUP_BASE/$DEL_HOUR"

echo "$(date) Hourly backup completed: $BACKUP_BASE/$DATE_HOUR/dump.rdb"
  • 日级RDB备份脚本(保留30天)
#!/usr/bin/env bash
set -Eeuo pipefail

DATA_DIR="/var/lib/redis/6379"
BACKUP_BASE="/usr/local/redis/snapshotting"
DATE_DAY=$(date +%Y%m%d)
KEEP_DAYS=30

mkdir -p "$BACKUP_BASE/$DATE_DAY"
redis-cli bgsave
while :; do
  sleep 2
  [[ $(redis-cli info Persistence | awk -F: '/rdb_bgsave_in_progress/{gsub(/\r/,""); print $2}') -eq 0 ]] && break
done
cp -a "$DATA_DIR/dump.rdb" "$BACKUP_BASE/$DATE_DAY/dump.rdb"
DEL_DAY=$(date -d "-${KEEP_DAYS} days" +%Y%m%d)
rm -rf "$BACKUP_BASE/$DEL_DAY"

echo "$(date) Daily backup completed: $BACKUP_BASE/$DATE_DAY/dump.rdb"
  • 定时任务(crontab)
# 每小时执行一次RDB备份
0 * * * * /usr/bin/bash /usr/local/redis/scripts/redis_rdb_hourly.sh >> /var/log/redis_backup.log 2>&1

# 每天零点执行一次日级RDB备份
0 0 * * * /usr/bin/bash /usr/local/redis/scripts/redis_rdb_daily.sh >> /var/log/redis_backup.log 2>&1
  • 远程备份(示例:每日同步到远端主机)
0 2 * * * rsync -avz --delete /usr/local/redis/snapshotting/ backup@backup.example.com:/data/redis/ >> /var/log/redis_backup_rsync.log 2>&1
  • 说明:生产环境优先使用BGSAVE而非SAVE(SAVE会阻塞主进程);脚本中通过轮询rdb_bgsave_in_progress确保拿到一致快照。

四 恢复流程与注意事项

  • 从RDB恢复(示例)
    1. 停止Redis:systemctl stop redis
    2. 备份并替换数据文件:cp /backup/2025…/dump.rdb /var/lib/redis/6379/dump.rdb
    3. 启动Redis:systemctl start redis
  • 从AOF恢复(示例)
    1. 停止Redis:systemctl stop redis
    2. 备份并替换AOF:cp /backup/…/appendonly.aof /var/lib/redis/6379/appendonly.aof
    3. 如AOF损坏,先修复:redis-check-aof --fix /var/lib/redis/6379/appendonly.aof
    4. 启动Redis:systemctl start redis
  • 双开场景的RDB冷备恢复要点
    • 若同时开启AOF+RDB,Redis启动会优先用AOF恢复;若此时仅有RDB备份,需先确保AOF不覆盖数据:
      1. 停止Redis;2) 临时关闭AOF:redis-cli config set appendonly no
      2. 拷贝RDB并启动;4) 确认数据恢复后,再开启AOF:redis-cli config set appendonly yes(让AOF从内存增量重写,避免空AOF覆盖);
      3. 最后持久化配置到redis.conf
  • 其他恢复方式
    • 使用远程RDB快照恢复:当本机RDB/AOF损坏或丢失时,从云存储/远端备份拉取最近快照恢复。
    • 时间点回滚:出现误写/数据污染时,选择更早的小时级/日级备份回滚。

五 监控校验与加固建议

  • 备份有效性:定期做恢复演练,核对key数量/关键业务数据一致性;保留校验日志备份清单
  • 权限与隔离:备份目录与Redis数据目录分离,设置最小权限;备份文件落地后再做远端同步
  • 监控告警:对bgsave失败磁盘空间不足备份任务异常退出设置告警
  • 性能与安全:AOF使用appendfsync everysec平衡性能与可靠性;定期执行AOF重写控制体积;RDB备份尽量避开业务高峰或确保BGSAVE完成后再拷贝。

0