开发者学堂课程【Redis 数据库入门:Redis_AOF_RDB 持久化_1】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/15/detail/55
Redis_AOF_RDB 持久化_1
内容介绍:
一、概述
二、RDB 持久化
Redis 作为一类数据库,其数据是存储在内存里,必定需要具有持久化的特点,本节课学习的内容是 Redis 持久化。
一、概述
1、定义
Redis 持久化(persistence)是指将数据从掉电易失的内存放到永久存储的设备上面,简单来说就是将数据落到磁盘。
2、需要持久化的原因
Redis 需要持久化的原因十分简单,Redis 数据库所有的数据都在内存里面,一旦掉电了,或服务器宕机,数据就会丢失。据此推论,提出以下三种假设:
(1)如果将 Redis 作为缓存服务器,需要持久化吗?
如果将 Redis 作为缓存服务器是否需要持久化应视情况而定,如果对Redis不做持久化处理,你数据如果作为缓存服务器的 Redis 宕机,则相当于所有的数据请求压力将直接全部由 Web 服务器负载。此时若数据请求量很大,Web 服务器是否能承受如此大的负荷是一个难题。若较长期处于该种状态,Web 服务器很容易崩溃,也就是出缓存穿透问题。故而在这种数据请求量较大的情况下,最好对 Redis 做持久化处理,当 Redis 缓存服务器重启时,缓存不会丢失。反之,则会导致缓存穿透,Web 服务器崩溃。
(2)如果将 Redis 作为内存数据库,需要持久化吗?
如果将真正的数据,如业务数据等存到 Redis 数据库中,则此时必须对 Redis 做持久化处理。
(3)如果将 Redis 作为消息队列,需要持久化吗?
同样要视情况而定,若是一些不重要的消息,则可以不对其做持久化处理,若是重要的消息,最好进行持久化处理。
3、持有化的方式
Redis 持久化的方式包括一下两种:
(1)RDB(Redis DB)
该种持久化的方式是将真正的数据存储到磁盘里,其中存储的是真正的数据。
(2)AOF(Append Only File)
Append 是“追加”的意思,也就是说该种持久化的方式是将对数据的操作的命令追加到文件重,其中存储的数据是一条条执行的命令。
总之,两种持久化的方式中,存储的数据内容不同,前者存储的是真实的数据,贰后者存储的是执行的命令。在默认情况下,AOF 是不开启的,在配置文件里面中显示“no”,而 RDB 是开启的其实开启的。
4、总结
(1)因为 Redis 服务器将数据存储在内存中,而一旦服务器被关闭,或者运行服务器的主机被关闭时,数据就回丢失;
(2)如果仅仅将 Redis 作为缓存服务器,数据丢失的带来问题的不是很大,当然也要视情况而论。在一般情况下,只需要重启机器,再次将数据放到缓存里即可。而如果在重启机器,再重新加载数据,将其重新放到缓存里时,所用的时间较短,则这种方式不会存在太大问题,若该过程需要很长的时间,则容易导致缓存穿透,在这种情况下将 Redis 用作数据库,导致的数据丢失则会影响较大;
(3)为了在 Redis 服务器关闭时,仍然保留数据库中数据,Redis 提供了 RDB 和AOF 两种持久化功能,两者都是以文件形式将数据保存到硬盘中。因此,当进行过持久化处理后,即使服务器关闭,已经保存在硬盘里的数据也不会丢失。
(4)除此之外,服务器也可以在重启的时候呢,通过载入持久化文件还原服务器关闭之前的数据以进行数据恢复。这种持久化的数据,甚至可以将其转移到其他的机器中,或者将其上传到磁盘文件中。
二、RDB 持久化
1、功能
RDB 持久化可以将服务器包含的所有数据库中的数据以二进制文件的形式保存在硬盘中,而二进制的文件形式比较节省空间。通过 RDB 持久化之后,在硬盘中创建新的以 rdb 为后缀的文件,如上节课在配置文件中看到的 dump.rdb,这个是默认文件名称。
服务器启动时,会再次载入 RDB 文件,服务器可以根据 RDB 文件的内容,还原服务器原有数据库的情况。
2、创建 RDB 文件的方式
(1)最常见的形式
在 Redis 服务器中创建二进制 RDB 文件有多种方式,以下三种是最常见的方式:
①服务器执行客户端发送的 SAVE 命令。通过 SAVE 命令直接创建 RDB 文件;
②服务器执行客户端发送的 BGSAVE 命令。从其名称分析,BG 是 background 的缩写,而 background 是“后台”的意思,也就是在后台创建 RDB 文件。换言之,直接 SAVE 命令会阻塞当前的服务,而执行 BGSAVE 命令不会阻塞当前的服务,因此从这一点看,后者更好,因为一般情况下,用户不希望阻塞当前的服务状态,如果用户或者数据库本身在空闲的情况下,直接执行 SAVE 命令也没有问题,但如果在较忙情况下,则可以通过 BGSAVE 命令来创建。
③在配置文件中设定条件,使用 save 配置选项设置的自动保存条件被满足,服务器会自动执行 BGSAVE 命令自动创建 RDB 文件。这种方法最常用的,因为前两种方式需要用户手动执行,第三种则是自动执行,一般情况下,用户不会选择手动创建 RDB 文件,而采用根据配置条件自动创建。而自动创建的方式中其实使用的是BGSAVE 命令在后台执行。
(2)各种方式的不同之处
前两种需要用户手动执行来创建 RDB 文件,也就是通过用户手动发送 SAVE 命令或BGSAVE 命令,创建 RDB 文件。
①在客户端当前输入 SAVE:
redis > SAVE
a.在执行 SAVE 命令时,redis 服务器将会被阻塞,无法处理客户端发送的命令请求,只有 SAVE 命令执行结束之后(或 RDB 文件创建完毕后),服务器才会重新开始处理客户端发送的请求。
b.如果 RDB 文件已经存在,那么服务器将自动使用新的 RDB 文件去代替旧的 RDB文件。之前我们提到过会生成 dump.rdb,在下一时刻如果满足了设置的条件或者人工输了 SAVE 命令或 BGSAVE 命令,即会生成新的 dump.rdb 覆盖掉之前的 RDB文件。
为保留原本的 dump.rdb 文件,可以在任务框中写入定时任务,定期的之前的dump.rdb 转移。如某人创建了 flashdb,紧接输入了 save,就会创建一个新的RDB,那么之前的数据就无法恢复。所以,在实际操作过程中,可以在 contable中写入任务,定时将其转移,以转移的时刻为名称,则可根据恢复数据的需要将某个特定时刻的 dump 传回,再重启服务器,即可恢复数据。
在客户端输入 SAVE 后,Redis 服务器会被阻塞,继而创建二进制的 RDB 文件,如下图所示:
②在客户端输入 BGSAVE 命令
该命令同样可以创建 RDB 文件,但区别在于不会造成 redis 服务器阻塞,其原理如下图所示:
客户端发出保存数据的命令,Redis 服务器返回“OK”。
实际上在返回“OK”之后,Redis 服务器会紧接着fork一个
子进程,转而由子进程创建 RDB 文件,而真正的 redis 服务器仍旧会提供读写服务并不会被阻塞。而子进程在创建完 RDB 文件后,再返回到 Redis 服务器“RDB创建完成”的信息。
但是对于客户来说,当写入 BGSAVE 后,就直接进行了创建 RDB 的过程。这个文件会写入到 etc/redis/6379.conf,这是服务之后配置文件的所在路径。输入vim/etc/redis/6379.conf 即可查询其配置文件,可以从中找到关于 RDB 的部分。找到其中 save the DB on the disk,其中包括 save,seconds,changes,
下面会显示:
save 900 1
save 300 10
save 60 10000
这三行数据分别指三种持久化的方式,即 SAVE、BGSAVE 及在配置文件中写入条件,前两种为手动,第三种为自动,条件会在后面介绍。文件中还显示rdb compression yes,rdb checksum yes 也就是在配置过程中还会作压缩和检查,落地的文件名称显示为 rdb file name dump.rdb,当然文件名称可以修改,文件的存储路径显示为 var/lib/redis/6379。
将其拷贝之后查询,可以看到的当下(课程中为15:45)转移的 RDB 文件,是15:45因为满足了刚才配置文件里面条件,因此创建了 RDB 文件。
当然,也可以手动 SAVE,输入 redis>save,由于当下服务器中文件较少,因此保存的速度很快。该过程中实际上发生了阻塞,压缩检查后显示“OK”。退出后再次查询即可看到刚生成的文件。
BGSAVE 也与之相同,会 fork 子进程来完成该项工作,显示为“Background saving started”,说明子进程开始工作,但可以继续进行查询等功能。创建完成后回生成新的RDB文件,如课程中显示为16:27,即表示在16:27创建了该文件。在配置文件中也可以查询到,其中显示为logfile/var/log/redis_6379.log,即为日志配置的路径,logfail 里面有他。
在服务器中查询服务器启动时的日志,其种最后一行代码中显示:
在16:27,“Background saving terminated with success”,
说明在16:27时该文件存储完毕;同时在16:26时显示“DB
saved on disk”;在15:45时也同样自动进行了“Background
saving terminated with success”操作。当然根据定时任务,前
面也进行了多次同样的操作。
同时,日志文件中也可以显示每次保存的文件大小,格式为 RDB:6MB of memory by copy-on-write,也就是说该次自动保存过程中保存了六兆的。这 6MB 的文件中包含有额外信息,可以检查日志进行检索。