设为首页 加入收藏

TOP

Redis持久化存储详解(一)(一)
2019-09-17 18:31:16 】 浏览:64
Tags:Redis 持久化 存储 详解

> 为什么要做持久化存储?

持久化存储是将 Redis 存储在内存中的数据存储在硬盘中,实现数据的永久保存。我们都知道 Redis 是一个基于内存的 nosql 数据库,内存存储很容易造成数据的丢失,因为当服务器关机等一些异常情况都会导致存储在内存中的数据丢失。
> 持久化存储分类

在 Redis 中,持久化存储分为两种。一种是 aof 日志追加的方式,另外一种是 rdb 数据快照的方式。
> RDB持久化存储

什么是RDB持久化存储
RDB持久化存储即是将redis存在内存中的数据以快照的形式保存在本地磁盘中。

.RDB持久化存储分为自动备份和手动备份
1.手动备份通过 save 命令和 bgsave 命令。save是同步阻塞,而 bgsave 是非阻塞(阻塞实际发生在 fork 的子进程中)。因此,在我们实际过程中大多是使用bgsave命令实现备份.
```shell
redis> SAVE
OK
```
```shell
redis> BGSAVE
Background saving started
```
2.自动备份
a.修改配置项 save m n即表示在 m 秒内执行了 n 次命令则进行备份.
b.当Redis 从服务器项主服务器发送复制请求时,主服务器则会使用 bgsave命令生成 rbd 文件,然后传输给从服务器.
c.当执行 debug reload 命令时也会使用 save 命令生成rdb文件.
d.当使用 shutdown 命令关掉服务时,如果没有启用 aof方式实现持久化则会采用bgsave的方式做持久化.同时shutdown后面可以加备份参数[nosave|save].

bgsave持久化存储实现原理
![图片描述](//img.mukewang.com/5c8518900001734506990490.png)
1.执行bgsave命令,Redis父进程判断当前是否存在正在执行的子进程,如果存在则直接返回.
2.父进程fork一个子进程(fork的过程中会造成阻塞的情况),这个过程可以使用info stats命令查看latest_fork_usec选项,查看最近一次fork操作小号的时间,单位是微妙.
3.父进程fork完之后,则会返回Background saving started信息提示,此时fork阻塞解除.
4.fork出的子进程开始根据父进程内存数据生成临时的快照文件,然后替换原文件.使用lastsave命令可以查看最后一次生成rdb的时间,对应info的rdb_last_save_time选项.
5.当备份完毕之后向父进程发送完成信息,具体可以见info Persistence下的rbd_*选项.

RDB持久化的优势与劣势
优势:
1.文件实现的数据快照,全量备份,便于数据的传输.比如我们需要把A服务器上的备份文件传输到B服务器上面,直接将rdb文件拷贝即可.
2.文件采用压缩的二进制文件,当重启服务时加载数据文件,比aof方式更快.
劣势:
1.rbd采用加密的二进制格式存储文件,由于Redis各个版本之间的兼容性问题也导致rdb由版本兼容问题导致无法再其他的Redis版本中使用.
2.时效性差,容易造成数据的不完整性.因为rdb并不是实时备份,当某个时间段Redis服务出现异常,内存数据丢失,这段时间的数据是无法恢复的,因此易导致数据的丢失.
RDB文件常见的处理方式
1.当遇到磁盘写满情况,可以使用如下命令来切换存储磁盘
```shell
// dirName则是新的存储目录名(该方式同样适用于aof格式)
config set dir dirName
```
2.文件压缩处理,虽然对CPU具有消耗,但是减少体积的暂用,同时做文件传输(主从复制)也减少消耗.
```shell
// 修改压缩开启或关闭
config set rdbcompression yes|no
```
3.rbd备份文件损坏检测.可以使用redis-check-rdb工具检测rdb文件,该工具默认在/usr/local/bin/目录下面.
```shell
[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
```
> AOF持久化存储

AOF持久化存储是什么
AOF持久化存储便是以日志的形式将redis存储在aof_buf缓冲区中的数据写入到磁盘中。简而言之,就是记录redis的操作日志,将redis执行过的命令记录下载,当我们需要数据恢复时,redis去重新执行一次日志文件中的命令.

如何配置持久化存储
```shell
// 将no改为yes,控制aof开启与否
appendonly no
// 控制aof文件名称,存储的目录便是dir配置项
appendfilename "appendonly.aof"
// 三种备份策略(三者只需要开启以一个即可)
# appendfsync always // 命令写入立即写入磁盘
appendfsync everysec // 每秒实现文件的同步,写入磁盘
# appendfsync no // 随机进行文件的同步,同步操作则交给操作系统来负责,通常时间是最长30s
```

AOF持久化存储实现原理
aof日志追加方式实现持久化存储,需要经历如下四个过程.命令写入->文件同步->文件重写->文件重载
![图片描述](//img.mukewang.com/5c8518cc00015eed06320525.png)
1.redis命令写入,此时会将redis命令写入aof_buf换从区.
2.缓冲区中数据根据备份策略实现写入日志文件.
3.当aof的文件越来越庞大,会根据我们的配置策略来实现aof的重写,实现文件的压缩,减少体积.
4.当redis重新启动时,在去重写加载aof文件,达到数据恢复的目的.

命令写入
命令写入主要是将文件执行过的命令写入到日志文件中.并且日志文件尊徐文本协议格式,下面示例代码便是aof日志文件中存储的内容格式.
```shell
*3\r\n$3\r\nset\r\n$5\r\nhello\r\n$5\r\nworld\r\n
```
aof采用的是文本协议格式。主要是原因根据资料提示,可以能使由于如下原因.
1.文本协议的兼容性好.前面我们提及到了rdb文件是进行二进制加密,可能不同版本之间会出现不兼容的情况,采用文本协议可以加避免该问题。同时文本协议也可以减少跨平台使用所带来的诸多问题.
2.可读性强.由于aof是将命令写入文件中,我们可以直接查看命令内容,同

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Mysql8 安装过程及安装过程系列问.. 下一篇navicat mysql 存储过程

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目