Skip to content

《面渣逆袭》Redis 篇 · 第 2/8 章。原版 PDF(下载 / 打印)

8.Redis持久化方式有哪些?有什么区别?

Redis 持久化方案分为RDB 和AOF 两种。

配图

RDB

RDB 持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB 持久化过程分为手动触发和自动触发。

RDB 文件是一个压缩的二进制文件,通过它可以还原某个时刻数据库的状态。由于RDB 文件是保存在硬盘上的,所以即使Redis 崩溃或者退出,只要RDB 文件存在,就可以用它来恢复还原数据库的状态。

手动触发分别对应save和bgsave命令:

配图

save 命令:阻塞当前Redis 服务器,直到RDB 过程完成为止,对于内存比较大的实例会造成长时间阻塞,线上环境不建议使用。

bgsave 命令:Redis 进程执行fork 操作创建子进程,RDB 持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork 阶段,一般时间很短。

以下场景会自动触发RDB 持久化:

使用save 相关配置,如“ savemn ” 。表示m 秒内数据集存在n 次修改时,自动触发bgsave 。

如果从节点执行全量复制操作,主节点自动执行bgsave 生成RDB 文件并发送给从节点执行debugreload 命令重新加载Redis 时,也会自动触发save 操作默认情况下执行shutdown 命令时,如果没有开启AOF 持久化功能则自动执行bgsave 。

AOF

AOF (appendonlyfile )持久化:以独立日志的方式记录每次写命令, 重启时再重新执行AOF 文件中的命令达到恢复数据的目的。AOF 的主要作用是解决了数据持久化的实时性,目前已经是Redis 持久化的主流方式。

AOF 的工作流程操作:命令写入 (append )、文件同步(sync )、文件重写(rewrite )、重启加载(l oad )

配图

流程如下:

  1. 所有的写入命令会追加到a of_buf (缓冲区)中。

  2. AOF 缓冲区根据对应的策略向硬盘做同步操作。

  3. 随着AOF 文件越来越大,需要定期对AOF 文件进行重写,达到压缩 的目的。

  4. 当Redis 服务器重启时,可以加载AOF 文件进行数据恢复。

9.RDB 和 AOF 各自有什么优缺点?

RDB| 优点

  1. 只有一个紧凑的二进制文件dump.rdb,非常适合备份、全量复制的场景。

  2. 容灾性好,可以把RDB 文件拷贝道远程机器或者文件系统张,用于容灾恢复。

  3. 恢复速度快,RDB 恢复数据的速度远远快于AOF 的方式

RDB| 缺点

  1. 实时性低,RDB 是间隔一段时间进行持久化,没法做到实时持久化/ 秒级持久化。如果在这一间

隔事件发生故障,数据会丢失。

  1. 存在兼容问题,Redis 演进过程存在多个格式的RDB 版本,存在老版本Redis 无法兼容新版本

RDB 的问题。

AOF| 优点

  1. 实时性好,a of 持久化可以配置appendfsync属性,有always,每进行一次命令操作就记录

到 aof 文件中一次。

  1. 通过 append 模式写文件,即使中途服务器宕机,可以通过 redis-check-aof 工具解决数据一致

性问题。

AOF| 缺点

  1. AOF 文件比 RDB文件大,且恢复速度慢

  2. 数据集大的时候,比 RDB启动效率低

10.RDB和AOF如何选择?

一般来说, 如果想达到足以媲美数据库的数据安全性,应该同时使用两种持久化功能。在这种情况下,当 Redis 重启的时候会优先载入 AOF 文件来恢复原始的数据,因为在通常情况下 AOF文件保存的数据集要比 RDB 文件保存的数据集要完整。

如果可以接受数分钟以内的数据丢失,那么可以只使用 RDB 持久化

有很多用户都只使用 AOF 持久化,但并不推荐这种方式,因为定时生成 RDB 快照(snapshot )

非常便于进行数据备份, 并且 RDB 恢复数据集的速度也要比 AOF 恢复的速度要快,除此之外,使用 RDB 还可以避免 AOF 程序的 bug 。

如果只需要数据在服务器运行的时候存在,也可以不使用任何持久化方式。

11.Redis的数据恢复?

当Redis 发生了故障,可以从RDB 或者AOF 中恢复数据。

恢复的过程也很简单,把RDB 或者AOF 文件拷贝到Redis 的数据目录下,如果使用AOF 恢复,配置文件开启AOF ,然后启动redis-server 即可。

配图

Redis启动时加载数据的流程:

  1. AOF 持久化开启且存在AOF 文件时,优先加载AOF 文件。

  2. AOF 关闭或者AOF 文件不存在时,加载RDB 文件。

  3. 加载AOF/RDB 文件成功后,Redis 启动成功。

  4. AOF/RDB 文件存在错误时,Redis 启动失败并打印错误信息。

12.Redis 4.0 的混合持久化了解吗?

重启 Redis 时,我们很少使用RDB来恢复内存状态,因为会丢失大量数据。我们通常使用 AOF 日志重放,但是重放 AOF 日志性能相对RDB来说要慢很多,这样在 Redis 实例很大的情况下,启动需要花费很长的时间。

Redis4.0为了解决这个问题,带来了一个新的持久化选项— —混合持久化。将rdb文件的内容和增量的 AOF 日志文件存在一起。这里的 AOF 日志不再是全量的日志,而是自持久化开始到持久化结

的这段时间发生的增量 AOF 日志,通常这部分 AOF 日志很小:

配图

于是在 Redis 重启的时候,可以先加载rdb的内容,然后再重放增量 AOF 日志就可以完全替代之前的 AOF 全量文件重放,重启效率因此大幅得到提升。

本文整理自三分恶《面渣逆袭》系列的公开内容,仅供个人学习使用

本站仅供个人学习使用,请勿外传