深入Redis中的AOF和RDB

Redis中提供了两种数据持久化方式,分别是AOF和RDB

1.RDB

RDB存盘有三种触发方式

  • save: 前台阻塞,redis不对外提供服务,一般使用场景:关机维护

  • bgsave: 前台不阻塞,redis继续对外提供服务,fork创建子进程写

    fork是Linux系统中的一个api

    父子进程是数据隔离的,父子进程对数据的修改是不会影响对方的,在将数据开始写入磁盘时,会copy一个子进程,fork数据的指针而不是数据本身,所以创建速度快,也比较省内存,然后进行写入,此时父进程中的数据被修改了不会影响到写入进程,保证写入磁盘数据的时点正确!时此就能保证redis在备份数据的同时提供服务。

    fork时不会直接去复制数据,而是有一个copy on write的内核机制,即写入时复制,比如主进程数据修改了,才会将被修改的这份数据复制过来,这样能保证创建进程速度变快

    深入Redis中的AOF和RDB_第1张图片

    copyonwrite优点

    • 减少分配和复制大量资源时带来的瞬间延时
    • 减少不必要的资源分配。比如fork进程时,并不是所有的页面都需要复制,父进程的代码段和只读数据段都不被允许修改,所以无需复制

    copyonwrite缺点

    • 如果在fork()之后,父子进程都还需要继续进行写操作,那么会产生大量的分页错误(页异常中断page-fault)。但是在Redis中,fork的子进程写完RDB后会关闭,所以不会有这个问题
  • 配置文件修改bgsave的规则,这里需要注意的是,参数使用的是save标识,但实际触发的是bgsave,以下三个条件满足任意一个都会触发bgsave

    save   
    save 300 10:超过60秒不满足1000次修改时会进入判断,达到300秒或满足10次修改会触发bgsave
    save 60 10000:达到60秒或10000次以上修改则会触发
    

    RDB有如下弊端

    • 不支持拉链,即只有一个dump.rdb文件
    • 丢失数据相对较多,因为不是实时记录数据,时点与时点之间窗口数据容易丢失
    • 持久化相对慢,因为每次都是全量的

    RDB优势

    • rdb文件都是二进制文件,所以文件相对小,恢复速度快
    • 处理效率(非持久化效率)相对aof来说要高,aof在执行命令后会有存盘操作 

2.AOF

AOP开启后,Redis写操作时会触发IO,先把数据写入内核buffer空间,然后再flush到磁盘,频率一共有三种配置

appendfsync always:每一条写的指令都会flush一下内核中的buffer空间,写入磁盘,效率最低但数据完整性最高,除非极端情况在flush时系统断电或异常关闭才会丢失一条数据
appendfsync everysec:每秒会触发一次flush刷buff空间,效率居中,数据丢失取决于这1秒刷新前系统异常关闭时buffer区有多少数据
appendfsync no:不推flush刷新buffer空间,数据満buffer区后内核自动flush,数据丢失是整个buffer区间

AOF优点

  • 丢失数据少
  • RDB和AOF可以同时开启,如果开启了AOF,则恢复的时候只会使用AOF恢复,在redis4.0以后AOF中包含RDB全量,增量记录新的写操作

AOF弊端

  • 体量会无限制变大,恢复会变慢

    为了避免AOF文件过大,需要进行rewrite来重整aof文件

    rewrite机制:aof里存放了所有的redis 操作指令,当aof文件达到一定条件或者手动 bgrewriteaof命令都可以触发rewrite,rewrite之后aof文件会保存keys的最后的状态,清除掉之前冗余的,来缩小这个文件。

    rewrite原理:fork出一个子进程进行rewrite,而父进程继续接受命令,现在的写操作命令都会被额外添加到一个aof_rewrite_buf_blocks缓冲中,当子进程rewrite结束后,父进程收到子进程结束信号,把aof_rewrite_buf_blocks的缓冲写入rewrite后的新文件中,然后切换AOF中的文件fd,即完成了一次rewrite

    rewrite自动触发配置

    # redis会记录上次写入后的大小,增长比例超过之前的100%,然后对比min-size,达到这个数值就会进行一次review
    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb
    

    Redis4.0以后AOF文件中会带有一个文件头,文件头格式和RDB文件头相同,目的是支持同时加载RDB格式和AOF格式数据。在Redis4.0之后的版本,如果开启 aof-use-rdb-preamble,则AOF文件由三个部分组成 (注:该配置在5.0以后都是默认开启的)

    • 文件头(和RDB文件头格式相同)
    • RDB格式的二进制数据段
    • AOF格式的文本数据段

    此时的AOF是一个混合文件,同时拥有RDB的恢复速度和AOF的数据完整性优势

你可能感兴趣的:(redis,数据库,缓存)