RDB(Redis DataBase)

  Redis 是内存数据库,如果不讲内存中的数据库状态保存到磁盘,那么一旦服务器进程退出,服务器中的数据库状态也会消失。

  什么是 RDB?在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是 Snapshot 快照,它恢复时是将快照文件直接读到内存里。

  Redis 会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何 IO 操作的,这就确保了极高的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那 RDB 方式要比 AOF 方式更加的高效。RDB 的缺点是最后一次持久化后的数据可能丢失。我们默认的就是 RDB,一般情况下不需要修改这个配置。

Z1BKROFQ3ZXL2V6Y5J.png

  RDB 保存的文件是 dump.rdb,可以在配置文件中进行修改。

# The filename where to dump the DB
dbfilename dump.rdb

save 60 5 # 修改备份策略。测试时,设置为 60s 内修改了 5 次 key,就触发 RDB 操作

触发机制:

  • save 的规则满足的情况下,会自动触发 RDB 规则;
  • 执行 flushall 命令,也会触发 RDB 规则;
  • 退出 redis,也会产生 RDB 文件。

如何执行 RDB 文件:

  • 只需要将 RDB 文件放在我们 Redis 启动目录就可以,Redis 启动的时候回自动检查 dump.rdb 恢复其中的数据;
  • 查看需要存在的位置:
127.0.0.1:6379> config get dir
1) "dir"
2) "/usr/develop/redis-5.0.5/src" # 如果在这个目录下 dump.rdb 文件,启动就会自动恢复其中的数据

优点

  • 适合大规模的数据恢复;
  • 对数据的完整性要不高。

缺点

  • 需要一定的时间间隔进行操作,如果 redis 意外宕机了,这个最后一次修改数据就没有的了;
  • fork 进程的时候,会占用一定的内容空间。

AOF(Append Only File)

  AOF 以日志的形式来记录每个写操作,将 Redis 执行过的所有指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis 启动之初会读取该文件重新构建数据。换言之,redis 重启的后会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。

P359898H3KBNTQ59.png

  AOF 默认是关闭的,需要将 appendonly 设置为 yes,重启后即可生效。

appendonly no
# 保存 aof 的文件名
appendfilename "appendonly.aof"

# appendfsync always # 每次修改都会 sync,消耗性能
appendfsync everysec # 每秒执行一次 sync,可能会丢失这 1s 的数据
# appendfsync no # 不执行sync,这个时候操作系统自己同步数据,速度最快

  如果 aof 文件出错,redis 是启动不起来的,redis 提供有修复 aof 的命令。

./redis-check-aof --fix appendonly.aof

  默认情况下 aof 文件可以无限追加,文件会越来越大。

no-appendfsync-on-rewrite no

# 如果 aof 文件大于 64m,fork 一个新的进程来将文明的文件进行重写
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

优点

  • 每一次修改都同步,文件的完整性会更加好;
  • 每秒同步一次,可能会丢失一秒的数据;
  • 从不同步,效率最高。

缺点

  • 相对于数据文件来说,aof 远远大于 rdb,恢复的速度也比 rdb 慢;
  • aof 运行效率也要比 rdb 慢,所以 redis 默认的配置就是 rdb。(在主从复制的从机上,rdb 是备用的)

扩展

  • RDB 持久化方式能够在指定的时间间隔内对你的数据进行快照存储;
  • AOF 持久化方式记录每次对服务器写的操作,当服务器重启的时候回重新执行这些命令来恢复原始的数据,AOF 命令以 Redis 协议追加保存每次写的操作到文件末尾,Redis 还能对 AOF 文件进行后台重写,使得 AOF 文件的体积不至于过大;
  • 只做缓存,如果你只希望你的数据在服务器运行的时候存在,你也可以不适用任何持久化
  • 同时开启两种持久化方式:
    • 在这种情况下,当 redis 重启的时候回优先载入 AOF 文件来恢复原始的数据,因为在通常情况下 AOF 文件保存的数据集要比 RDB 文件保存的数据集要完整;
    • RDB 的数据不实时,同时使用两者时服务器重启也只会找 AOF 文件。那要不要只使用 AOF?作者建议不用,因为 RDB 更适合用于备份数据库(AOF 在不断变化不好备份),可以快速重启,AOF 可能有潜在的 Bug。
  • 性能建议:
    • 因为 RDB 文件只用作后备用途,建议只在 Slave 上持久化 RDB 文件,而且只要 15 分组备份一次就够了,只保留 save 900 1 这条规则;
    • 如果使用 AOF,好处是在最恶劣情况下也只会丢失不超过两秒数据,启动脚本较简单只 load 自己的 AOF 文件就可以了,代价一是带来了持续的 IO,二是 AOF rewrite 的最后将 rewrite 过程中产生的新数据写到新文件造成的阻塞几乎是不可避免的。只要硬盘许可,应该尽量减少 AOF rewrite 的频率,AOF 重写的基础大小默认值 64M 太小了,可以设置到 5G 以上,默认超过原大小 100% 大小重写可以改到适当的数据值;
    • 如果不使用 AOF,仅靠 Master-Slave Repllcation(主从复制)实现高可用性也可以,能省掉一大笔 IO,也减少了 rewrite 时带来的系统波动。代价是如果 Master/Slave 同时倒掉,会丢失十几分钟的数据,启动脚本也要比较两个 Master/Slave 钟的 RDB 文件,载入较新的那个。

标题:Redis 持久化之 RDB 和 AOF
作者:Yi-Xing
地址:http://47.94.239.232/articles/2021/03/01/1614610009549.html
博客中若有不恰当的地方,请您一定要告诉我。前路崎岖,望我们可以互相帮助,并肩前行!