Redis 持久化选型与混合持久化

RDB 与 AOF 各有优劣,Redis 5.0 起默认开启“混合持久化”:AOF 重写后把 base 部分存成 RDB,之后继续追加命令,兼顾恢复速度与丢数据窗口,是当前生产环境的主流组合。

三种方案怎么选

Redis 持久化三方案

方案配置要点丢数据窗口适用场景
仅 RDBappendonly no,配 save 规则最后一次快照之后可容忍分钟级丢失的缓存
仅 AOFappendonly yes取决于 fsync可靠性要求高、写入量不大
RDB + AOF 混合两者都开1~2 秒生产环境推荐

混合的关键配置是 aof-use-rdb-preamble,默认 yes:

save 900 1                  # 900 秒内 ≥1 次写则快照
save 300 10
appendonly yes              # 同时开 AOF
appendfsync everysec
aof-use-rdb-preamble yes    # 重写时 base 文件用 RDB 格式

验证一下当前持久化状态:

127.0.0.1:6379> CONFIG GET save appendonly aof-use-rdb-preamble
# 输出:1) "save"   2) "900 1 300 10 60 10000"
#       3) "appendonly"   4) "yes"
#       5) "aof-use-rdb-preamble"   6) "yes"

灾难恢复步骤

恢复的本质是让 Redis 重新加载数据目录(dir 指向的目录)里的 RDB/AOF 文件:

redis-cli shutdown nosave        # 停掉实例(nosave 不覆盖旧快照)
# 把备份的 dump.rdb 与 appendonly 相关文件放回数据目录
redis-server /etc/redis/redis.conf   # 按原配置启动,自动加载
redis-cli INFO persistence       # 检查 aof_enabled 等加载结果

注意:两者都开启时,Redis 启动以 AOF 为准恢复(其 base 已是 RDB,速度不慢)。恢复前建议先复制一份原文件留底,防止加载失败后无法回退。

主从 + 持久化的容灾组合

单独持久化还不够,典型生产组合是“一主多从 + 主从都做基本持久化 + 例行备份”:

  • 主库:appendonly yes + everysec,承载写入并负责最新数据;
  • 从库:可只开 RDB 定期快照,或关闭持久化专心做读副本与故障切换备胎;
  • 例行:每天定时 BGSAVE 并把 dump.rdb 拷到异地存储,定期演练恢复流程。

常见误区:有从节点就不用持久化吗

不一定。若主库完全关闭持久化后宕机,重启会得到一个空库;此时从库一旦重连做全量同步,会被空主库“同步”清空,等于副本也丢了。结论:复制只能防“单点故障”,不能替代持久化,至少主库必须开启 AOF,从库的选择取决于能否接受上述风险。

小结:可靠性按“仅 RDB < 仅 AOF < RDB+AOF 混合”递增;生产建议开启混合持久化并让主库承担 AOF,再叠加从库与例行异地备份形成完整容灾,而不是依赖某一项单点方案。

笔记加载中…