5-1 持久化的作用

什么是持久化?

Redis所有数据保存在内存中,而内存是易失的。Redis提供了持久化功能,可以把对数据的更新异步保存到磁盘上,从而提供数据恢复能力。

持久化的方式

  • 快照:Redis RDB。
  • 写日志:Redis AOF。

5-2 RDB

什么是RDB?

将内存中数据快照保存为磁盘上的二进制文件(RDB文件)。
在Redis启动时,会自动检测是否有RDB文件,如果有,则载入,并恢复数据。(需要注意,AOF文件的优先级高于RDB文件)
RDB文件的应用场景:

  • 灾害恢复
  • 主从复制

image.png

触发机制

如何创建RDB文件?

save命令

save
命令是同步的,执行时会阻塞其他所有命令的执行。
如果已经存在老的RDB文件,则会用新的文件替换老的文件。
时间复杂度O(N)。

bgsave命令

bgsave
命令是异步的,会fork一个子进程来负责生成RDB文件,主进程继续执行其他命令。
如果已经存在老的RDB文件,则会用新的文件替换老的文件。(与Save相同)
时间复杂度O(N)。(与Save相同)

自动生成

可以在配置文件中,条件自动生成RDB的触发时机配置,只要有一个满足,就会自动执行bgsave来生成RDB文件。例:

  1. # redis.conf
  2. save 900 1
  3. save 300 10
  4. save 60 10000

三条配置的含义分别是:

  • 服务器在 900 秒之内,对数据库进行了至少 1 次修改;
  • 服务器在 300 秒之内,对数据库进行了至少 10 次修改;
  • 服务器在 60 秒之内,对数据库进行了至少 10000 次修改;

    需要注意在实际场景中,自动生成不应太频繁。 教程中推荐不要使用自动生成RDB。

其他可能被忽略的触发实际

  • 主从复制时,“主”会自动生成RDB文件。
  • debug reload。redis提供的不清空内存的重启功能,也会自动生成RDB文件。
  • shutdown命令。默认会以同步的方式生成RDB文件,然后关闭。

    其他配置

    1. dbfilename dump.rdb # RDB文件的名称
    2. dir ./ # RDB文件的目录
    3. stop-writes-on-bgsave-error yes # 如果bgsave发生错误,是否立即停止写入。默认为yes。
    4. rdbcompression yes # rdb文件是否使用压缩格式。默认为yes
    5. rdbchecksum yes # 是否对rdb文件进行校验和检验。默认文yes。

5-3 AOF

RDB有什么问题?

  • 耗时、耗性能。
  • 不可控,容易丢失数据。在两次save之间如果发生宕机,则数据丢失。

    什么是AOF

    AOF通过记录所有修改数据库的命令,而非数据本身,来实现持久化。
    AOF持久化功能的实现可以分为命令追加、文件写入、文件同步三个步骤。

image.png
image.png

AOF的三种保存策略

当开AOF时,执行了一条命令之后,Redis会将该命令的记录追加到一个缓冲区中(而不是直接写入硬盘)。而缓存区中的数据什么时候才会写入硬盘呢?由以下三种保存策略决定。

always

每执行一个命令写入一次。

everysec(默认值)

每秒一次把缓冲区数据写入硬盘。

no

由操作系统自行决定什么时候该写入硬盘。

对比

image.png

AOF重写

原理

AOF采用文件追加的方式持久化数据,所以文件会越来越大,一方面会导致磁盘占用增大,另一方面会导致数据恢复缓慢。为了避免这种情况发生,增加了重写机制。
当AOF文件的大小超过了配置所设置的阈值时,Redis就会启动AOF文件压缩,只保留可以恢复数据的最小指令集,可以使用命令bgrewriteaof主动触发。注意这里的重写是基于现在内存中的数据生成新的AOF文件,而非先读取老的AOF文件,然后进行压缩。
image.png

使用方式

(1)主动:bgrewriteaof命令

异步执行。

(2)自动:配置

  • auto-aof-rewrite-min-size:AOF文件重写的尺寸阈值。
  • auto-aof-rewrite-percentage:AOF文件增长率阈值。

上面两个指标同时满足,才会触发AOF重写。

AOF配置

appendonly yes # 打开AOF功能
appendfilename # "append-${port}.aof"
appendfsync everysec # AOF保存策略
dir /bigdiskpath # 文件保存目录
no-appendfsync-on-rewrite yes # 在AOF重写时,是否暂停保存AOF文件。暂停有利于提高性能,但有丢数据的风险。
auto-aof-rewrite-min-size 64mb
auto-aof-rewrite-percentage 100

在交互模式下,可以使用config set appendonly yes进行动态配置。


5-4 RDB和AOF的选择

对比

image.png

RDB最佳策略

推荐关闭自动生成。

AOF最佳策略

推荐打开自动生成。
保存策略选择everysec。


5-5 开发运维常见问题

fork

虽然一些命令本身是异步的,但fork这个阶段还是同步的。
影响fork时间的因素:

  • 内存越大,fork越慢。
  • 机器本身的影响(物理机还是虚拟机)

redis中可以查看fork的执行时间:info:latest_fork_usec。

优化fork的手段:

  • 控制Redis实例最大可用内存:maxmemory
  • 有限使用物理机或者高效支持fork操作的虚拟化技术。
  • 合理配置Linux内存分配策略:vm.overcommit_memory=1。
  • 降低fork频率。

    子进程开销和优化

AOF追加阻塞