[Redis]Redis持久化之RDB快照
Redis持久化之RDB快照
Redis是一个内存数据库管理系统。所谓的内存数据库,就是将数据库中的数据保存在内存当中。内存数据库的读写效率会比一般的数据库更快,但是一旦断电或者宕机,数据库中的数据就会全部丢失。
为了应对数据丢失的问题,Redis提供了将数据持久化到本地的功能,以便对数据进行备份。Redis支持两种形式的数据持久化,一种是RDB快照(snapshotting),另外一种是AOF(append-only-file)。本篇先对其中的RDB快照进行讲解。
简介
Redis创建快照时,会将某一时刻存在于内存中的数据保存到本地文件中。快照文件以.rdb后缀保存。
具体过程是:
Redis调用fork创建一个子进程。(父子进程共享内存,直至其中一个进程对内存进行了写操作)
子进程负责将数据写入一个临时文件,父进程则继续处理数据库读写请求。
完全写入成功后,调用rename将新的RDB文件替换原来的RDB文件。
通过Redis命令手动创建快照
Redis提供了两条命令用于手动创建快照。
BGSAVE
调用BGSAVE命令时,Redis会在后台异步地保存当前数据库中的数据。具体过程与上一节中提到的过程一样。调用SYNC命令时,如果主服务器没有在执行BGSAVE操作的话,会执行一次BGSAVE。
SAVE
调用SAVE命令时,Redis会执行同步保存,阻塞所有客户端,不再响应客户端发送的请求。SAVE命令一般来说只用于没有足够内存执行BGSAVE命令,或者对于等待保存占用的时间不敏感时才会使用。调用SHUTDOWN命令关闭服务器时也会先执行一次SAVE命令。
注:调用LASTSAVE命令可以查看最近一次将数据持久化到本地的时间,该命令返回一个UNIX时间戳。
通过配置文件设置自动保存快照
Redis的RDB快照配置项一共有六个。默认配置如下:
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
下面逐个讲解一下它们的作用。
save这一项后面需要加上两个数字,分别代表秒数和更改数。假如设置了save m n,就代表如果在经过m秒之后发生了至少n次更改,Redis就会自动执行一次BGSAVE命令。save配置项可以同时存在多个,如果save太过频繁,会影响到Redis的性能,频率太低则会增加数据丢失的风险,所以建议根据需要对save项进行配置。如果移除所有的save配置项或者加上一项save “”,则自动保存功能会被关闭。
默认情况下,如果后台保存出错了,Redis会停止接受写操作。如果后台的保存进程重新开始工作,Redis也会自动恢复接受写操作。这是一种比较简单粗暴的解决方式,通过这种方式可以显示地提醒维护者Redis出现了故障,但也会导致在故障被修复前Redis都没办法提供完整的服务。如果设置了stop-writes-on-bgsave-error为no,则Redis出问题的时候也可以照常工作,不过这就需要更细致地监控Redis服务器的变化。
rdbcompression配置项设置是否对RDB文件进行压缩。如果将rdbcompression设置为no的话RDB文件保存的速度会快一些,但是保存下来的文件也会相应地变大。Redis使用LZF压缩RDB文件。
rdbchecksum配置项控制Redis是否使用循环冗余检验。如果启用循环冗余检验,可以保证文件的完整性,但是进行文件保存和加载时会损失10%左右的性能,如果追求最大性能可以考虑把这一项关闭。Redis使用的是CRC64。
dbfilename配置RDB文件的名字。
dir配置RDB文件保存的路径。AOF产生的文件也会被保存到这个路径下面。
使用RDB快照进行持久化的优缺点
优点
通过合理的配置,可以让Redis每隔一段时间就保存一次数据库副本,也可以很方便地将数据还原到特定的时间点。
RDB文件相比AOF占用的空间更小,恢复数据的速度也更快。
如果创建RDB文件时出现了错误,Redis不会将它用于替换原来的文件,所以出错时不会影响到之前保存的版本。
缺点
如果硬件、系统、Redis三者其中之一出现问题而崩溃,Redis会丢失全部数据,保留下来的数据只有上一个时间点创建的快照。如果数据对于应用程序来说非常重要,那么出现错误时的损失会非常大。
fork子进程占用的内存随着数据库中数据的增加而增加,耗费的时间也会越来越多。
总结
RDB快照算是一种折中的数据持久化策略,比较适合那些对于一段时间内数据的损失不敏感的应用程序。Redis也提供了不少配置项用于配置快照的创建方式,用户可以根据自身需要调整配置,以达到自己想要的最佳效果。
另:Redis在Github上开源,里面一些用于创建快照的组件(CRC64、LZF压缩等)都可以在上面找到源码,如果有需要的可以直接利用起来。
关于Redis的另一种持久化策略AOF,请读者查看博主的另一篇博客Redis持久化之AOF。
参考资料:
https://github.com/antirez/redis
Redis命令参考
《Redis实战》(Redis IN ACTION) [美] Josiah L. Carlson