Redis (十三)——持久化之RDB

一、Redis持久化概述

持久化的功能:Redis是分布式内存数据库,数据都是存储在内存中,为了避免进程退出导致数据的永久丢失,需要定期将Redis中的数据以某种形式(数据或命令)从内存保存到硬盘;当下次Redis重启时,利用持久化文件实现数据恢复。除此之外,为了进行灾难备份,可以将持久化文件拷贝到一个远程位置。

Redis持久化分为RDB持久化和AOF持久化:前者将当前数据保存到硬盘,后者则是将每次执行的写命令保存到硬盘(类似于MySQL的binlog);由于AOF持久化的实时性更好,即当进程意外退出时丢失的数据更少,因此AOF是目前主流的持久化方式,不过RDB持久化仍然有其用武之地。

接下来首先介绍RDB持久化。

二、RDB持久化

1、RDB简介

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

简单来说:RDB是Redis用来进行持久化的一种方式,是把当前内存中的数据集快照写入磁盘,也就是 Snapshot 快照(数据库中所有键值对数据)。恢复时是将快照文件直接读到内存里。

2、Fork的理解

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

3、RDB文件

RDB文件是经过压缩的二进制文件,RDB保存的是dump.rdb文件。

RDB配置文件的位置,打开redis.conf:

################################ SNAPSHOTTING  ################################
#
# Save the DB on disk:
#
#   save <seconds> <changes>
#
#   Will save the DB if both the given number of seconds and the given
#   number of write operations against the DB occurred.
#
#   In the example below the behaviour will be to save:
#   after 900 sec (15 min) if at least 1 key changed
#   after 300 sec (5 min) if at least 10 keys changed
#   after 60 sec if at least 10000 keys changed
#
#   Note: you can disable saving completely by commenting out all "save" lines.
#
#   It is also possible to remove all the previously configured save
#   points by adding a save directive with a single empty string argument
#   like in the following example:
#
#   save ""

save 900 1
save 300 10
save 60 10000

通过配置文件我们知道,Redis触发RDB保存的条件三者只要满足其一就会自动触发,默认是如下配置

save 900 1:表示900 秒(15分钟)内如果至少有 1 个 key 的值变化,则保存
save 300 10:表示300 秒(5分钟)内如果至少有 10 个 key 的值变化,则保存
save 60 10000:表示60 秒内如果至少有 10000 个 key 的值变化,则保存
4、存储路径

RDB文件的存储路径既可以在启动前配置,也可以通过命令动态设定。
配置:dir配置指定目录,dbfilename指定文件名。默认是Redis根目录下的dump.rdb文件。
动态设定:Redis启动后也可以动态修改RDB存储路径,在磁盘损害或空间不足时非常有用;执行命令为config set dir {newdir}和config set dbfilename {newFileName}

这里指定了目录:
在这里插入图片描述
名称采用默认的:
在这里插入图片描述

5、模拟RDB的过程

首先为了方便测试,将RDB配置做一下修改:
在这里插入图片描述
设置为:120 秒(2分钟)内如果至少有 2个 key 的值变化,则保存,SHUTDOWN服务,然后重启redis服务。
/usr/local/bin目录下:
在这里插入图片描述
然后我们在redis中两分钟之内添加超过2个key值,触发RDB
在这里插入图片描述
可以看到目录下已经多了个rdb文件:
在这里插入图片描述
然后我们再添加介个key值,继续触发RDB条件,可以看到dump.rdb文件又更新了:
在这里插入图片描述

6、模拟RDB容灾备份

我们都知道,为了安全起见,容灾备份文件肯定是放置在另外一台远程服务器上的,这样可以避免在本机上发生一些突发事件,无法恢复,备份文件通过程序或者脚本实时更新,保证数据一致性,在需要恢复的时候将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可读取里面的数据。

这里我们就模拟一下备份文件的恢复,复制一份dump_cp.rdb文件:
在这里插入图片描述
此时数据中的数据两个文件中是一致的:
在这里插入图片描述
这时候我们模拟发生一些突发情况,数据丢失或者是Redis服务终止:
在这里插入图片描述
当我们重启服务的RDB文件的载入工作是在服务器启动时自动执行的,加载我们配置路径下的dump.rdb文件,此时我们的文件虽然是存在的,但是里面的数据是空的:

在这里插入图片描述
这时候我们的容灾备份就派到用处了,将远程机器上备份好的数据复制到dump.rdb中,
在这里插入图片描述
然后重启服务,keys *,发现数据已恢复:
在这里插入图片描述
特别注意:在模拟的过程中也出现了数据丢失的情况,不是刻意为之但是确实暴露出了RDB的劣势,就是:
在一定间隔时间做一次备份,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改(数据有丢失)。经过应该是这样的,我在copy备份的时候dump.rdb文件应该是刷新时间还没到,文件还没有更新就复制了,导致了数据丢失。

7、触发方式

RDB 有两种触发方式,分别是自动触发和手动触发。

1、自动触发

(1)、save: 在 redis.conf 配置文件中的 SNAPSHOTTING 下,我们通过save来配置触发条件,默认的触发条:

save 900 1:表示900 秒内如果至少有 1 个 key 的值变化,则保存
save 300 10:表示300 秒内如果至少有 10 个 key 的值变化,则保存
save 60 10000:表示60 秒内如果至少有 10000 个 key 的值变化,则保存

(2)、stop-writes-on-bgsave-error :默认值为yes。当启用了RDB且最后一次后台保存数据失败,Redis是否停止接收数据。这会让用户意识到数据没有正确持久化到磁盘上,否则没有人会注意到灾难(disaster)发生了。如果Redis重启了,那么又可以重新开始接收数据了。

(3)、rdbcompression ;默认值是yes。对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis会采用LZF算法进行压缩。如果你不想消耗CPU来进行压缩的话,可以设置为关闭此功能,但是存储在磁盘上的快照会比较大。
(4)、rdbchecksum :默认值是yes。在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。
(5)、dbfilename :设置快照的文件名,默认是 dump.rdb。
(6)、dir:设置快照文件的存放路径,这个配置项一定是个目录,而不能是文件名。默认是和当前配置文件保存在同一目录。

也就是说通过在配置文件中配置的 save 方式,当实际操作满足该配置形式时就会进行 RDB 持久化,将当前的内存快照保存在 dir 配置的目录中,文件名由配。

2、手动触发

手动触发Redis进行RDB即刻持久化的命令有三种:
(1)、save 
该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止。
显然该命令对于内存比较大的实例会造成长时间阻塞,这是致命的缺陷,为了解决此问题,Redis提供了第二种方式。
在这里插入图片描述
可以看到dump.rdb 文件立刻更新了。

(2)、bgsave
执行该命令时,Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。具体操作是Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短。
基本上 Redis 内部所有的RDB操作都是采用 bgsave 命令。

(3)、flushall
执行执行 flushall 命令,也会产生dump.rdb文件,但里面是空的,持久化也没有意义。

8、停止持久化

有些情况下,我们只想利用Redis的缓存功能,并不像使用 Redis 的持久化功能,那么这时候我们最好停掉 RDB 持久化。可以通过上面讲的在配置文件 redis.conf 中,可以注释掉所有的 save 行来停用保存功能或者直接一个空字符串来实现停用:save “”。

也可以通过命令:

redis-cli config set save ""
9、RDB 的优势和劣势

①、优势

1.RDB是一个非常紧凑(compact)的文件,它保存了redis 在某个时间点上的数据集。这种文件非常适合用于进行备份和灾难恢复。

2.生成RDB文件的时候,redis主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO操作。

3.RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。对数据完整性和一致性要求不高时使用。

②、劣势

1、RDB方式数据没办法做到实时持久化/秒级持久化。因为bgsave每次运行都要执行fork操作创建子进程,属于重量级操作(内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑),频繁执行成本过高(影响性能)

2、RDB文件使用特定二进制格式保存,Redis版本演进过程中有多个格式的RDB版本,存在老版本Redis服务无法兼容新版RDB格式的问题(版本不兼容)

3、在一定间隔时间做一次备份,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改(数据有丢失)

10、小总结

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值