如何实现 Redis 增量备份?(完整指南 + 生产级方案)
在 Redis 数据量较大或变更频繁的场景下,全量备份(如 RDB 快照) 存在以下问题:
- ❌ 备份时间长
- ❌ 占用大量磁盘和网络资源
- ❌ 恢复时需加载整个快照
增量备份(Incremental Backup) 只记录自上次备份以来的变更,能显著提升效率。
本文将详细介绍 Redis 增量备份的 5 种实现方式,包括 AOF 解析、RDB + 增量日志、CDC(变更数据捕获)、Redis 复制流解析,以及与 Logstash 集成的自动化方案。
一、Redis 增量备份核心思路
| 方法 | 原理 | 是否真正增量 |
|---|---|---|
| ✅ AOF 文件切片 | 将 AOF 按时间分段备份 | ✅ |
| ✅ RDB + 增量日志(AOF) | 全量 + 持续记录变更 | ✅ |
| ✅ 监听复制流(Replication Stream) | 捕获主从同步命令 | ✅ |
| ✅ CDC 工具(如 Debezium) | 从外部数据库捕获变更 | ⚠️ 间接 |
| ❌ 定时 diff RDB | 比较两个 RDB 差异 | ❌ 不推荐 |
✅ 推荐组合:RDB 全量 + AOF 增量 或 复制流捕获
二、方法一:基于 AOF 的增量备份(推荐)
2.1 原理
AOF 文件本身就是“增量日志”,定期切割并备份新增部分。
2.2 配置 Redis AOF
# redis.conf
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
# 自动重写(压缩)
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
2.3 增量备份脚本
#!/bin/bash
# redis_incremental_backup.sh
BACKUP_DIR="/backup/redis"
CURRENT_AOF="/var/lib/redis/appendonly.aof"
LAST_POS_FILE="$BACKUP_DIR/last_position.txt"
INCREMENTAL_FILE="$BACKUP_DIR/aof_incremental_$(date +%Y%m%d_%H%M%S).aof"
# 读取上次备份位置
if [ -f "$LAST_POS_FILE" ]; then
LAST_POS=$(cat $LAST_POS_FILE)
else
LAST_POS=0
fi
CURRENT_SIZE=$(stat -c%s "$CURRENT_AOF")
if [ $CURRENT_SIZE -le $LAST_POS ]; then
echo "No new data or AOF rewrite occurred. Triggering BGREWRITEAOF..."
redis-cli BGREWRITEAOF
sleep 5
LAST_POS=0 # 重写后从头开始
CURRENT_SIZE=$(stat -c%s "$CURRENT_AOF")
fi
# 提取新增部分
dd if="$CURRENT_AOF" of="$INCREMENTAL_FILE" \
bs=1 skip=$LAST_POS count=$((CURRENT_SIZE - LAST_POS)) 2>/dev/null
# 压缩
gzip "$INCREMENTAL_FILE"
# 更新位置
echo $CURRENT_SIZE > $LAST_POS_FILE
echo "✅ Incremental backup saved: $INCREMENTAL_FILE.gz"
2.4 定时任务
# 每 15 分钟增量备份一次
*/15 * * * * /path/to/redis_incremental_backup.sh
三、方法二:RDB 全量 + AOF 增量(生产推荐)
3.1 架构设计
[全量备份] 每天 02:00 → RDB 快照
[增量备份] 每 15 分钟 → AOF 新增部分
恢复时:
- 加载最近的 RDB
- 按顺序重放增量 AOF 文件
3.2 恢复脚本
#!/bin/bash
# restore_redis_incremental.sh
RDB_FILE="/backup/redis/dump-20250405.rdb"
AOF_DIR="/backup/redis"
REDIS_DATA="/var/lib/redis"
# 1. 停止 Redis
systemctl stop redis
# 2. 恢复 RDB
cp "$RDB_FILE" "$REDIS_DATA/dump.rdb"
# 3. 合并增量 AOF
cat "$AOF_DIR"/aof_incremental_20250405*.aof.gz | gunzip > /tmp/merged.aof
# 4. 替换 AOF 文件
mv /tmp/merged.aof "$REDIS_DATA/appendonly.aof"
# 5. 启动 Redis(自动重放 AOF)
systemctl start redis
四、方法三:监听复制流(Replication Stream)— 高级方案
Redis 主节点会向从节点发送命令流,可通过伪装成从节点来捕获所有写操作。
4.1 使用 redis-cli --slave 捕获命令
# 实时输出所有写命令
redis-cli --rdb <(echo "SAVE"; exit) --slave | while read line; do
echo "$line" >> /backup/redis/stream_$(date +%Y%m%d).log
done
4.2 使用 Python 监听复制流
import redis
import gzip
from datetime import datetime
r = redis.Redis(host='redis-master', port=6379)
# 伪装成从节点
with r.listen() as pubsub:
pubsub.execute_command('REPLCONF', 'listening-port', 0)
pubsub.execute_command('PSYNC', '?', -1)
backup_file = f"/backup/redis/stream_{datetime.now():%Y%m%d_%H%M%S}.log.gz"
with gzip.open(backup_file, 'wt') as f:
for item in pubsub.listen():
if item['type'] == 'ioerror':
break
if item['type'] == 'message':
f.write(f"{item['data']}\n")
⚠️ 需要处理
PSYNC、EOF等协议细节。
五、方法四:使用 CDC 工具(间接增量)
如果 Redis 缓存的是数据库数据,可通过监听数据库变更实现“逻辑增量备份”。
架构:
[MySQL] → [Debezium] → [Kafka] → [Logstash] → [Redis DEL / UPDATE]
↓
[备份变更事件]
优点:
- 真实业务变更粒度
- 可审计、可重放
缺点:
- 不是 Redis 物理增量
- 依赖外部系统
六、方法五:RDB 差异备份(不推荐)
通过比较两个 RDB 文件的差异生成增量包。
工具:rdbtools
# 导出两个 RDB 为 JSON
rdb --command json dump1.rdb > dump1.json
rdb --command json dump2.rdb > dump2.json
# 计算差异(需自定义脚本)
diff dump1.json dump2.json > changes.json
❌ 问题:RDB 是二进制格式,diff 不精确,性能差。
七、Logstash 集成实现增量备份
场景:将 Redis 变更事件备份到 Elasticsearch
# logstash.conf
input {
redis {
host => "redis.internal"
type => "channel"
key => "__keyevent@0__:set" # Redis 键空间通知
data_type => "pattern_channel"
}
}
filter {
# 解析 key 和事件
mutate {
add_field => {
"backup_time" => "%{@timestamp}"
"source_type" => "redis_event"
}
}
}
output {
elasticsearch {
hosts => ["http://es:9200"]
index => "redis-backup-events-%{+YYYY.MM.dd}"
}
# 也可写入文件做归档
file {
path => "/backup/redis/events.log"
codec => line { format => "custom: %{message}" }
}
}
需启用 Redis 键空间通知:
notify-keyspace-events "Ex"
八、增量备份策略最佳实践
| 项目 | 推荐做法 |
|---|---|
| 全量频率 | 每天 1 次(低峰期) |
| 增量频率 | 每 5~15 分钟 |
| 存储 | 增量文件保留 7 天,全量保留 30 天 |
| 压缩 | 使用 gzip 或 zstd |
| 加密 | 传输和存储时加密 |
| 验证 | 定期恢复测试 |
| 监控 | 监控增量大小、备份延迟 |
九、恢复流程
9.1 确定恢复时间点
# 查看备份文件
ls -l /backup/redis/
# dump-20250405.rdb
# aof_incremental_20250405_030000.aof.gz
# aof_incremental_20250405_031500.aof.gz
9.2 恢复步骤
- 选择最近的 RDB 全量备份
- 按时间顺序合并所有后续增量 AOF
- 停止 Redis,替换
dump.rdb和appendonly.aof - 启动 Redis
十、常见问题与解决方案
| 问题 | 解决方案 |
|---|---|
| AOF 被重写导致断流 | 重置 last_position 为 0 |
| 增量文件过大 | 增加备份频率或启用 AOF 重写 |
| 恢复失败 | 检查 AOF 文件完整性 redis-check-aof |
| 数据不一致 | 确保全量和增量时间连续 |
十一、结语
Redis 增量备份是 大规模生产环境的必备能力。推荐使用:
🔑 最佳方案:
- 每日 RDB 全量备份
- 每 15 分钟 AOF 增量备份
- 异地存储 + 加密 + 监控
通过合理设计,既能保证数据安全,又能控制资源消耗。
1254

被折叠的 条评论
为什么被折叠?



