redis快照(持久化)

一.前言

Redis 是内存数据库,如果不将内存中的数据库状态保存到磁盘,那么一旦服务器进程退出,服务器中 的数据库状态也会消失。所以 Redis 提供了持久化功能!

在redis.conf中,有如图所示配置:

1.表示60s内,如果至少5key进行了修改,我们将进行持久化操作

2.持久化过程中如果出错,是否继续工作

3.是否压缩.rdb文件,需要消耗cpu资源

4.保存rdb文件时候是否进行错误校验

5.rdb文件名称

6.rdb文件目录

7.aof模式是否打开

8.持久化文件的名字

9.同步频率

    always:每秒都会sync,消耗性能

    everysec:每秒执行一次sync,可能会丢失这一秒的数据

    no:不执行sync,操作系统会自动同步数据,速度最快

10.设备能连接上redis的最大客户端数量

11.redis配置的最大内存容量

12.内存达到上限之后的处理策略 noeviction 永不过期,返回错误

二.RDB

1.定义:Redis DataBase,RDB其实就是把数据以快照的形式保存在磁盘上,回复时将快照文件直接读取到内存里。

2.工作机制流程

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

3.触发机制

  • 满足save规则
  • 执行flushall命令
  • 退出redis

4.如何恢复rdb文件

只需要将rdb文件放在我们redis启动目录就可以,redis启动的时候会自动加载dump.rdb的数据到内存来恢复

5.优缺点

优点:

  1. 最后一次快照会丢失,对数据完整性要求不高
  2.  适合大规模的数据恢复

缺点

    1、需要一定的时间间隔进程操作,若redis意外宕机了则最后一次修改数据丢失

    2、fork进程的时候,会占用一定的内存空间

三.AOF

1.定义:AOF(Append only file)Redis 默认不开启。它的出现是为了弥补RDB的不足(数据的不一致性),所以它采用日志的形式来记录每个写操作,并追加到文件中。Redis 重启的会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。

2.如果这个 aof 文件有错误,redis启动失败,我们需要修复这个aof文件 redis 给我们提供了一个工具 redis-check-aof --fix,通过命令:redis-check-aof --fix appendonly.aof 来修复

 

3.配置参数

no-appendfsync-on-rewrite:表示在日志重写时,不进行命令追加操作,而只是将其放在缓冲区里,避免与命令的追加造成DISK IO上的冲突。

auto-aof-rewrite-percentage:aof文件增长比例,指当前aof文件比上次重写的增长比例大小。aof重写即在aof文件在一定大小之后,重新将整个内存写到aof文件当中,以反映最新的状态(相当于bgsave)。这样就避免了,aof文件过大而实际内存数据小的问题(频繁修改数据问题).

auto-aof-rewrite-min-size:aof文件重写最小的文件大小,即最开始aof文件必须要达到这个文件时才触发,后面的每次重写就不会根据这个变量了(根据上一次重写完成之后的大小).此变量仅初始化启动redis有效.如果是redis恢复时,则lastSize等于初始aof文件大小.(默认64M太小,可调整为3G)

4.优缺点

优点:

1、数据完整性高(每一次修改都同步) 

2、每秒同步一次,可能会丢失一秒的数据

3、从不同步,而是追加,效率高

缺点:

1、aof远远大于 rdb,修复的速度比 rdb慢

2、Aof 运行效率也要比 rdb 慢

三.扩展

  1. RDB 持久化方式能够在指定的时间间隔内对你的数据进行快照存储
  2. AOF 持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始 的数据,AOF命令以Redis 协议追加保存每次写的操作到文件末尾,Redis还能对AOF文件进行后台重 写,使得AOF文件的体积不至于过大。
  3. 只做缓存,如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化
  4. 同时开启两种持久化方式 在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF 文件保存的数据集要比RDB文件保存的数据集要完整。 RDB 的数据不实时,同时使用两者时服务器重启也只会找AOF文件,那要不要只使用AOF呢?作者 建议不要,因为RDB更适合用于备份数据库(AOF在不断变化不好备份),快速重启,而且不会有 AOF可能潜在的Bug,留着作为一个万一的手段。
  5. 性能建议
  • 因为RDB文件只用作后备用途,建议只在Slave上持久化RDB文件,而且只要15分钟备份一次就够 了,只保留 save 900 1 这条规则。
  • 如果Enable AOF ,好处是在最恶劣情况下也只会丢失不超过两秒数据,启动脚本较简单只load自 己的AOF文件就可以了,代价一是带来了持续的IO,二是AOF rewrite 的最后将 rewrite 过程中产 生的新数据写到新文件造成的阻塞几乎是不可避免的。只要硬盘许可,应该尽量减少AOF rewrite 的频率,AOF重写的基础大小默认值64M太小了,可以设到5G以上,默认超过原大小100%大小重 写可以改到适当的数值。
  • 如果不Enable AOF ,仅靠 Master-Slave Repllcation 实现高可用性也可以,能省掉一大笔IO,也 减少了rewrite时带来的系统波动。代价是如果Master/Slave 同时倒掉,会丢失十几分钟的数据, 启动脚本也要比较两个 Master/Slave 中的 RDB文件,载入较新的那个,微博就是这种架构。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值