详解Redis持久化(1)

157 阅读6分钟

Redis是一个内存数据库,所以其运行效率非常高。但也存在一个问题:内存中的数据是不持久的,若主机宕机或Redis关机重启,则内存中的数据全部丢失。当然,这是不允许的。Redis具有持久化功能,其会按照设置以快照或操作日志的形式将数据持久化到磁盘。

根据持久化使用技术的不同,Redis的持久化分为两种:RDB与AOF。

1.持久化基本原理

image.png

Redis持久化也称为钝化,是指将内存中数据库的状态描述信息保存到磁盘中。只不过是不同的持久化技术,对数据的状态描述信息是不同的,生成的持久化文件也是不同的。但它们的作用都是相同的:避免数据意外丢失。

通过手动方式,或自动定时方式,或自动条件触发方式,将内存中数据库的状态描述信息写入到指定的持久化文件中。当系统重新启动时,自动加载持久化文件,并根据文件中数据库状态描述信息将数据恢复到内存中,这个数据恢复过程也称为激活。这个钝化与激活的过程就是Redis持久化的基本原理。

不过从以上分析可知,对于Redis单机状态下,无论是手动方式,还是定时方式或条件触发方式,都存在数据丢失问题:在尚未手动/自动保存时发生了Redis宕机状况,那么从上次保存到宕机期间产生的数据就会丢失。不同的持久化方式,其数据的丢失率也是不同的。

image.png

需要注意的是,RDB是默认持久化方式,但Redis允许RDB与AOF两种持久化技术同时开启,此时系统会使用AOF方式做持久化,即AOF持久化技术的优先级要更高。同样的道理,两种技术同时开启状态下,系统启动时若两种持久化文件同时存在,则优先加载AOF持久化文件。

2.RDB持久化

RDB,Redis DataBase,是指将内存中某一时刻的数据快照全量写入到指定的rdb文件的持久化技术。RDB持久化默认是开启的。当Redis启动时会自动读取RDB快照文件,将数据从硬盘载入到内存,以恢复Redis关机前的数据库状态。

2.1 持久化的执行

(1)手动save命令

image.png

通过在redis-cli客户端中执行save命令可立即进行一次持久化保存。save命令在执行期间会阻塞redis-server进程,直至持久化过程完毕。而在redis-server进程阻塞期间,Redis不能处理任何读写请求,无法对外提供服务。

(2)手动bgsave命令

image.png

通过在redis-cli客户端中执行bgsave命令可立即进行一次持久化保存。不同于save命令的是,正如该命令的名称一样,background save,后台运行save。bgsave命令会使服务器进程redis-server生成一个子进程,由该子进程负责完成保存过程。在子进程进行保存过程中,不会阻塞redis-server进程对客户端读写请求的处理。

(3)自动条件触发 自动条件触发的本质仍是bgsave命令的执行。只不过是用户通过在配置文件中做相应的设置后,Redis会根据设置信息自动调用bgsave命令执行。具体配置方式,后面会详解。

(4)查看持久化时间

通过lastsave命令可以查看最近一次执行持久化的时间,其返回的是一个Unix时间戳。

image.png

2.2 RDB优化配置

RDB相关的配置在redis.conf文件的SNAPSHOTTING部分。

image.png

(1) save

该配置用于设置快照的自动保存触发条件,即save point,保存点。该触发条件是在指定时间段内发生了指定次数的写操作。除非另有规定,默认情况下持久化条件为save 3600 1 300 100 60 10000。其等价于以下三条:

l save 3600 1     # 在3600秒(1小时)内发生1次写操作 l save 300 100    # 在300秒(5分钟)内发生100次写操作 l save 60 10000   # 在60秒(1分钟)内发生1万次写操作

如果不启用RDB持久化,只需设置save的参数为空串即可:save “”。

(2)stop-write-on-bgsave-error

image.png

默认情况下,如果RDB快照已启用(至少一个保存点),且最近的bgsave命令失败,Redis将停止接受写入。这样设置是为了让用户意识到数据没有正确地保存到磁盘上,否则很可能没有人会注意到,并会发生一些灾难。当然,如果bgsave命令后来可以正常工作了,Redis将自动允许再次写入。

(3)rdbcompression

image.png

当进行持久化时启用LZF压缩字符串对象。虽然压缩RDB文件会消耗系统资源,降低性能,但可大幅降低文件的大小,方便保存到磁盘,加速主从集群中从节点的数据同步。

(4)rdbchecksum

image.png

从RDB5开始,RDB文件的CRC64校验和就被放置在了文件末尾。这使格式更能抵抗RDB文件的损坏,但在保存和加载RDB文件时,性能会受到影响(约10%),因此可以设置为no禁用校验和以获得最大性能。在禁用校验和的情况下创建的RDB文件的校验和为零,这将告诉加载代码跳过校验检查。默认为yes,开启了校验功能。

(5)sanitize-dump-payload

image.png

该配置用于设置在加载RDB文件或进行持久化时是否开启对zipList、listPack等数据的全面安全检测。该检测可以降低命令处理时发生系统崩溃的可能。其可设置的值有三种选择:

no:不检测

yes:总是检测

clients:只有当客户端连接时检测。排除了加载RDB文件与进行持久化时的检测。

默认值本应该是clients,但其会影响Redis集群的工作,所以默认值为no,不检测。

(6)dbfilename

image.png

指定RDB文件的默认名称,默认为dump.rdb。

(7)rdb-del-sync-files

image.png

主从复制时,是否删除用于同步的从机上的RDB文件。默认是no,不删除。不过需要注意,只有当从机的RDB和AOF持久化功能都未开启时才生效。

(8)dir image.png

指定RDB与AOF文件的生成目录。默认为Redis安装根目录。