当前位置: 移动技术网 > IT编程>数据库>MongoDB > redis 系列16 持久化 RDB

redis 系列16 持久化 RDB

2018年11月23日  | 移动技术网IT编程  | 我要评论

魔脑传奇,丹田呼吸法,3dktv

一.概述

  redis是内存数据库,一旦服务器进程退出,服务器中的数据库内存数据状态也会消失。为了解决这个问题,redis提供了rdb 持久化功能,这个功能可以将redis在内存中的数据库状态保存到磁盘中,避免数据意外丢失。

  rdb持久化可以手动执行,也可以根据服务器配置选项定期执行,是在指定的时间间隔,对你的数据进行快照存储。该rdb文件快照是一个经过压缩的二进制文件。文件名为dump.rdb,该文件保存在redis目录下,当redis服务器停机后,只要rdb文件存在,下次重启redis服务时就会自动还原数据库数据状态。

 

  1.1 rdb文件的创建

    通过redis两个命令来生成rdb文件,一是save,另一个是bgsave。save命令是会阻塞redis服务器进程,直到rdb文件创建完毕为止,在阻塞期间,服务器不能处理任何命令请求。

    127.0.0.1:6379> save   -- 等待rdb文件创建完毕
    ok    

    与save不同,bgsave命令会派生出一个子进程,然后由子进程负责创建rdb文件,服务器进程(父进程)继续处理命令请求。当bgsave命令在执行期间,客户端再发送bgsave命令会被服务器拒绝,因为同时执行两个gbsave命令也会产生竞争条件。最后bgrewriteaof和gbsave两个命令也不能同时执行。

    127.0.0.1:6379> bgsave  --派生子进程,并由子进程创建rdb文件
    background saving started

  

  1.2 rdb文件载入

    和创建文件不同,rdb文件的载入是在服务器启动时自动执行的,并没有用于载入rdb文件的命令,只要redis服务器在启动时检测到rdb文件的存在,它就会自动载入rdb文件。能过启动时日志记录可以查看。需要注意的是,如果打开了aof持久化,那么服务器会优先使用aof文件来还原数据库状态。

  

  1.3 自动间隔性保存

    文件的创建除了save和gbsave保存rdb 文件,还可以通过配置save选项,让服务器每隔一段时间自动执行一次bgsave命令。可以配置save选项设置多个保存条件,只要任意一个条件被满足,服务器就会执行bgsave命令。

    --默认配置的save选项,保存方式有三种条件,满足任意一种就可以,如下:
    127.0.0.1:6379> config get save
    1) "save"
    2) "900 1 300 10 60 10000"

    (1) 服务器在900秒之内,对数据库进行了至少1次修改。

    (2) 服务器在300秒之内,对数据库进行了至少10次修改。

    (3) 服务器在60秒之内,对数据库进行了至少10000次修改。

  1.4 检查保存条件是否满足

    redis的服务器周期性操作默认每隔100毫秒就会检查执行一次,用于对正在运行的服务器进行维护,其中一项工作是检查save 选项所设置的保存条件是否已经满足,如果满足就调用bgsave命令。

 

  1.5  rdb工作方式

    当redis需要保存dump.rdb文件时,服务器执行以下操作:

    (1)redis调用forks. 同时拥有父进程和子进程。

    (2)子进程将数据集写入到一个临时 rdb 文件中。

    (3)当子进程完成对新 rdb 文件的写入时,redis用新 rdb 文件替换原来的 rdb 文件,并删除旧的 rdb 文件。

  

  1.6  rdb 文件结构

    下面简单了解一下rdb文件结构,这里不再深入了解。下面脚本显示了本机dump.rdb文件的位置。该rdb文件结构中各部分 如下图表格所示:

    [root@xuegod64 redis]# pwd
    /usr/local/redis
    [root@xuegod64 redis]# ls -l
    -rwxrwxrwx 1 root root    1687 11月 22 10:03 dump.rdb

文件结构各部份

描述

redis

rdb文件最开头是redis部分,保存五个字符,程序在载入文件时,快速检查所载入的文件是否是rdb文件

db_version

一个字符串表示的整数,4个字节,记录了rdb文件的版本号

databases

该部份包含着0个或任意多个数据库,以及各数据库中的键值对数据

eof

占1个字节,标志着rdb文件正文内容的结束,当程序遇到这个值的时候,就知道所有数据库的所有键值对都已经载入完毕了

check_sum

占8字节的无符号整数,保存一个校验和,通过前四部分内容进行计算得出。用来检查rdb文件是否出错或者损坏

    下面通过linux的od命令来查看redis服务器产生的rdb 文件,并指定-c参数可以以ascii编码方式打印信息。信息中能直接看到的信息是:第一部分是redis,  db_version部分是0008, eof部分是372 。

  

  1.7  rdb优势

    (1) rdb是一个非常紧凑的文件,它保存了某个时间点得数据集,非常适用于数据集的备份,比如你可以在每个小时报保存一下过去24小时内的数据,同时每天保存过去30天的数据,这样即使出了问题你也可以根据需求恢复到不同版本的数据集。

    (2)rdb是一个紧凑的单一文件,很方便传送到另一个远端数据中心,非常适用于灾难恢复。

    (3)rdb在保存rdb文件时父进程唯一需要做的就是fork出一个子进程,接下来的工作全部由子进程来做,父进程不需要再做其他io操作,所以rdb持久化方式可以最大化redis的性能。

    (4)与aof相比,在恢复大的数据集的时候,rdb方式会更快一些。

  

  1.8  rdb缺点

    (1)如果数据不允许任何丢失,那么rdb不适合(虽然可以配置不同的save时间点)。

    (2)经常fork子进程来保存数据集到硬盘上,当数据集比较大的时候,fork的过程是非常耗时的,可能会导致redis在一些毫秒级内不能响应客户端的请求。

 

二. rdb持久化测试

    (1) 首先关闭redis服务。当关闭服务时报错,首先检查一下是否是权限的问题,因为在shutdown命令的时候,会进行save操作,而save需要操作dump.rdb文件,如果没有权限则会报这个错。

    [root@xuegod64 redis]# redis-cli shutdown
    (error) err errors trying to shutdown. check logs
    -- 需要放开对dump.rdb文件的写入权限,服务关闭成功
    [root@xuegod64 redis]# redis-cli shutdown
    [root@xuegod64 redis]# redis-cli

    (2) 服务启动,首先set 写入一条数据,然后关闭服务进程。

    [hsr@xuegod64 redis]$ redis-serverredis.conf
    127.0.0.1:6379> set name "test"
    ok
    127.0.0.1:6379> get name
    "test"
    127.0.0.1:6379> exit
    [hsr@xuegod64 redis]$ redis-cli shutdown

    (3)重次重启服务,查看持久化

    查看刚才的键值对,发现键值对已存在,说明数据持久化保存到了磁盘中,原理是在关闭服务时,会先调用save操作,保存到dump.rdb文件中,在重启服务后,加载dump.rdb文件。

    [hsr@xuegod64 redis]$ redis-serverredis.conf
    [hsr@xuegod64 redis]$ redis-cli
    127.0.0.1:6379> get name
    "test"

   

  总结:作为rdb快照持久化,如果是正常关闭redis服务,再重启后数据是不会丢失的,但如果系统崩溃或者强杀,用户将会丢失最近一次生成快照之后更改的所有数据。

  

  

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网