8.3.3 混合持久化与版本兼容
混合持久化(RDB+AOF)通过在AOF文件头部写入一段RDB快照,再追加AOF命令流,实现“启动快速+尽量完整恢复”。适用于对恢复时间与数据完整性都有要求的生产场景。启用时需关注版本兼容与工具链一致性,避免旧版本无法解析新格式导致启动失败。
原理草图(RDB前缀 + AOF命令流)
启用与验证(含安装与配置示例)
1) 安装/升级 Redis(以 6.x+ 为例,系统包或源码二选一)
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y redis-server
# CentOS/RHEL
sudo yum install -y epel-release
sudo yum install -y redis
# 验证版本(需 >= 4.0 才支持混合持久化)
redis-server --version
2) 修改配置并重启
# 假设配置文件路径
sudo sed -i 's/^# *appendonly.*/appendonly yes/' /etc/redis/redis.conf
sudo sed -i 's/^# *aof-use-rdb-preamble.*/aof-use-rdb-preamble yes/' /etc/redis/redis.conf
sudo sed -i 's/^# *appendfsync.*/appendfsync everysec/' /etc/redis/redis.conf
# 重启服务
sudo systemctl restart redis
sudo systemctl status redis --no-pager
3) 验证混合持久化生效
# 查看配置
redis-cli CONFIG GET appendonly
redis-cli CONFIG GET aof-use-rdb-preamble
# 观察日志(不同发行版日志路径可能不同)
sudo tail -n 200 /var/log/redis/redis-server.log | grep -E "AOF|RDB|preamble"
# 预期日志关键字(示例)
# "Loading RDB preamble from AOF file"
# "AOF rewrite finished"
4) 文件结构验证(检查AOF是否以RDB头开头)
# 触发一次重写以生成新AOF
redis-cli BGREWRITEAOF
# 查看AOF文件头(通常 /var/lib/redis/appendonly.aof)
sudo head -c 16 /var/lib/redis/appendonly.aof | hexdump -C
# 预期效果:头部包含 "REDIS" 字样(RDB文件头)
版本兼容与升级策略(含操作命令)
- 兼容性原则:旧版本无法读取包含RDB前缀的新AOF。
- 升级顺序:先从库后主库,确保回滚窗口。
# 查看主从信息
redis-cli INFO replication | egrep "role|master_host|master_link_status"
# 从库先升级并观察同步
# 升级完成后观察主从状态是否 "master_link_status:up"
- 回滚策略:保留纯RDB或纯AOF备份,必要时关闭RDB前缀并重写。
# 关闭RDB前缀并重写为纯AOF(兼容旧版本)
redis-cli CONFIG SET aof-use-rdb-preamble no
redis-cli BGREWRITEAOF
# 备份关键文件
sudo cp /var/lib/redis/dump.rdb /backup/dump.rdb.$(date +%F)
sudo cp /var/lib/redis/appendonly.aof /backup/appendonly.aof.$(date +%F)
性能与容量评估(含监控命令)
# 观察AOF大小与重写状态
redis-cli INFO persistence | egrep "aof_current_size|aof_rewrite_in_progress|aof_rewrite_time_sec"
# 关注磁盘容量
df -h /var/lib/redis
排错与恢复示例
1) 启动报错“Bad file format”
# 说明可能是旧版本解析新格式,处理:
# 方案A:升级Redis到支持版本
# 方案B:关闭RDB前缀并重写AOF
redis-cli CONFIG SET aof-use-rdb-preamble no
redis-cli BGREWRITEAOF
sudo systemctl restart redis
2) AOF损坏修复
# 使用与Redis版本匹配的工具
sudo redis-check-aof --fix /var/lib/redis/appendonly.aof
# 修复后重启
sudo systemctl restart redis
3) 数据恢复不完整(fsync策略过慢)
# 将 appendfsync 调整为 everysec 或 always(权衡性能)
redis-cli CONFIG SET appendfsync everysec
redis-cli CONFIG REWRITE
最小可复现练习
1) 启用混合持久化并验证AOF头部包含RDB标识
2) 模拟重写:执行 BGREWRITEAOF,观察 aof_rewrite_in_progress 变化
3) 人为制造版本不匹配(仅在测试环境):用旧版本读新AOF,观察报错并记录恢复步骤
4) 记录日志关键字与AOF文件大小变化,给出结论:混合持久化对启动速度与文件大小的影响
命令解释小结
- aof-use-rdb-preamble yes:在AOF开头写入RDB快照,提升重启速度
- BGREWRITEAOF:后台重写AOF,生成新的混合AOF文件
- redis-check-aof --fix:修复损坏的AOF文件(需匹配版本)
- INFO persistence:查看AOF状态与重写耗时指标