1.6(redis)持久化

Redis持久化

redis作为缓存数据库,主要的数据都是在缓存中。

所以性能才比关系型数据库的高。

但是为了数据的更多安全性,也是需要进行持久化的

Redis提供了2个不同形式的持久化方式

  1. RDB(Redis DataBase)
  2. AOF(Append Of File)

RDB(Redis DataBase)

在指定的时间间隔内将内存中的数据集快照写入磁盘

也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里

如何执行

Redis会单独创建(fork)一个子进程来进行持久化

会先将数据写入到 一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。

整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能

如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感

那RDB方式要比AOF方式更加的高效。RDB 的缺点是最后一次持久化后的数据可能丢失。

Fork

Fork的作用是复制一个与当前进程一样的进程

新进程的所有数据(变量、环境变量、程序计数器等) 数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程

在Linux程序中,fork()会产生一个和父进程完全相同的子进程,

但子进程在此后多会exec系统调用

出于效率考虑,Linux中引入了“写时复制技术

一般情况父进程和子进程会共用同一段物理内存

只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。

RDB执行流程

在这里插入图片描述

默认的RDB配置

找到SNAPSHOTTING

在这里插入图片描述

dump.rdb文件

在redis.conf中配置文件名称,默认为dump.rdb

也就是在启动redis的时候生成的一个文件

在这里插入图片描述

文件位置

rdb文件的保存路径,也可以修改。

默认为Redis启动时命令行所在的目录下

在这里插入图片描述

关闭写入硬盘

在这里插入图片描述

当Redis无法写入磁盘的话,直接关掉Redis的写操作。推荐yes.

rdbcompression压缩文件

在这里插入图片描述

对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis会采用LZF算法进行压缩。

如果你不想消耗CPU来进行压缩的话,可以设置为关闭此功能。推荐yes.

rdbchecksum检查完整性

在这里插入图片描述

在存储快照后,还可以让redis使用CRC64算法来进行数据校验,

但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能

推荐yes.

在这里插入图片描述

flushall命令

执行flushall命令,也会产生dump.rdb文件,但里面是空的,无意义

Save

在这里插入图片描述

在这里插入图片描述

save :save时只管保存,其它不管,全部阻塞。手动保存。不建议。

bgsave:Redis会在后台异步进行快照操作, 快照同时还可以响应客户端请求。

可以通过lastsave 命令获取最后一次成功执行快照的时间

格式:save 秒钟 写操作次数

RDB是整个内存的压缩过的Snapshot,RDB的数据结构,可以配置复合的快照触发条件

默认是

1分钟内改了1万次

或5分钟内改了10次

或15分钟内改了1次。

当满足条件之后,进行持久化操作

禁用

不设置save指令,或者给save传入空字符串

测试

我们先通过在redis.conf文件中配置

20秒内添加3条数据就进行持久化

在这里插入图片描述

首先观察dump.rdb文件

在这里插入图片描述

向文件中20秒内 添加3条数据触发持久化

直接终端redis的进程

再次打开文件。查看keys *

在这里插入图片描述

可以看到dump.rdb文件发生变化

发现没有持久化的数据就会丢失

在这里插入图片描述

RDB小结

在这里插入图片描述

优势

  1. 适合大规模的数据恢复
  2. 对数据完整性和一致性要求不高更适合使用
  3. 节省磁盘空间
  4. 恢复速度快

劣势

Fork的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑

虽然Redis在fork时使用了写时拷贝技术,但是如果数据庞大时还是比较消耗性能。

在备份周期在一定间隔时间做一次备份,所以如果Redis意外down掉的话,就会丢失最后一次快照后的所有修改。

动态停止RDB:

redis-cli config set save “”

#save后给空值,表示禁用保存策略

AOF(Append Only File)

日志的形式来记录每个写操作(增量保存)

将Redis执行过的所有写指令记录下来(读操作不记录), 只许追加文件但不可以改写文件

redis启动之初会读取该文件重新构建数据

换言之,redis 重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作

AOF执行流程

客户端的请求写命令会被append追加到AOF缓冲区内;

AOF缓冲区根据AOF持久化策略[always,everysec,no]将操作sync同步到磁盘的AOF文件中;

AOF文件大小超过重写策略或手动重写时,会对AOF文件rewrite重写,压缩AOF文件容量;

Redis服务重启时,会重新load加载AOF文件中的写操作达到数据恢复的目的;

开启AOF

Aof默认是不开启的

可以在redis.conf中配置文件名称,默认为 appendonly.aof

AOF文件的保存路径,同RDB的路径一致。

AOF和RDB同时开启redis听谁的?

AOF和RDB同时开启,系统默认取AOF的数据(数据不会存在丢失)

示例

配置文件开启AOF

在这里插入图片描述

将no改成yes

在这里插入图片描述

启动redis查看是否生成文件

此时生成一个appendonly.aof文件生成,但是文件大小为0

数据也全部没有了。

因为在AOF和RDB同时存在,加载的是AOF文件

在这里插入图片描述

AOF文件修护

  1. 修改默认的appendonly no,改为yes
  2. 如遇到AOF文件损坏**,通过/usr/local/bin/redis-check-aof–fix appendonly.aof进行恢复
  3. 备份被写坏的AOF文件
  4. 恢复:重启redis,然后重新加载

AOF的其他配置

appendfsync always

始终同步,每次Redis的写入都会立刻记入日志;性能较差但数据完整性比较好

appendfsync everysec

每秒同步,每秒记入日志一次,如果宕机,本秒的数据可能丢失。

appendfsync no

redis不主动进行同步,把同步时机交给操作系统。

Rewrite压缩

是什么

AOF采用文件追加方式,文件会越来越大为避免出现此种情况

新增了重写机制, 当AOF文件的大小超过所设定的阈值时

Redis就会启动AOF文件的内容压缩, 只保留可以恢复数据的最小指令集.可以使用命令bgrewriteaof

重写压缩操作

AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename),redis4.0版本后的重写,是指上就是把rdb 的快照,以二级制的形式附在新的aof头部,作为已有的历史数据,替换掉原来的流水账操作。

在这里插入图片描述

no-appendfsync-on-rewrite:
  1. 如果 no-appendfsync-on-rewrite=yes ,不写入aof文件只写入缓存,用户请求不会阻塞,但是在这段时间如果宕机会丢失这段时间的缓存数据。(降低数据安全性,提高性能)
  2. 如果 no-appendfsync-on-rewrite=no, 还是会把数据往磁盘里刷,但是遇到重写操作,可能会发生阻塞。(数据安全,但是性能降低)
触发机制

Redis会记录上次重写时的AOF大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发

重写虽然可以节约大量磁盘空间,减少恢复时间。但是每次重写还是有一定的负担的,因此设定Redis要满足一定条件才会进行重写。

auto-aof-rewrite-percentage:设置重写的基准值,文件达到100%时开始重写(文件是原来重写后文件的2倍时触发)

auto-aof-rewrite-min-size:设置重写的基准值,最小文件64MB。达到这个值开始重写。

例如:文件达到70MB开始重写,降到50MB,下次什么时候开始重写?100MB

系统载入时或者上次重写完毕时,Redis会记录此时AOF大小,设为base_size,

如果Redis的AOF当前大小>= base_size +base_size*100% (默认)且当前大小>=64mb(默认)的情况下,Redis会对AOF进行重写。

重写流程

(1)bgrewriteaof触发重写,判断是否当前有bgsave或bgrewriteaof在运行,如果有,则等待该命令结束后再继续执行。

(2)主进程fork出子进程执行重写操作,保证主进程不会阻塞。

(3)子进程遍历redis内存中数据到临时文件,客户端的写请求同时写入aof_buf缓冲区和aof_rewrite_buf重写缓冲区保证原AOF文件完整以及新AOF文件生成期间的新的数据修改动作不会丢失。

(4)1).子进程写完新的AOF文件后,向主进程发信号,父进程更新统计信息。2).主进程把aof_rewrite_buf中的数据写入到新的AOF文件。

(5)使用新的AOF文件覆盖旧的AOF文件,完成AOF重写。

在这里插入图片描述

小结

在这里插入图片描述

优势

  1. 备份机制更稳健,丢失数据概率更低。
  2. 可读的日志文本,通过操作AOF稳健,可以处理误操作。

劣势

  1. 比起RDB占用更多的磁盘空间。
  2. 恢复备份速度要慢。
  3. 每次读写都同步的话,有一定的性能压力。
  4. 存在个别Bug,造成恢复不能。

RDB和AOF对比

官方推荐两个都启用。

如果对数据不敏感,可以选单独用RDB。

不建议单独用 AOF,因为可能会出现Bug。

如果只是做纯内存缓存,可以都不用。

l RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储

l AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾.

l Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大

l 只做缓存:如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式.

l 同时开启两种持久化方式

l 在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据, 因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整.

l RDB的数据不实时,同时使用两者时服务器重启也只会找AOF文件。那要不要只使用AOF呢?

l 建议不要,因为RDB更适合用于备份数据库(AOF在不断变化不好备份), 快速重启,而且不会有AOF可能潜在的bug,留着作为一个万一的手段。

l 性能建议

因为RDB文件只用作后备用途,建议只在Slave上持久化RDB文件,而且只要15分钟备份一次就够了,只保留save 900 1这条规则。 如果使用AOF,好处是在最恶劣情况下也只会丢失不超过两秒数据,启动脚本较简单只load自己的AOF文件就可以了。 代价,一是带来了持续的IO,二是AOF rewrite的最后将rewrite过程中产生的新数据写到新文件造成的阻塞几乎是不可避免的。 只要硬盘许可,应该尽量减少AOF rewrite的频率,AOF重写的基础大小默认值64M太小了,可以设到5G以上。 默认超过原大小100%大小时重写可以改到适当的数值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值