Redis持久化存储详解

?
为什么要做持久化存储?
持久化存储是将 Redis 存储在内存中的数据存储在硬盘中 , 实现数据的永久保存 。我们都知道 Redis 是一个基于内存的 nosql 数据库 , 内存存储很容易造成数据的丢失 , 因为当服务器关机等一些异常情况都会导致存储在内存中的数据丢失 。
持久化存储分类
在 Redis 中 , 持久化存储分为两种 。一种是 aof 日志追加的方式 , 另外一种是 rdb 数据快照的方式 。
RDB持久化存储
什么是RDB持久化存储
RDB持久化存储即是将redis存在内存中的数据以快照的形式保存在本地磁盘中 。
.RDB持久化存储分为自动备份和手动备份
1.手动备份通过 save 命令和命令 。save是同步阻塞 , 而是非阻塞(阻塞实际发生在 fork 的子进程中) 。因此 , 在我们实际过程中大多是使用命令实现备份.
redis> SAVEOK
redis> BGSAVEBackground saving started
2.自动备份 a.修改配置项 save m n即表示在 m 秒内执行了 n 次命令则进行备份. b.当Redis 从服务器项主服务器发送复制请求时 , 主服务器则会使用 命令生成 rbd 文件 , 然后传输给从服务器. c.当执行 debug命令时也会使用 save 命令生成rdb文件. d.当使用命令关掉服务时 , 如果没有启用 aof方式实现持久化则会采用的方式做持久化.同时后面可以加备份参数[|save].
bgsave持久化存储实现原理
1.执行命令 , Redis父进程判断当前是否存在正在执行的子进程 , 如果存在则直接返回. 2.父进程fork一个子进程(fork的过程中会造成阻塞的情况),这个过程可以使用info stats命令查看选项,查看最近一次fork操作小号的时间,单位是微妙. 3.父进程fork完之后,则会返回信息提示,此时fork阻塞解除. 4.fork出的子进程开始根据父进程内存数据生成临时的快照文件 , 然后替换原文件.使用命令可以查看最后一次生成rdb的时间 , 对应info的选项. 5.当备份完毕之后向父进程发送完成信息 , 具体可以见info 下的rbd_*选项.
RDB持久化的优势与劣势
优势: 1.文件实现的数据快照 , 全量备份 , 便于数据的传输.比如我们需要把A服务器上的备份文件传输到B服务器上面 , 直接将rdb文件拷贝即可. 2.文件采用压缩的二进制文件 , 当重启服务时加载数据文件 , 比aof方式更快. 劣势: 1.rbd采用加密的二进制格式存储文件 , 由于Redis各个版本之间的兼容性问题也导致rdb由版本兼容问题导致无法再其他的Redis版本中使用. 2.时效性差 , 容易造成数据的不完整性.因为rdb并不是实时备份 , 当某个时间段Redis服务出现异常 , 内存数据丢失 , 这段时间的数据是无法恢复的 , 因此易导致数据的丢失. RDB文件常见的处理方式 1.当遇到磁盘写满情况 , 可以使用如下命令来切换存储磁盘
// dirName则是新的存储目录名(该方式同样适用于aof格式)config set dir dirName
2.文件压缩处理 , 虽然对CPU具有消耗 , 但是减少体积的暂用 , 同时做文件传输(主从复制)也减少消耗.
// 修改压缩开启或关闭config set rdbcompression yes|no
3.rbd备份文件损坏检测.可以使用redis-check-rdb工具检测rdb文件,该工具默认在/usr/local/bin/目录下面.
【Redis持久化存储详解】[root@syncd redis-data]# /usr/local/bin/redis-check-rdb ./6379-rdb.rdb [offset 0] Checking RDB file ./6379-rdb.rdb[offset 26] AUX FIELD redis-ver = '5.0.3'[offset 40] AUX FIELD redis-bits = '64'[offset 52] AUX FIELD ctime = '1552061947'[offset 67] AUX FIELD used-mem = '852984'[offset 83] AUX FIELD aof-preamble = '0'[offset 85] Selecting DB ID 0[offset 105] Checksum OK[offset 105] \o/ RDB looks OK! \o/[info] 1 keys read[info] 0 expires[info] 0 already expired