夏溪辰的博客

xiaxichen's blog

Redis 持久化

39
2023-12-04

Redis 持久化

Redis服务器中的数据保存到磁盘上,以便在服务器重启后可以恢复数据。Redis提供了两种主要的持久化方式:快照(RDB)和日志(AOF)。

快照持久化(RDB)

基本概念:

  • 快照持久化是将Redis数据在某个时间点上的快照保存到磁盘上的过程。
  • 快照文件是一个二进制文件,包含了Redis服务器在某个时间点上的数据。
  • 快照持久化可以通过配置Redis服务器的 save指令来定期进行,也可以手动执行 SAVEBGSAVE命令来生成快照。
  • 在进行快照持久化时,Redis会fork出一个子进程来处理持久化操作,这样可以保证主进程继续处理客户端请求而不被阻塞。
  • 快照持久化的优点是快速和紧凑,适用于备份和恢复数据。

策略:

  1. save指令:
    • save指令用于配置RDB持久化的触发条件。可以通过在Redis配置文件中添加多个 save指令来指定多个触发条件。每个 save指令都由两个参数组成,分别是时间和修改的键数。
    • 例如,save 60 1000表示当60秒内有至少1000个键被修改时,Redis会自动执行一次快照持久化操作。
  2. BGSAVE命令:
    • BGSAVE(Background Save)命令用于手动触发生成快照的操作。
    • 执行 BGSAVE命令时,Redis会创建一个子进程来处理快照持久化操作,而主进程继续处理客户端请求,不会被阻塞。
    • BGSAVE命令适用于需要立即创建快照的场景,例如在进行重启或备份之前。
  3. 自动触发:
    • Redis还提供了自动触发快照持久化的机制。可以通过配置 save指令的参数为 0 0来禁用自动触发,或者将 save指令的参数设置为 ""(空字符串)来禁用所有自动触发条件。
    • 如果没有配置自动触发条件,可以通过手动执行 SAVE命令来生成快照。

机制:

  • 可以通过配置 save指令来设置自动触发快照生成的条件。每个 save指令由两个参数组成,分别表示时间和修改的键数。
  • 例如,save 60 1000表示当60秒内有至少1000个键被修改时,Redis会自动执行一次快照持久化操作。
  • 可以在Redis配置文件中添加多个 save指令来设置多个自动触发条件。

日志持久化(AOF)

基本概念:

  • 日志持久化是将Redis服务器接收到的每个写操作追加到一个文件(AOF文件)的过程。
  • AOF文件是一个文本文件,包含了Redis服务器接收到的所有写操作的记录。
  • 日志持久化可以通过配置Redis服务器的 appendonly指令来开启。
  • Redis服务器会将每个写操作追加到AOF文件,当服务器重启时,可以通过重新执行AOF文件中的操作来恢复数据。
  • 日志持久化的优点是数据完整性更好,可以提供更高的持久化保证,但相对于快照持久化来说,AOF文件通常会更大。

策略:

  1. always(默认):
    • 这是默认的AOF策略。每个写命令都会立即追加到AOF文件中,并通过 fsync系统调用将数据同步到磁盘上。
    • fsync操作会导致磁盘的写入延迟,但可以提供最高的数据安全性,因为在每个写操作后,数据都被强制刷新到磁盘上。
  2. everysec
    • Redis会每秒钟执行一次 fsync操作,将AOF缓冲区中的数据同步到磁盘上。
    • 这个策略相对于 always策略来说,可以提供更好的性能,因为磁盘写入操作的频率较低。
    • 但是,在发生故障时,可能会丢失最近一秒钟的数据。
  3. no
    • Redis不会主动执行 fsync操作,而是依靠操作系统来处理数据同步到磁盘的时机。
    • 这个策略提供了最佳的性能,因为Redis不需要等待磁盘的写入完成。
    • 但是,在发生故障时,可能会丢失一定量的数据。

机制:

  • 手动触发:可以使用 BGREWRITEAOF命令来手动触发AOF重写过程。
  • 自动触发:可以通过配置 auto-aof-rewrite-percentageauto-aof-rewrite-min-size参数来自动触发AOF重写。当AOF文件的大小超过指定百分比且超过指定大小时,Redis会自动启动AOF重写过程。

AOF重写的主要优点是可以减小AOF文件的大小,提高加载速度,并且生成的新AOF文件不包含过期的数据。但是,AOF重写会占用一定的CPU和内存资源,因此需要在考虑性能和磁盘空间之间进行权衡。

比较

命令 RDB AOF
启动优先级
体积
恢复速度
数据安全性 丢数据 根据策略决定
轻重

AOF持久化的优点:

  1. 数据安全性:AOF持久化记录了Redis服务器的写操作日志,可以通过重放AOF日志来恢复数据。因为每个写命令都会被追加到AOF文件中,即使在发生意外故障时,也可以最大程度地减少数据丢失。
  2. 可读性和可恢复性:AOF文件是一个文本文件,易于阅读和理解。可以通过检查AOF文件的内容,了解和分析Redis服务器的写操作历史。此外,AOF文件也可以用于数据恢复,可以手动编辑和修复文件中的错误。
  3. 灾难恢复和数据迁移:AOF持久化相对于RDB持久化更适合用于灾难恢复和数据迁移。AOF文件通常比RDB文件更小,加载速度更快,适用于快速恢复数据到Redis服务器。

AOF持久化的缺点:

  1. 文件体积较大:AOF文件通常比RDB文件更大,因为它记录了所有写操作的日志。这可能会导致占用更多的磁盘空间。
  2. 写入延迟:AOF持久化需要进行磁盘写入操作,包括 fsync或类似的操作。这可能引入写入延迟,影响Redis服务器的性能。
  3. 文件恢复时间:在发生故障后,使用AOF文件进行恢复可能需要更长的时间,因为需要重放较大的AOF日志。

RDB持久化的优点:

  1. 快速恢复:RDB持久化生成的快照文件是一个二进制文件,加载速度较快。在故障恢复时,可以更快地加载RDB文件来恢复数据。
  2. 较小的文件体积:RDB文件通常比AOF文件更小,因为它是在某个时间点上的数据库快照。这有助于减少磁盘空间的占用。
  3. 性能影响较小:RDB持久化过程使用了fork子进程,主进程不会被阻塞,对服务器的性能影响较小。

RDB持久化的缺点:

  1. 数据丢失风险:RDB持久化是周期性的,只有在满足指定条件时才会生成快照。如果在生成快照之间发生故障,可能会导致一定量的数据丢失。
  2. 不可读性:RDB文件是二进制格式,不易于直接阅读和理解。它们主要用于备份和恢复数据,而不是作为可读的操作日志。

在选择持久化方式时,需要根据具体的应用需求和场景进行权衡。AOF持久化提供了较好的数据安全性和可读性,适用于要求较高的数据一致性和恢复性的场景。RDB持久化具有较小的文件体积和较低的性能影响,适用于需要快速恢复和较小存储空间的场景。在某些情况下,也可以同时使用AOF和RDB持久化,以获得更好的数据安全性和性能