1、RDB(Redis DataBase)

1.1 是什么

在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是所谓的 snapshot 快照,它恢复时是将快照文件直接读到内存里。
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件 替换上次持久化好的文件。
整个过程中,主进程是不进行任何 IO 操作的,这就确保了极高的性能。
如果需要进行大规模的数据恢复,且对于数据恢复的完整性不是非常敏感,那 RDB 方式要比 AOF 方式更加高效。RDB 的缺点是最后一次持久化后的数据可能丢失。

1.2 fork

fork 的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量,环境变量,程序计数器等)数值都和原进程一致,但是是一个 全新的进程,并作为原进程的子进程。

1.3 保存位置

默认文件名:dump.rdb,保存在 dir 指定的目录下

1
2
dbfilename dump.rdb
dir ./

1.4 配置位置

默认配置

1
2
3
save 900 1 # 15分钟改了1次
save 300 10 # 5分钟改了10次
save 60 10000   # 1分钟1万次

1.5 如何触发 RDB 快照

1.5.1、配置文件中默认的快照配置
1.5.2、命令 save 或者 bgsave,两者的区别
①、save 时只管保存,其他不管,全部阻塞
②、bgsave,Redis会在后台异步进行快照操作,此时 redis 还可以响应客户端请求。可以通过 lastsave 命令获取最后一次执行成功快照的时间。
③、执行 flushall 命令,也会产生 dump.rdb文件,但是文件里是空的,没有意义。

1.6 如何恢复

将备份文件 dump.rdb移动到redis 安装目录并启动服务即可,可以通过命令config get dir获取具体的目录。

1.7 优势

1、适合大规模的数据恢复
2、对数据一致性和完整性要求不高

1.8 劣势

1、在一定间隔时间内做一次备份,所以如果 redis 意外 down 掉的话,就会丢失最后一次快照后的所有修改。
2、fork 的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑。

1.9 如何停止

1
redis-cli config set save ""

1.10 小总结

image-20200316163435676

优点 缺点
RDB 是一个非常紧凑的文件 数据丢失风险大
RDB 在保存 RDB 文件时父进程唯一需要做的就是 fork出一个子进程,接下来的工作全部交由子进程来做,父进程不需要做其他 IO 操作,所以 RDB 持久化方式可以最大化 Redis 的性能 RDB 需要经常 fork 子进程来保存数据集到硬盘上,当数据集比较大的时候,fork 的过程是非常耗时的,可能会导致 Redis 在一些毫秒级不能响应客户端请求
与 AOF 相比,在恢复大的数据集的时候,RDB方式更快一些

2、AOF(Append Only File)

2.1 是什么

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

2.2 保存位置

1
2
appendonly no  # 默认是关闭的,需要改为 yes 来开启
appendfilename "appendonly.aof"

2.3 基本配置

1
2
3
4
5
6
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec 
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

2.3.1 appendonly

是否开启 aof,默认时 no,改为 yes 表示开启

2.3.2 appendfilename

保存的文件名称,默认为appendonly.aof

2.3.3 appendfsync

同步策略,有三种方式,分别是
1、always:同步持久化,每次发生数据变更会被立即记录到磁盘,性能较差,但数据完整性比较好
2、everysec:默认推荐,异步操作,每秒记录,如果1秒内宕机,有数据丢失
3、no:不保存

2.3.4 no-appendfsync-on-rewrite

重写时是否可以运用Appendfsync,用默认的 no 即可,保证数据安全性

2.3.5 auto-aof-rewrite-percentage

设置重写的基准值

2.3.6 auto-aof-rewrite-min-size

设置重写基准值,跟上面的配合使用

2.4 aof 启动/修复/恢复

2.4.1 正常恢复

①、修改默认的 appendonly no 改为 yes
②、将有数据的 aof 文件复制一份保存到对应的目录(config get dir)
③、重启 redis 重新加载

2.4.2 异常恢复

①、启动时设置为 yes
②、备份被写坏的 aof 文件
③、修复:redis-check-aof --fix appendonly.aof进行修复
④、恢复:重启 redis 重新加载

2.5 Rewrite

2.5.1 是什么

aof 采用文件追加方式,文件会越来越大,为了避免出现这种情况,新增了重写机制,当 aof 文件的大小超过配置文件设定的阈值时,Redis就会启动 aof 文件的内容压缩,只保留可以恢复数据的最小指令集,可以使用命令 bgrewriteaof

2.5.2 重写原理

aof 文件持续增大而过大时,会 fork 出一个新进程来将文件重写(也就是先写临时文件,最后再 rename),遍历新进程的内存中数据,每条记录有一条的 set 语句。重写 aof 文件的操作,并没有读取旧的 aof 文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的 aof 文件,这点和快照类似。

2.5.3 触发机制

Redis会记录上次重写时的 aof 文件大小,默认配置是当 aof 文件大小是上次 rewrite 后大小的一倍且文件大于64M 时触发

1
2
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

2.6 优势

2.6.1、每次修改同步:appendfsync always,同步持久化,每次发生数据变更都会被立即记录到磁盘,性能较差,但数据完整性比较好
2.6.2、每秒同步:appendfsync everysec,异步操作,每秒记录,如果一秒内宕机,有数据丢失
2.6.3、不同步:appendfsync no,从不同步

2.7 劣势

2.7.1、相同数据集的数据而言,aof 文件要远大于 rdb 文件,恢复速度慢于 rdb
2.7.2、aof 运行效率慢于 rdb,每秒同步策略效率较好,不同步效率和 rdb 相同

2.8 小总结

image-20200316174926951

有点 缺点
aof 文件是一个只进行追加的日志文件 对于相同的数据集来说,aof 文件的体积通常要大于rdb 文件的体积
Redis 可以在 aof 文件体积变得过大时,自动在后台对 aof 进行重新 根据使用的 fsync 策略,aof 的速度可能会慢于 rdb
aof 文件有序的保存了对数据库执行的所有写入操作,这些写入操作以 redis 协议的格式保存,因此 aof 文件的内容非常容易读懂,对文件进行分析也很轻松

3、总结

3.1、RDB 持久化方式能够在指定的时间间隔对你的数据进行快照存储
3.2、AOF 持久化方式记录每次对服务器的写操作,当服务重启的时候会重新执行这些命令来恢复原始的数据,AOF 命令以 Redis协议追加保存每次写的操作到文件末尾
3.3、Redis 还能对 AOF 文件进行后台重写,使得 AOF 文件的体积不至于过大
3.4、如果 Reids 只是用来当做缓存,也可以不使用任何持久化方式
3.5、同时开启两种持久化方式

1
2
3
4
5
Redis 重启时会优先载入 AOF 文件来恢复原始的数据,因为在通常情况下,AOF 文件保存的数据要比 
RDB 保存的数据完整。
RDB 的数据不实时,同时使用两者服务器重启也只会找 AOF 文件。
RDB 更适合用于备份数据库,AOF 在不断的变化不好备份。
快速重启,而且不会有 AOF 可能潜在的 bug,留着作为一个万一的手段。

4、一些命令

①、启动时指定配置文件

1
redis-server /home/servers/redis/redis.conf

②、修复 aof 文件

1
redis-check-aof --fix appendonly.aof

③、修复 rdb 文件

1
redis-check-rdb 0  # 0时要修复的库的编号

④、获取配置信息

1
2
3
127.0.0.1:6379> config get appendonly
1) "appendonly"
2) "yes"

参考文档