Redis的RDB和AOF持久化

Redis的RDB和AOF持久化

1.Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。(摘抄百度百科)
2.redis的持久化有两种方式第一种rdb、另一种aof,rdb是生成快照,aof是追加操作命令,两种类型的持久化方式。

一、Redis的RDB持久化

  1. RDB持久化模式,阻塞(save)和非阻塞(bgsave)
    阻塞:save执行该指令时,阻塞当前redis服务器,执行 save 指令期间,redis不能处理其他命令,直到RDB过程完成为止。
    非阻塞:bgsave执行该命令时,redis会在后台异步执行快照操作,此时redis仍然可以响应客户端请求。
  2. RDB持久化触发条件,手动触发(save)和自动触发(bgsave)
    手动触发:这种方式会阻塞redis服务。
    自动触发:这种方式不会阻塞redis服务。
    默认是开启RDB持久化方式,在redis配置文件中配置如下。
    save 900 1 # 表示900 秒内如果至少有 1 个 key 的值变化,则触发RDB
    save 300 10 # 表示300 秒内如果至少有 10 个 key 的值变化,则触发RDB
    save 60 10000 # 表示60 秒内如果至少有 10000 个 key 的值变化,则触发RDB
  3. RDB持久化优缺点
    优点:RDB文件占用小,非常适合定时备份,用于灾难恢复,RDB恢复时候是加载RDB文件即可恢复。
    缺点:服务器故障时丢失的数据无法找回,其次fork子进程期间发生阻塞,但是一般时间都很短,如果Redis数据量特别 大,fork子进程时间就会变长,而且占用内存会加倍。
  4. RDB恢复数据:redis服务重启时候会加载RDB文件进行恢复操作。
  5. RDB格式:是二进制数据段。
  6. redis的RDB具体持久操作流程是,redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后会对原文件进行覆盖,并且通知父进程已经同步成功。
    redis持久化rdb流程图

二、Redis的AOF持久化

  1. AOF持久化模式,非阻塞
    非阻塞:AOF持久化时,redis会在后台异步执行追加命令操作,此时redis仍然可以响应客户端请求。
  2. AOF持久化触发条件,自动触发
    自动触发:这种方式不会阻塞redis服务。
    默认是关闭AOF持久化方式,在redis配置文件中配置如下。
    appendonly yes #开启AOF持久化
    appendfsync everysec #属性可以指定刷盘策略默认是everysec,也可以指定下面参数
    always:表示每一个命令都同步缓存区的数据到AOF文件中,效率差但是安全,只会在服务故障时候丢失一个命令数据。
    everysec:表示每一秒同步缓存区的数据到AOF文件中,效率快,只会在服务故障时候丢失一秒数据。
    no:表示由操作系统控制同步缓存区的数据到AOF文件中,速度快,但是间隔时间长,服务故障时候丢失较多数据。
    总之刷盘频率快,则读写效率下降,但是安全性高,发生宕机丢失数据较少。
  3. AOF恢复数据:redis服务重启时候会创建一个伪客户端读取AOF文件,分析每一条命令执行后则恢复数据。
  4. AOF重写:AOF重写会进行大量的写入操作,将被长时间阻塞,所以redis会创建一个子进程执行AOF重写操作,子进程进行AOF重写期间redis主进程还可以继续处理其他命令操作,子进程会将内存数据拷贝一份,保证数据安全,但是在子进程重写期间redis接收的命令会对现有的数据进行修改操作,从而导致当前的数据和重写后的AOF文件中的数据不一致,为解决数据不一致问题redis设置一个AOF重写缓冲区,这个缓存区在redis在fork子进程之后开始使用,当redis执行完一个命令之后,它会写入AOF缓冲区同时也会写入AOF重写缓冲区,当子进程完成AOF工作后,会通知父进程AOF重写完毕。
    父进程将会处理下面操作
    1.AOF重写缓冲区中的所有数据写入到新的AOF文件中,保证AOF文件数据是最新和当前AOF缓冲区保持一致。
    2.会对新的AOF文件修改名字,新的AOF文件替换旧的AOF文件。
  5. AOF重写触发条件,手动触发和自动触发
    手动触发:直接调用bgrewriteaof命令。
    自动触发:根据auto-aof-rewrite-min-size和auto-aof-rewrite-percentage参数确定自动触发时机。
    在redis配置文件中配置如下
    auto-aof-rewrite-min-size:表示运行AOF重写时文件最小体积,默认为64MB。
    auto-aof-rewrite-percentage:表示当前AOF文件空间和上一次重写后AOF文件空间的比值。
    假设一下:
    auto-aof-rewrite-min-size:1MB
    auto-aof-rewrite-percentage:100
    理论是下面这样,以此类推:
    当AOF文件第一次到1M时候,触发重写策略
    当AOF文件第一次到2M时候,触发重写策略
    当AOF文件第一次到4M时候,触发重写策略
    实际是下面这样。以此类推:
    当AOF文件第一次到1M时候,触发重写策略
    当AOF文件第一次到1.6M时候,触发重写策略
    为什么会这样,思考中。。。。。。
    其实因为重写的目地就是以通过合并命令的方式减少文件大小,到1M时候触发重写,重写后必然大小是小于1M的
    按照这个思路推算:
    第一次AOF文件大小1M触发重写,重写后大小变为0.8M
    第二次AOF文件大小1.6M触发重写,重写后大小变为2.8M
    6.AOF优缺点
    优点:AOF更好的保证数据不丢失,everysec一秒一次刷盘,文件使用append-only模式追加命令,
    节省硬盘开销,性能高,AOF重写机制会压缩文件,同时重写期间也不影响其他操作,适合做灾难性误删操作恢复
    如果有人执行flusall命令,清空全部数据操作,只要没有触发重写操作和RDB操作,可以立即备份AOF文件,将最后一条 flusall命令删除,替换旧的AOF文件实现灾难性误删操作恢复。
    缺点:AOF持久化相对于RDB持久化文件更大,恢复数据慢。
  6. AOF恢复数据:redis服务重启时候会创建一个伪客户端读取AOF文件,分析每一条命令执行后则恢复数据。
    8.AOF格式:是文本数据段。
    9.redis的AOF具体持久化操作流程是,所有的写命令会追加到AOF缓存区,AOF会根据配置文件中的策略进行刷盘操作,
    随着AOF文件越来越大,需要进行对AOF文件进行重写,达到压缩文件的目的,AOF文件其实内容是命令每个命令都会追加到AOF文件。
    redis持久化AOF流程图

三、RDB和AOF对比

RDBAOF
体积:小体积:大
恢复速度:快恢复速度:慢
数据安全性:丢数据数据安全性:根据策略决定

四、RDB和AOF选择

1.不要单独使用RDB,因为会导致丢失很多数据(系统能够容忍除外)
2.不要仅仅使用AOF,因为那样有两个问题
(1)没有RDB备份数据效率好,RDB可以避免AOF这种复杂的备份。
(2)没有RDB恢复数据速度快,RDB可以避免AOF这种复杂的恢复。
3.综合使用AOF和RDB两种持久化机制,用AOF来保证数据不丢失,作为数据恢复数据的第一选择,用RDB来做不同程度的备份,在AOF文件丢失或损坏不可用的时候,还可以使用RDB来进行快速的数据恢复。RDB你会丢失很多数据时候,AOF数据恢复没RDB来的快,真的redis服务不可用恢复的第一时间用RDB恢复,然后AOF做数据补全,其实说这么说最终还是要看业务而定。

五、RDB和AOF之间的相互作用

1.bgsave执行的过程中,不可以执行bgrewriteaof,反之,在bgrewriteaof执行的过程中,也不可以执行bgsave,这样可以防止两个后台进程同时对磁盘进行大量的I/O操作。
假设如果bgsave正在执行,并且用户调用bgrewriteaof命令, 那么redis服务器将会向用户返回一个OK状态, 并告知客户端,bgrewriteaof已经被预定执行,一旦bgsave执行完毕, bgrewriteaof就会正式开始。

2.当redis启动时,如果RDB持久化和AOF持久化都被打开了,那么程序会优先使用AOF文件来恢复数据, 因为AOF文件所保存的数据通常是最完整的。

欢迎大家关注公众号

一个故事开始的地方

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值