混合持久化
混合持久化是Redis 4.0引入的新特性,将RDB快照和AOF日志结合,兼顾恢复速度和数据安全。
混合持久化原理
设计背景
Bash
RDB优缺点:
+ 恢复快速,文件紧凑
- 数据安全性低,可能丢失数据
AOF优缺点:
+ 数据安全,最多丢失1秒
- 恢复较慢,文件较大
混合持久化:
+ RDB快速恢复 + AOF数据安全
+ 文件大小适中
+ 最佳持久化方案
混合格式
Bash
混合AOF文件结构:
┌──────────────────────┐
│ RDB格式部分 │ ← 快照数据
│ (紧凑二进制) │
├──────────────────────┤
│ AOF格式部分 │ ← 增量命令
│ (文本命令) │
└──────────────────────┘
恢复流程:
1. 加载RDB部分(快速)
2. 执行AOF部分命令(补全)
AOF重写时混合
Bash
混合持久化在AOF重写时生效:
1. 子进程fork
2. 子进程写入RDB格式快照
3. 主进程记录增量命令
4. 子进程完成后追加增量命令
5. 新文件替换旧AOF
混合持久化配置
开启混合持久化
Bash
# redis.conf配置
# 开启AOF(必须先开启AOF)
appendonly yes
# 开启混合持久化
aof-use-rdb-preamble yes
# AOF文件名
appendfilename "appendonly.aof"
# 同步策略
appendfsync everysec
配置说明
Bash
# aof-use-rdb-preamble yes
# 重写时使用RDB格式作为前缀
# 后面追加AOF格式的增量命令
# aof-use-rdb-preamble no
# 重写时纯AOF格式(传统方式)
完整配置示例
Bash
# 混合持久化推荐配置
appendonly yes
appendfsync everysec
aof-use-rdb-preamble yes
# AOF重写配置
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# RDB配置(可选,作为备份)
save 900 1
dbfilename dump.rdb
混合持久化流程
重写流程详解
Bash
AOF重写过程:
1. 触发重写
- 文件增长达到阈值
- 或手动BGREWRITEAOF
2. fork子进程
- 子进程生成RDB快照
- 写入临时文件开头
3. 主进程继续服务
- 新命令写入AOF缓冲区
- 同时写入旧AOF文件
4. 子进程完成
- RDB部分写入完成
- 追加AOF缓冲区的增量命令
5. 替换文件
- 新文件重命名为appendonly.aof
- 旧文件删除
恢复流程详解
Bash
混合AOF恢复过程:
1. Redis启动
- 检测AOF文件存在
2. 判断格式
- 检查是否为混合格式(RDB前缀)
3. 加载RDB部分
- 快速加载二进制快照
- 内存数据恢复基础状态
4. 执行AOF部分
- 逐条执行增量命令
- 补全RDB后的数据变更
5. 恢复完成
- 内存数据完整
- 开始提供服务
混合持久化优势
优势列表
text
1. 恢复速度快
- RDB部分快速加载
- 比纯AOF快很多
2. 数据安全高
- AOF增量保证数据完整
- 最多丢失1秒数据
3. 文件大小适中
- RDB压缩减少体积
- 比纯AOF小
4. 兼容性好
- 可回退到纯AOF
- 老版本Redis也能加载AOF部分
与纯AOF对比
| 特性 | 纯AOF | 混合持久化 |
|---|---|---|
| 恢复速度 | 慢 | 快 |
| 文件大小 | 大 | 中 |
| 数据安全 | 高 | 高 |
| 实时性 | 实时 | 实时 |
与纯RDB对比
| 特性 | 纯RDB | 混合持久化 |
|---|---|---|
| 恢复速度 | 最快 | 快 |
| 文件大小 | 最小 | 中 |
| 数据安全 | 低 | 高 |
| 实时性 | 定时 | 实时 |
文件格式识别
文件开头标识
text
纯AOF文件开头:
*1
$6
SELECT
$1
0
混合AOF文件开头:
REDIS0007(RDB版本标识)
(二进制数据)
自动识别处理
text
# Redis启动时自动识别格式
# 检测文件开头判断:
# "REDIS"开头 → 混合格式,先加载RDB
# "*"开头 → 纯AOF格式,逐条执行
INFO persistence
# aof_use_rdb_preamble: 1表示混合格式
混合持久化兼容性
版本要求
text
Redis 4.0+:支持混合持久化
Redis 3.x:不支持,使用纯AOF
向下兼容:
- 混合文件可被老版本Redis加载
- 老版本只加载AOF部分(忽略RDB)
配置回退
text
# 禁用混合持久化
aof-use-rdb-preamble no
# 回退到传统纯AOF
最佳实践
生产配置
text
# 推荐生产配置
appendonly yes
appendfsync everysec
aof-use-rdb-preamble yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# 同时保留RDB作为备份
save 900 1
save 300 10
save 60 10000
备份策略
text
1. 主持久化:混合AOF
- 数据恢复主要来源
- 数据最完整
2. 备份持久化:RDB
- 定期保存快照
- 跨机房备份方便
- 文件紧凑易传输
恢复策略
text
优先级:
1. 混合AOF(数据最完整)
2. RDB文件(恢复最快)
3. 两者配合使用
场景:
- 正常恢复:使用混合AOF
- 快速恢复:使用RDB(容忍少量丢失)
- 灾难恢复:远程备份的RDB + 本地AOF
注意事项
重写期间注意
text
- 重写时内存消耗增加(fork)
- 大数据量重写耗时较长
- 重写期间继续服务
- 可能短暂阻塞(fsync)
文件管理
text
# 监控AOF文件大小
INFO persistence | grep aof_current_size
# 定期备份AOF文件
cp appendonly.aof /backup/appendonly.aof.$(date +%Y%m%d)
# 保留多个版本
磁盘空间
text
- 混合文件仍比纯RDB大
- 确保磁盘空间充足
- 监控磁盘使用率
监控与告警
监控指标
text
INFO persistence
# 关键指标
aof_use_rdb_preamble: 是否使用混合格式
aof_current_size: 当前文件大小
aof_rewrite_in_progress: 是否正在重写
aof_last_rewrite_time_sec: 重写耗时
告警设置
text
- 文件大小超过阈值告警
- 重写失败告警
- 重写耗时过长告警(>60秒)
- 磁盘空间不足告警
要点总结
- 混合持久化Redis 4.0+引入,结合RDB和AOF优点
- AOF重写时以RDB格式开头,追加AOF增量命令
- aof-use-rdb-preamble yes开启混合持久化
- 优点:恢复快(RDB)+ 数据安全(AOF)+ 文件适中
- 恢复时先加载RDB快照,再执行AOF增量命令
- 老版本Redis可加载混合文件(只执行AOF部分)
- 生产推荐:混合AOF作为主持久化,RDB作为备份
- 监控文件大小和重写状态,异常告警
- 确保磁盘空间充足,定期备份AOF文件
📝 发现内容有误?点击此处直接编辑