Redis 两种持久化

1.总体介绍

Redis 中提供了两种不同形式持久化,分别为:

  • RDB(Redis DataBase)
  • AOF(Append of file)

备注: Redis中,RDB是默认开启的.

2. RDB 持久化

2.1 RDB是什么?

在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是 snapshot 快照,她恢复是将快照文件直接读取到内存中.

2.2 RDB 持久化流程?

Redis 会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,在用这个临时文件替换上次持久化好的文件(dump.rdb).
整个过程中,主进程是不进行任何IO操作的,确保了极高的性能.
如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那 RDB 方式要比 AOF 方式更加的高效.RDB的缺点是最后一次持久化后的数据可能丢失.

RDB 持久化流程:
在这里插入图片描述
Fork 是什么?

  • Fork 的作用是复制一个与当前进程一样的进程.新进程的所有数据(变量/环境变量/程序计数器等)数值和原进程一致,但是是一个全新的进程,并作为原进程的子进程
  • 在 Linux 程序中,fork() 会产生一个和父进程完全相同的子进程,但子进程在此后多会 exec 系统调用,出于效率考虑,Linux中引入了"写时复制技术"
  • 一般情况父进程和子进程会公用一段物理内存,只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程.

2.3 dump.rdb 文件

在 redis.conf 中配置文件名称,默认为 dump.rdb
在这里插入图片描述
dump.rdb 文件保存路径,也可以修改.默认为 Redis 启动时命令行所在的目录下:
在这里插入图片描述

2.4 如何触发 RDB 快照

1.shutdown 或者 Redis 进行 kill掉;
2.save 或者 bgsave
save: save 时只管保存,其他不管,全部阻塞.手动保存,不建议.
bgsave: redis 会在后台异步进行快照操作,快照同时还可以响应客户端请求.
可以通过 lastsave 命令获取最后一次成功执行快照的时间.

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

2.5 rdb 的恢复?

  • 关闭 Redis
  • 先把备份分文件拷贝到工作目录下 cp dump.rdb dump.rdb
  • 启动 Redis,备份数据会直接加载

2.6 RDB 的优势和劣势

优势:

  • 适合大规模的数据恢复
  • 对数据完整性和一致性要求不高更适合使用
  • 节省磁盘空间
  • 恢复速度快,与 AOF 相比.
    在这里插入图片描述

劣势:

  • Fork 的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑
  • 虽然 Redis 在fork时使用了写时拷贝技术,但是如果数据庞大是还是比较消耗性能
  • 在备份周期在一定间隔时间做一次备份,所以如果 Redis 意外 down 掉的话,就会丢失最后一次快照后的修改

3.AOF 持久化

3.1 AOF 持久化是什么

以日志的形式来记录每个写操作(增量保存),将 Redis 执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件, Redis 启动之初会读取该文件重新构建数据,换言之,Redis 重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作.

3.2 AOF 持久化流程

1.客户端的请求写命令会被 append 追加到 AOF 缓冲区内;
2.AOF 缓冲区根据 AOF 持久化策略[always,everysec,no]将操作 sync 同步到磁盘的 AOF 文件中;
3.AOF 文件大小超过重写策略或手动重写时,会对 AOF 文件 rewrite 重写,压缩 AOF 文件容量;
4.Redis 服务重启时,会重新 load 加载 AOF 文件中的写操作达到数据恢复的目的.
在这里插入图片描述

3.3 appendonly.aof 文件

  1. 可以在 redis.conf 中配置文件名称,默认为 appendonly.aof,AOF 文件的保存路径,同RDB的路径一致.

3.4 AOF 和 RDB 同时开启, Redis 听谁的

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

3.5 AOF 启动/恢复/修复

  • AOF 的备份机制和性能虽然和RDB不同,但是备份和恢复的操作同RDB一样,都是拷贝备份文件,需要恢复时再拷贝到Redis工作目录下,启动系统即加载.
  • 正常恢复
    修改默认的 appendonly on ,改为yes
    将有数据的 aof 文件复制一份到对应目录(查看目录:config get dir)
    恢复:重启Redis,然后重新加载
  • 异常恢复
    修改默认的appendonly no,改为yes
    如遇到AOF文件损坏,通过/usr/local/bin/redis-check-aof–fix appendonly.aof进行恢复
    备份被写坏的AOF文件
    恢复:重启redis,然后重新加载

3.6 AOF 同步频率设置

  • appendfsync always
    始终同步,每次Redis写入都会立刻计入日志,性能较差但数据完整性比较好
  • appendfsync everysec
    每秒同步,每秒记入一次,如果宕机,本秒的数据可能丢失.
    appendfsync no
    Redis 不主动进行同步,把同步时机交给操作系统.

3.7 Rewrite 压缩

1. rewrite 压缩是什么

AOF 采用文件追加方式,文件会越来越大为避免这种情况,新增了重写机制,当 AOF 文件的大小超过所设定的阀值时,Redis 就会启动 AOF 文件的内容压缩,只保留可以恢复数据的最小指令集,可以使用命令bgrewriteaof

2.重写原理,如何实现重写

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

no-appendfsync-on-rewrite:
如果 no-appendfsync-on-rewrite=yes ,不写入aof文件只写入缓存,用户请求不会阻塞,但是在这段时间如果宕机会丢失这段时间的缓存数据。(降低数据安全性,提高性能)

如果 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)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重写。
在这里插入图片描述

3.8 优势和劣势

在这里插入图片描述
优势:

  • 备份机制更稳健,丢失数据概率更低.
  • 可读的日志文本,通过操作 AOF 稳健,可以处理误操作
    劣势:
  • 比起 RDB 占用更多的磁盘空间
  • 恢复备份速度要慢
  • 每次读写都同步的话,有一定的性能压力
  • 存在个别bug,造成恢复不能

4. 总结

官方推荐两个都启用.
如果对数据不敏感,可以单独用 RDB
不建议单独用 AOF,因为可能会出现 BUG
如果只是做纯内存缓存,可以都不用.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值