Redis的两种持久化方式

目录

一.RDB持久化

1.概述

2.Fork

3.RDB持久化机制的配置

4.如何触发RDB快照

5.如何恢复数据

6.如何停止RDB

7.RDB持久化的优点

8.RDB持久化的缺点

9.小总结

二.AOF持久化

1.概述

2.AOF持久化机制配置

3.AOF启动/修复/恢复

(1)正常恢复

(2)异常恢复

4.rewrite

(1)是什么?

(2)重写原理

(3)触发机制

5.AOF持久化的优点

6.AOF持久化的缺点

7.小总结


Redis的高性能是由于其将所有的数据都存储在了内存中,为了使Redis在重启之后仍然能保证数据不丢失,需要将数据存内存中同步到硬盘中,这一过程就是持久化。Redis支持两种方式的持久化,一种是RDB方式,一种是AOF方式。

一.RDB持久化

1.概述

在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里。

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

2.Fork

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

3.RDB持久化机制的配置

在redis.conf配置文件中有如下配置:

Redis的两种持久化方式

其中,上面配置的是RDB方式数据持久化时机:

Redis的两种持久化方式

4.如何触发RDB快照

1)上述配置文件中默认的快照配置

2)命令save或者是bgsave

save时只管保存,其它不管,全部阻塞

bgsave时,Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。可以通过lastsave命令获取最后一次成功执行快照的时间。

3)执行flushall命令,也会产生dump.rdb文件,但里面是空的,无意义

5.如何恢复数据

将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可

6.如何停止RDB

动态所有停止RDB保存规则的方法:redis-cli config set save ""

7.RDB持久化的优点

①一旦采用该方式,那么整个Redis数据库将只包含一个文件,这对于文件备份而言是非常完美的。

②对于灾难恢复而言,RDB是非常不错的选择。因为我们可以非常轻松的将一个单独的文件压缩后再转移到其它存储介质上。

③性能最大化。对于Redis而言,在开始持久化时,它唯一需要做的就是fork出子进程,由子进程完成这些持久化工作,可以极大的避免服务器进程执行IO操作。

8.RDB持久化的缺点

①系统一旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据都将丢失。

②由于RDB是通过frok子进程来协助完成数据持久化工作,因此,当数据集较大时,可以会导致整个服务器停止服务几百毫秒,甚至是1秒钟。

9.小总结

Redis的两种持久化方式

二.AOF持久化

1.概述

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

2.AOF持久化机制配置

(1)开启AOF持久化

Redis的两种持久化方式

将appendonly修改为yes,开启aof持久化机制,默认会在目录下产生一个appendonly.aof文件

(2)AOF持久化时机

Redis的两种持久化方式

上述配置为aof持久化的时机,解释如下:

Redis的两种持久化方式

3.AOF启动/修复/恢复

(1)正常恢复

①启动:修改默认的appendonly no,改为yes

②将有数据的aof文件复制一份保存到对应目录

③恢复:重启redis然后重新加载

(2)异常恢复

①启动:修改默认的appendonly no,改为yes

②备份被写坏的AOF文件

③修复:redis-check-aof --fix 文件 进行修复

④恢复:重启redis然后重新加载

4.rewrite

(1)是什么?

AOF采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制,

当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集.可以使用命令bgrewriteaof

(2)重写原理

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

(3)触发机制

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

5.AOF持久化的优点

①该机制可以带来更高的数据安全性,即数据持久性。Redis中提供了3中同步策略,即每秒同步、每修改同步和不同步。事实上,每秒同步也是异步完成的,其效率也是非常高的,但是一旦系统出现宕机现象,那么这一秒钟之内修改的数据将会丢失。

②由于该机制对日志文件的写入操作采用的是append模式,因此在写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在的内容。然而如果我们本次操作只是写入了一半数据就出现了系统崩溃问题,不用担心,在Redis下一次启动之前,我们可以通过redis-check-aof工具来帮助我们解决数据一致性的问题。

③如果日志过大,Redis可以自动启用rewrite机制。即Redis以append模式不断的将修改数据写入到老的磁盘文件中,同时Redis还会创建一个新的文件用于记录此期间有哪些修改命令被执行。因此在进行rewrite切换时可以更好的保证数据安全性。

④AOF包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作。事实上,我们也可以通过该文件完成数据的重建。

6.AOF持久化的缺点

①对于相同数量的数据集而言,AOF文件通常要大于RDB文件

②根据同步策略的不同,AOF在运行效率上往往会慢于RDB。总之,每秒同步策略的效率是比较高的,同步禁用策略的效率和RDB一样高效。

7.小总结

Redis的两种持久化方式