Redis AOF 和 RDB 持久化策略原理

1、数据持久化

默认状况下 Redis 的数据都是保存在内存中,为避免 Redis 进程意外退出而致使数据丢失的问题,Redis 提供了 RDB 和 AOF 两种方式来实现数据的持久化存储。git

2、RDB 机制

RDB 机制是以指定的时间间隔将 Redis 中的数据生成快照并保存到硬盘中,它更适合于定时备份数据的应用场景。能够经过手动或者自动的方式来触发 RDB 机制:github

2.1 手动触发

能够经过如下两种方式来手动触发 RDB 机制:redis

  • save :save 命令会阻塞当前 Redis 服务,直到 RDB 备份过程完成,在这个时间内,客户端的全部查询都会被阻塞;
  • bgsave :Redis 进程会 fork 出一个子进程,阻塞只会发生在 fork 阶段,以后持久化的操做则由子进程来完成。

2.2 自动触发

除了手动使用命令触发外,在某些场景下也会自动触发 Redis 的 RDB 机制:算法

  • redis.conf 中配置了 save m n ,表示若是在 m 秒内存在了 n 次修改操做时,则自动触发bgsave;
  • 若是从节点执行全量复制操做,则主节点自动执行bgsave,并将生成的 RDB 文件发送给从节点;
  • 执行 debug reload 命令从新加载 Redis 时,会触发save操做;
  • 执行 shutdown 命令时候,若是没有启用 AOF 持久化则默认采用bgsave进行持久化。

2.3 相关配置

1. 文件目录shell

RDB 文件默认保存在 Redis 的工做目录下,默认文件名为 dump.rdb,能够经过静态或动态方式修改:数据库

  • 静态配置:经过修改 redis.conf 中的工做目录dir和数据库存储文件名dbfilename两个配置;安全

  • 动态修改:经过在命令行中执行如下命令:网络

    config set dir{newDir}
    config set dbfilename{newFileName}
    复制代码

2. 压缩算法app

Redis 默认采用 LZF 算法对生成的 RDB 文件作压缩处理, 这样能够减小占用空间和网络传输的数据量,可是压缩过程会耗费 CPU 的计算资源, 你能够按照实际状况,选择是否启用。能够经过修改 redis.conf 中的 rdbcompression 配置或使用如下命令来进行动态修改:运维

config set rdbcompression{yes|no}
复制代码

3、AOF 机制

AOF 是 Redis 提供的另一种持久化的方式,它以独立日志的方式记录每次写入操做,重启时再从新执行这些操做,从而达到恢复数据的命令。

3.1 执行原理

开启 AOF 机制后,全部的写入命令都会追加到 aof_buf 缓冲区中,并按照指定的策略定时将缓冲区中的数据同步到磁盘上。 AOF 除了记录每条命令外,还会在适当的时候 fork 出一个子进程对 AOF 文件进行重写,在重写过程当中,Redis 会将能够合并的语句进行合并,将无效的语句进行删除,从而减少 AOF 文件的体积,以便减小文件的占用空间和方便在数据恢复时可以更快的进行加载。

3.2 同步策略

Redis 提供了三种同步策略,用于控制 AOF 缓冲区同步数据到磁盘上的行为,由参数appendfsync控制:

可选配置 说明
always 命令写入 aof_buf 后就调系统 fsync 操做同步到 AOF 文件
everysec 命令写入 aof_buf 后就调用系统的 write 操做,但 fsync 同步文件的操做则由专门线程每秒调用一次
no 命令写入 aof_buf 后就调用系统的 write 操做,不对 AOF 文件作 fsync 同步,同步操做由操做系统负责,一般同步周期最长为30秒

write 和 fsync 操做说明:

  • write 操做会触发延迟写机制,Linux 在内核提供页缓冲区用来提升硬盘的 IO 性能,write 操做在写入系统缓冲区后直接返回。同步操做依赖于系统调度机制,例如缓冲区页空间写满或达到特定时间周期。 同步文件以前,若是此时系统故障宕机,缓冲区内数据将丢失。
  • fsync 针对单个文件操做,作强制硬盘同步,fsync 操做将阻塞直到写入硬盘完成后返回,它保证了数据持久化的安全。

Redis 默认的同步机制为everysec,此时可以兼顾性能和保证数据安全,在发生意外宕机的时,最多会丢失一秒的数据。

3.3 相关配置

想要使用 AOF 功能,须要配置 appendonly的值为yes,默认值为no。默认 AOF 的文件名为 appendonly.aof, 能够经过修改appendfilename的值进行修改,和 RDB 文件的保存位置同样,默认保存在 Redis 的工做目录下。

4、对比分析

4.1 优势与缺点

RDB 的优势

  • RDB 使用一次性生成内存快照的方式, 产生的文件紧凑压缩比更高, 适用于备份和全量复制等场景。
  • RDB 文件一般比同一数据集的等效 AOF 文件小,因此使用 RDB 恢复数据远远快于 AOF 方式。
  • RDB 最大限度地提升了 Redis 的性能,由于 Redis 父进程只须要 fork 出一个子进程,它本生并不会执行磁盘 I/O 等操做。

RDB 的缺点

  • RDB 方式没办法作到数据的实时持久化,假设每次持久化的时间间隔是 5 分钟,当在上一次持久化后 3 分钟后发生了服务宕机,则这三分钟内的数据会所有丢失。
  • fork 操做是一个重量级的操做,若是数据集很大,Fork 操做可能会很是耗时。

AOF 的优势

  • AOF 可以实现实时或秒级的持久化操做,可以保证数据的最少丢失。
  • 若是忽然宕机,日志以半写命令结束,可使用 redis-check-aof 工具进行修复,从而保证数据最少丢失。

AOF 的缺点

  • AOF 文件一般比同一数据集等效的 RDB 文件大。
  • 根据选择的同步策略的不一样,AOF 可能比 RDB 还慢。

4.2 使用建议

按照 Redis 官方的推荐,为保证的数据安全性,能够同时使用这两种持久化机制,在 Redis 官方的长期计划里面,将来可能会将 AOF 和 RDB 统一为单一持久化模型。须要注意的是,在这种状况下,当 Redis 从新启动时,Redis 将使用 AOF 文件重建数据集,由于它能够保证数据的最少丢失。

参考资料

  1. 付磊,张益军 . 《Redis 开发与运维》. 机械工业出版社 . 2017-3-1
  2. 官方文档:Redis Persistence

更多文章,欢迎访问 [全栈工程师手册] ,GitHub 地址:github.com/heibaiying/…

相关文章
相关标签/搜索