Redis 数据丢失?RDB 和 AOF 选错,让你损失惨重!

239 阅读5分钟

这篇文章详细讲解了 Redis 的 RDB 和 AOF 持久化机制,以及它们在实战中的应用。

一、RDB (Redis Database) 快照

  • 工作原理: RDB 就像给 Redis 数据库拍了一张照片。它会定期将 Redis 在内存中的数据,以二进制文件的形式保存到硬盘上。 触发方式

    • 自动触发: Redis 可以配置定时任务,例如每隔 5 分钟,如果数据有 100 个 key 发生变化,就自动生成 RDB 文件。
    • 手动触发: 通过 SAVEBGSAVE 命令手动触发。SAVE 会阻塞 Redis 主进程,不建议在生产环境中使用。BGSAVE 会 fork 一个子进程来执行,不会阻塞主进程。
    • 恢复: 当 Redis 重启时,会加载 RDB 文件,将数据恢复到内存中。
  • 优点:

    • 紧凑: RDB 文件是二进制压缩文件,体积小,占用磁盘空间少。
    • 恢复速度快: 由于是完整的数据快照,恢复速度比 AOF 快得多。
    • 适合备份: 非常适合用于备份,可以轻松地将 RDB 文件复制到其他地方。
    • 对性能影响小: BGSAVE 通过子进程进行,对主进程影响较小。
  • 缺点:

    • 数据丢失风险: 如果 Redis 发生故障,可能会丢失最后一次 RDB 快照之后的数据。数据丢失的量取决于快照的频率。
    • 实时性差: RDB 是定时快照,不是实时持久化。
    • fork 进程开销: BGSAVE 需要 fork 子进程,当数据量很大时,fork 过程可能会比较耗时。

二、AOF (Append Only File) 追加文件

  • 工作原理:

    • AOF 就像 Redis 的操作日志。它会记录 Redis 接收到的每一条写命令(包括 SETDELHSET 等),以追加的方式写入到 AOF 文件中。
    • 恢复: 当 Redis 重启时,会重新执行 AOF 文件中的所有命令,将数据恢复到内存中。
    • AOF 重写: AOF 文件会不断增大,为了避免文件过大,Redis 会定期进行 AOF 重写。重写会创建一个新的 AOF 文件,只包含重建当前数据集所需的最小命令集合。
  • 优点:

    • 数据安全性高: 可以配置不同的 fsync 策略,尽可能减少数据丢失。
      • always:每次写命令都同步到磁盘,数据安全性最高,但性能最差。
      • everysec:每秒同步一次,兼顾了数据安全性和性能。
      • no:由操作系统决定何时同步,性能最好,但数据安全性最低。
    • 可读性: AOF 文件是文本文件,可读性较好,方便分析和调试。
    • 数据完整性: 即使 AOF 文件损坏,也可以通过 redis-check-aof 工具进行修复。
  • 缺点:

    • 文件体积大: AOF 文件通常比 RDB 文件大。
    • 恢复速度慢: 恢复时需要执行所有命令,速度比 RDB 慢。
    • 性能开销: AOF 的写入操作会带来一定的性能开销,尤其是在 always 模式下。

三、RDB vs AOF:对比

特性RDBAOF
数据安全性较低,可能丢失最后一次快照之后的数据较高,可配置不同的 fsync 策略
文件大小较小较大
恢复速度
性能影响较低,BGSAVE 通过子进程进行较高,尤其是在 always 模式下
可读性不可读可读
适用场景备份、灾难恢复对数据安全性要求高的场景,例如金融系统

四、实战应用

  • 单独使用 RDB:
    • 适用于对数据安全性要求不高,但对性能和恢复速度有要求的场景。
    • 例如:缓存服务器,允许少量数据丢失。
  • 单独使用 AOF:
    • 适用于对数据安全性要求非常高的场景。
    • 例如:金融系统、订单系统。
  • 混合使用 RDB 和 AOF:
    • 这是最常见的做法,也是 Redis 官方推荐的做法。
    • 同时开启 RDB 和 AOF,Redis 会优先使用 AOF 进行恢复。
    • RDB 用于定期备份,AOF 用于保证数据安全性。
    • 可以根据实际情况调整 RDB 的快照频率和 AOF 的 fsync 策略。

五、数据性能比较

由于性能受多种因素影响(例如硬件、数据量、并发量等),很难给出精确的性能数据。一般来说:

  • 写入性能: RDB 的 BGSAVE 对写入性能影响较小,AOF 的 always 模式对写入性能影响最大。
  • 恢复性能: RDB 的恢复速度比 AOF 快得多。

六、大白话总结

  • RDB: 就像给数据库拍个快照,定期保存,体积小,恢复快,但如果突然断电,最后一次拍照之后的数据就没了。
  • AOF: 就像数据库的日记本,记录每一笔操作,数据安全,但日记本会越来越大,恢复也慢。
  • 混合使用: 既有快照,又有日记本,万无一失!

七、配置示例 (redis.conf)

# RDB 配置
save 900 1       # 900 秒内,如果至少有 1 个 key 发生变化,就保存
save 300 10      # 300 秒内,如果至少有 10 个 key 发生变化,就保存
save 60 10000    # 60 秒内,如果至少有 10000 个 key 发生变化,就保存
stop-writes-on-bgsave-error yes  # 如果 BGSAVE 出错,停止写入

# AOF 配置
appendonly yes      # 开启 AOF
appendfsync everysec # 每秒同步一次
auto-aof-rewrite-percentage 100 # AOF 文件增长超过 100% 时,自动重写
auto-aof-rewrite-min-size 64mb  # AOF 文件最小重写大小为 64MB

总结:

选择哪种持久化方式,或者混合使用,取决于你的应用场景和对数据安全性的要求。 理解 RDB 和 AOF 的优缺点,并根据实际情况进行配置,才能更好地利用 Redis。